fix: implement repository pkg
This commit is contained in:
118
pkg/repository/db/db.go
Normal file
118
pkg/repository/db/db.go
Normal file
@ -0,0 +1,118 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/volker-raschek/flucky/pkg/types"
|
||||
"github.com/volker-raschek/go-logger/pkg/logger"
|
||||
)
|
||||
|
||||
// Database is a general interface for a storage endpoint
|
||||
type Database interface {
|
||||
DeleteDevices(ctx context.Context, deviceIDs ...string) error
|
||||
DeleteSensors(ctx context.Context, sensorIDs ...string) error
|
||||
InsertDevices(ctx context.Context, devices ...*types.Device) error
|
||||
InsertMeasuredValues(ctx context.Context, measuredValues ...*types.MeasuredValue) error
|
||||
InsertSensors(ctx context.Context, sensors ...*types.Sensor) error
|
||||
Scheme(ctx context.Context) error
|
||||
SelectDevice(ctx context.Context, deviceID string) (*types.Device, error)
|
||||
SelectDevices(ctx context.Context) ([]*types.Device, error)
|
||||
SelectHumidity(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
SelectHumidities(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
SelectPressure(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
SelectPressures(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
SelectSensor(ctx context.Context, sensorID string) (*types.Sensor, error)
|
||||
SelectSensors(ctx context.Context) ([]*types.Sensor, error)
|
||||
SelectTemperature(ctx context.Context, id string) (*types.MeasuredValue, error)
|
||||
SelectTemperatures(ctx context.Context) ([]*types.MeasuredValue, error)
|
||||
UpdateDevices(ctx context.Context, devices ...*types.Device) error
|
||||
UpdateSensors(ctx context.Context, sensors ...*types.Sensor) error
|
||||
}
|
||||
|
||||
// New returns a new storage provider
|
||||
func New(storageEndpoint *url.URL, flogger logger.Logger) (Database, error) {
|
||||
|
||||
// Check of nil pointer
|
||||
for _, parameter := range []interface{}{
|
||||
storageEndpoint,
|
||||
flogger,
|
||||
} {
|
||||
if parameter == nil {
|
||||
return nil, fmt.Errorf("Parameter does not be nil")
|
||||
}
|
||||
}
|
||||
|
||||
// Load Queryfiles
|
||||
queries := make(map[string]string, 0)
|
||||
for _, asset := range AssetNames() {
|
||||
if !strings.Contains(asset, storageEndpoint.Scheme) {
|
||||
continue
|
||||
}
|
||||
|
||||
body, err := Asset(asset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
queryFile := filepath.Base(asset)
|
||||
|
||||
queries[queryFile] = string(body)
|
||||
}
|
||||
|
||||
var (
|
||||
database Database
|
||||
err error
|
||||
)
|
||||
|
||||
switch storageEndpoint.Scheme {
|
||||
// case "postgres":
|
||||
// // postgres://[user]:[password]@[host]:[port]/[path]?[query]
|
||||
// newDBO, err := sql.Open(storageEndpoint.Scheme, storageEndpoint.String())
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
|
||||
// return &Postgres{
|
||||
// dbo: newDBO,
|
||||
// flogger: flogger,
|
||||
// }, nil
|
||||
|
||||
case "sqlite3":
|
||||
|
||||
if _, err := os.Stat(filepath.Dir(storageEndpoint.Path)); os.IsNotExist(err) {
|
||||
err := os.MkdirAll(filepath.Dir(storageEndpoint.Path), 0755)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// sqlite3:///[path]?[query] flucky dsn
|
||||
// file:///[path]?[query] sql-lib dsn
|
||||
newDBO, err := sql.Open(storageEndpoint.Scheme, fmt.Sprintf("file://%v?%v", storageEndpoint.Path, storageEndpoint.RawQuery))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
database = &SQLite{
|
||||
dbo: newDBO,
|
||||
flogger: flogger,
|
||||
queries: queries,
|
||||
}
|
||||
default:
|
||||
return nil, fmt.Errorf("Unsupported database scheme: %v", storageEndpoint.Scheme)
|
||||
}
|
||||
|
||||
err = database.Scheme(context.Background())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return database, nil
|
||||
|
||||
}
|
Reference in New Issue
Block a user