From 453bf8e44015894e2e2bd66d89217e67977d53bd Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Mon, 4 Mar 2019 17:45:46 +0100 Subject: [PATCH] fix: file logger --- pkg/logger/file_logger.go | 163 +++++++++++++++++++++++--------------- pkg/logger/logger.go | 4 + 2 files changed, 103 insertions(+), 64 deletions(-) diff --git a/pkg/logger/file_logger.go b/pkg/logger/file_logger.go index 8704f9e..8accb4c 100644 --- a/pkg/logger/file_logger.go +++ b/pkg/logger/file_logger.go @@ -6,8 +6,8 @@ import ( "io" "io/ioutil" "os" - "path/filepath" "sync" + "time" "git.cryptic.systems/fh-trier/go-flucky/pkg/internal/errutils" @@ -23,6 +23,84 @@ func (fl *FileLogger) AddLogFile(logfile string, logValue LogValue) { fl.LogFiles[logValue] = append(fl.LogFiles[logValue], logfile) } +func (fl *FileLogger) GetHumidities(fromDate *time.Time, tillDate *time.Time, sensorNameOrUUID *[]string) ([]*types.Humidity, error) { + return nil, nil +} +func (fl *FileLogger) GetTemperatures(from *time.Time, till *time.Time, sensorIDs []string) ([]*types.Temperature, error) { + cachedTemperatures := []*types.Temperature{} + + // iterate over all configured temperature logfiles + for _, logfile := range fl.LogFiles[LogTemperature] { + + // skip logfile if not exists + if _, err := os.Stat(logfile); os.IsNotExist(err) { + return nil, fmt.Errorf("Logfile %v not exists", logfile) + } + + loggedTemperatures := []*types.Temperature{} + + f, err := os.Open(logfile) + if err != nil { + return nil, fmt.Errorf("Can not open %v: %v", logfile, err) + } + defer f.Close() + + decoder := json.NewDecoder(f) + err = decoder.Decode(&loggedTemperatures) + if err != nil { + return nil, fmt.Errorf("Can not decode temperatures from logfile %v: %v", logfile, err) + } + + // sort all redundant values out + for _, loggedTemperature := range loggedTemperatures { + found := false + for _, cachedTemperature := range cachedTemperatures { + if cachedTemperature.TemperatureID == loggedTemperature.TemperatureID { + found = true + break + } + } + if !found { + cachedTemperatures = append(cachedTemperatures, loggedTemperature) + } + } + } + + // // sort out all temperatures which are not mesured by sensor id + // for i, cachedTemperature := range cachedTemperatures { + // found := false + // for _, sensorID := range sensorIDs { + // if cachedTemperature.SensorID == sensorID { + // found = true + // break + // } + // } + // if !found { + // cachedTemperatures = append(cachedTemperatures[:i], cachedTemperatures[i+1:]...) + // } + // } + + // // sort out all temperatures which are before from date + // if from != nil { + // for i, cachedTemperature := range cachedTemperatures { + // if cachedTemperature.TemperatureDate.Before(*from) { + // cachedTemperatures = append(cachedTemperatures[:i], cachedTemperatures[i+1:]...) + // } + // } + // } + + // // sort out all temperatures which are after till date + // if till != nil { + // for i, cachedTemperature := range cachedTemperatures { + // if cachedTemperature.TemperatureDate.After(*till) { + // cachedTemperatures = append(cachedTemperatures[:i], cachedTemperatures[i+1:]...) + // } + // } + // } + + return cachedTemperatures, nil +} + func (fl *FileLogger) LogHumidities(humidities []*types.Humidity) error { countLogfiles := len(fl.LogFiles[LogHumidity]) wg := sync.WaitGroup{} @@ -76,79 +154,36 @@ func (fl *FileLogger) LogHumidities(humidities []*types.Humidity) error { } func (fl *FileLogger) LogTemperatures(temperatures []*types.Temperature) error { - countLogfiles := len(fl.LogFiles[LogTemperature]) - wg := sync.WaitGroup{} - wg.Add(countLogfiles) - - errChan := make(chan error) - for _, logfile := range fl.LogFiles[LogTemperature] { - go func(temps []*types.Temperature, lf string) { - defer wg.Done() - if _, err := os.Stat(lf); os.IsNotExist(err) { - err := os.MkdirAll(filepath.Dir(lf), os.ModeDir) - if err != nil { - errChan <- fmt.Errorf("Can not create directory: %v", err) - return - } - f, err := os.Create(lf) - if err != nil { - errChan <- fmt.Errorf("Can not create log file: %v", err) - return - } - f.Close() - } + logTemperatures := []*types.Temperature{} - // open logfile - f, err := os.Open(lf) - if err != nil { - errChan <- err - return - } + // open logfile + f, err := os.OpenFile(logfile, os.O_RDWR, os.ModePerm) + if err != nil { + return fmt.Errorf("Can not open file %v: %v", logfile, err) + } + defer f.Close() - // decode file content into temperatures - logTemperatures := []*types.Temperature{} + // if logfile already exists, read temperatures from logfile + if _, err := os.Stat(logfile); os.IsExist(err) { decoder := json.NewDecoder(f) err = decoder.Decode(&logTemperatures) if err != nil { - errChan <- err - return + return fmt.Errorf("Can not decode temperatures from reader") } + } - // close file - f.Close() + // append new temperatures with exsisting humidities from logfile + logTemperatures = append(logTemperatures, temperatures...) - // append new humidities with exsisting humidities from logfile - logTemperatures = append(logTemperatures, temps...) - - // create new logfile - f, err = os.Create(lf) - if err != nil { - errChan <- err - return - } - - // convert humidities into json file - encoder := json.NewEncoder(f) - encoder.SetIndent("", " ") - err = encoder.Encode(logTemperatures) - if err != nil { - errChan <- err - return - } - - f.Close() - - }(temperatures, logfile) - } - - wg.Wait() - - errList := errutils.CollectErrors(errChan) - err := errutils.FormatErrors(errList) - if err != nil { - return err + // encode temperatures + encoder := json.NewEncoder(f) + encoder.SetIndent("", " ") + err = encoder.Encode(logTemperatures) + if err != nil { + return fmt.Errorf("Can not encode temperatures for the writer") + } } return nil diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index f9fc484..19d5bc3 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,10 +1,14 @@ package logger import ( + "time" + "git.cryptic.systems/fh-trier/go-flucky/pkg/types" ) type Logger interface { + GetHumidities(fromDate *time.Time, tillDate *time.Time, sensorNameOrUUID *[]string) ([]*types.Humidity, error) + GetTemperatures(fromDate *time.Time, tillDate *time.Time, sensorNameOrUUID *[]string) ([]*types.Temperature, error) LogHumidities(humidities []*types.Humidity) error LogTemperatures(temperatures []*types.Temperature) error }