79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
// Copyright (c) Mainflux
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package db
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/mainflux/mainflux/pkg/errors"
|
|
)
|
|
|
|
const columns = 2
|
|
const path = "/store/nodes.csv"
|
|
|
|
var (
|
|
errNotFound = errors.New("file not found")
|
|
errWriteFile = errors.New("failed de write file")
|
|
errOpenFile = errors.New("failed to open file")
|
|
errReadFile = errors.New("failed to read file")
|
|
errEmptyLine = errors.New("empty or incomplete line found in file")
|
|
)
|
|
|
|
// Node represents an OPC-UA node
|
|
type Node struct {
|
|
ServerURI string
|
|
NodeID string
|
|
}
|
|
|
|
// Save stores a successful subscription
|
|
func Save(serverURI, nodeID string) error {
|
|
file, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm)
|
|
if err != nil {
|
|
return errors.Wrap(errWriteFile, err)
|
|
}
|
|
csvWriter := csv.NewWriter(file)
|
|
err = csvWriter.Write([]string{serverURI, nodeID})
|
|
csvWriter.Flush()
|
|
if err != nil {
|
|
return errors.Wrap(errWriteFile, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ReadAll returns all stored subscriptions
|
|
func ReadAll() ([]Node, error) {
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
return nil, errors.Wrap(errNotFound, err)
|
|
}
|
|
|
|
file, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm)
|
|
if err != nil {
|
|
return nil, errors.Wrap(errOpenFile, err)
|
|
}
|
|
defer file.Close()
|
|
|
|
reader := csv.NewReader(file)
|
|
nodes := []Node{}
|
|
for {
|
|
l, err := reader.Read()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
return nil, errors.Wrap(errReadFile, err)
|
|
}
|
|
|
|
if len(l) < columns {
|
|
return nil, errEmptyLine
|
|
}
|
|
|
|
nodes = append(nodes, Node{l[0], l[1]})
|
|
}
|
|
|
|
return nodes, nil
|
|
}
|