feat: import from sqlite or postgresql
This commit is contained in:
@ -2,6 +2,7 @@ package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
@ -214,3 +215,94 @@ func New(dsnURL *url.URL, flogger logger.Logger) (*Repository, error) {
|
||||
database: database,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type OptImport struct {
|
||||
Sensors bool
|
||||
Humidities bool
|
||||
Pressures bool
|
||||
Temperatures bool
|
||||
}
|
||||
|
||||
func Import(sourceDSNURL *url.URL, destDNSURL *url.URL, flogger logger.Logger, optImport OptImport) error {
|
||||
|
||||
importMap := map[string]bool{
|
||||
"humidities": optImport.Humidities,
|
||||
"pressures": optImport.Pressures,
|
||||
"temperatures": optImport.Temperatures,
|
||||
}
|
||||
|
||||
// enable sensors if one measured value is enabled
|
||||
if !optImport.Sensors {
|
||||
for key, value := range importMap {
|
||||
if value {
|
||||
flogger.Info("Enable import option sensors. It's required as foreign key for %v", key)
|
||||
optImport.Sensors = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceRepo, err := New(sourceDSNURL, flogger)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to open the source repo: %w", err)
|
||||
}
|
||||
defer sourceRepo.Close()
|
||||
|
||||
destRepo, err := New(destDNSURL, flogger)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to open the destination repo: %w", err)
|
||||
}
|
||||
defer destRepo.Close()
|
||||
|
||||
ctx := context.Background()
|
||||
devices, err := sourceRepo.database.SelectDevices(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to fetch devices from source repo: %w", err)
|
||||
}
|
||||
|
||||
flogger.Debug("Found %v devices", len(devices))
|
||||
|
||||
for i := range devices {
|
||||
err := destRepo.AddDevices(devices[i])
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to add device %v into dest repo: %w", devices[i].Name, err)
|
||||
}
|
||||
}
|
||||
|
||||
if optImport.Sensors {
|
||||
sensors, err := sourceRepo.database.SelectSensors(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to fetch sensors from source repo: %w", err)
|
||||
}
|
||||
|
||||
flogger.Debug("Found %v sensors", len(sensors))
|
||||
|
||||
for i := range sensors {
|
||||
err := destRepo.AddSensors(sensors[i])
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to add sensor %v into dest repo: %w", sensors[i].Name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for key, f := range map[string]func(context.Context) ([]*types.MeasuredValue, error){
|
||||
"humidities": sourceRepo.database.SelectHumidities,
|
||||
"pressures": sourceRepo.database.SelectPressures,
|
||||
"temperatures": sourceRepo.database.SelectTemperatures,
|
||||
} {
|
||||
if importMap[key] {
|
||||
measuredValues, err := f(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to select %v from source repo: %w", key, err)
|
||||
}
|
||||
|
||||
flogger.Debug("Found %v %v values", len(measuredValues), key)
|
||||
|
||||
err = destRepo.AddMeasuredValues(measuredValues...)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to add %v into dest repo: %w", key, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user