diff --git a/db.go b/db.go index feab0cd..d62a2d7 100644 --- a/db.go +++ b/db.go @@ -3,6 +3,7 @@ package main import ( "database/sql" "fmt" + "log" "time" _ "github.com/mattn/go-sqlite3" @@ -44,6 +45,58 @@ func (db *DB) Open() error { return nil } +func (db *DB) Init(ddl string) error { + if !db.Ready { + return fmt.Errorf("database not ready") + } + + var rows map[string]struct{} = make(map[string]struct{}) + // TODO: Maybe make this better one day... + var expected = map[string]struct{}{ + "food": {}, + "weight": {}, + "settings": {}, + } + + res, err := db.readConn.Query("SELECT name FROM sqlite_master WHERE type='table';") + if err != nil { + Error.Printf("%++v", err) + return err + } + defer res.Close() + for res.Next() { + var name string + err := res.Scan(&name) + if err != nil { + Error.Printf("%++v", err) + return err + } + rows[name] = struct{}{} + } + + var needsInit bool + for table := range expected { + if _, ok := rows[table]; !ok { + log.Printf("Table %s not found, initializing", table) + needsInit = true + break; + } + } + + if !needsInit { + log.Printf("Database already initialized") + return nil + } + + _, err = db.writeConn.Exec(ddl) + if err != nil { + Error.Printf("%++v", err) + return err + } + + return nil +} + func (db *DB) Close() error { err := db.writeConn.Close() if err != nil { diff --git a/food.ddl b/food.ddl index 37ebbfe..8e984e6 100644 --- a/food.ddl +++ b/food.ddl @@ -5,7 +5,6 @@ create table weight ( weight real not null ); - create index weightDateIdx on weight(date); create index weightDailyIdx on weight(strftime('%Y-%m-%d', date)); create index weightWeeklyIdx on weight(strftime('%Y-%W', date)); diff --git a/main.go b/main.go index 205dfb4..191d7ee 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "io" "log" "os" + _ "embed" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" @@ -39,6 +40,9 @@ var ( weightService *WeightService ) +//go:embed food.ddl +var foodDDL string + // TODO: Embed food.ddl and create DB if no exists // TODO: Add averages to graphs (ie. R2) https://stackoverflow.com/questions/60622195/how-to-draw-a-linear-regression-line-in-chart-js func main() { @@ -52,6 +56,7 @@ func main() { os.Exit(1) } defer db.Close() + db.Init(foodDDL) settingsService = &SettingsService{db: &db} err = settingsService.LoadSettings()