56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"path/filepath"
|
|
|
|
"git.zervo.org/zervo/worktime/internal/database/models"
|
|
"git.zervo.org/zervo/worktime/internal/util"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var db *gorm.DB
|
|
|
|
var migrations []any = []any{
|
|
&models.ProjectGroup{},
|
|
&models.Project{},
|
|
&models.Session{},
|
|
&models.SessionPause{},
|
|
&models.SyncTarget{},
|
|
}
|
|
|
|
// migrate migrates the given database
|
|
func migrate(db *gorm.DB) error {
|
|
for _, model := range migrations {
|
|
if err := db.AutoMigrate(model); err != nil {
|
|
return fmt.Errorf("migrate %T: %v", model, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// connect will open and prepare the local sqlite database
|
|
func connect() {
|
|
dbPath := filepath.Join(util.GetWorkDir(), "data.db")
|
|
|
|
var err error = nil
|
|
db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
|
|
if err != nil {
|
|
log.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
|
|
err = migrate(db)
|
|
if err != nil {
|
|
log.Fatalf("Failed to migrate database: %v", err)
|
|
}
|
|
}
|
|
|
|
// DB returns the global database connection instance
|
|
func DB() *gorm.DB {
|
|
if db == nil {
|
|
connect()
|
|
}
|
|
return db
|
|
}
|