121 lines
2.7 KiB
Go
121 lines
2.7 KiB
Go
package dbm
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/tecamino/tecamino-dbm/args"
|
|
"github.com/tecamino/tecamino-dbm/models"
|
|
serverModels "github.com/tecamino/tecamino-dbm/server/models"
|
|
"github.com/tecamino/tecamino-logger/logging"
|
|
)
|
|
|
|
type DBMHandler struct {
|
|
DBM *models.DBM
|
|
Conns *serverModels.Connections
|
|
sync.RWMutex
|
|
Log *logging.Logger
|
|
arg *args.Args
|
|
filePath string
|
|
}
|
|
|
|
// initialze new Database Manager
|
|
// it will call cli arguments
|
|
func NewDbmHandler(a *args.Args) (*DBMHandler, error) {
|
|
|
|
//initialize new logger
|
|
logger, err := logging.NewLogger("dbmServer.log", &logging.Config{
|
|
MaxSize: 1,
|
|
MaxBackup: 3,
|
|
MaxAge: 28,
|
|
Debug: a.Debug,
|
|
TerminalOut: true,
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
logger.Info("main", "start dma handler")
|
|
|
|
//initialize connection map
|
|
conns := serverModels.NewConnections()
|
|
|
|
// Initialize dtabase manager handler
|
|
dmaHandler := DBMHandler{
|
|
arg: a,
|
|
filePath: fmt.Sprintf("%s/%s.dbm", a.RootDir, a.DBMFile),
|
|
DBM: models.NewDBM(conns, logger),
|
|
Log: logger,
|
|
Conns: conns,
|
|
}
|
|
|
|
// initialize system datapoint and periodically update it
|
|
if err := dmaHandler.AddSystemDps(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// check if dtabase file exists to load data
|
|
s := time.Now()
|
|
if _, err := os.Stat(dmaHandler.filePath); err == nil {
|
|
|
|
f, err := os.Open(dmaHandler.filePath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
// read in dtaabase file content
|
|
scanner := bufio.NewScanner(f)
|
|
var line int
|
|
for scanner.Scan() {
|
|
line++
|
|
dp := models.Datapoint{}
|
|
if err = json.Unmarshal(scanner.Bytes(), &dp); err != nil {
|
|
dmaHandler.Log.Error("dmbHandler.NewDmbHandler", "error in line "+fmt.Sprint(line)+" "+scanner.Text())
|
|
dmaHandler.Log.Error("dmbHandler.NewDmbHandler", err.Error())
|
|
|
|
return nil, err
|
|
}
|
|
dmaHandler.DBM.ImportDatapoints(dp)
|
|
}
|
|
}
|
|
dmaHandler.Log.Info("dmbHandler.NewDmbHandler", fmt.Sprintf("%d datapoint imported in %v", dmaHandler.DBM.GetNumbersOfDatapoints(), time.Since(s)))
|
|
return &dmaHandler, nil
|
|
}
|
|
|
|
func (d *DBMHandler) SaveDb() (err error) {
|
|
f, err := os.OpenFile(d.filePath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
for _, dp := range d.DBM.GetAllDatapoints(0) {
|
|
//exclude System datapoints from saving
|
|
//System datapoints are used for internal purposes and should not be saved in the database
|
|
if strings.Contains(dp.Path, "System:") {
|
|
continue
|
|
}
|
|
|
|
b, er := json.Marshal(dp)
|
|
if er != nil {
|
|
return er
|
|
}
|
|
|
|
_, err = f.Write(b)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = f.Write([]byte("\n"))
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|