package database import ( "log" //"time" "fmt" "udi/counter" "gorm.io/driver/postgres" "gorm.io/gorm" ) type DatabaseHandle struct { initialized bool dbh *gorm.DB } func NewDatabaseHandle() *DatabaseHandle { var db DatabaseHandle // inject the whole database configuration via the well-known PG* env variables conn, err := gorm.Open(postgres.Open("")) if err != nil { log.Printf("Unable to open database connection: %s", err) db.initialized = false } else { db.dbh = conn db.initialized = true //log.Println("Database connection opened") } return &db } func (self *DatabaseHandle) StoreMeasurement(measurement *Measurement) { if ! self.initialized { log.Printf("Database connection not initialized, can not store, measurement %s lost", measurement) counter.F("Stored") return } result := self.dbh.Create(measurement) if result.Error != nil { log.Printf("Unable to insert, measurement %s lost, error: %s", measurement, result.Error) counter.F("Stored") return } //log.Println("Successfully stored measurement") counter.S("Stored") } func (self *DatabaseHandle) GetDeviceByLabelAndApplication(applicationLabel string, deviceLabel string) (*Device, error) { if ! self.initialized { err := fmt.Errorf("Database connection not initialized") return nil, err } var device Device result := self.dbh. Preload("Application"). Preload("DeviceType"). Joins("JOIN applications ON devices.application_id = applications.id"). Where("devices.label = ? AND applications.label = ?", deviceLabel, applicationLabel). First(&device) if result.Error != nil { err := fmt.Errorf("Query failed: %s", result.Error) return nil, err } return &device, nil }