90 lines
2 KiB
Go
90 lines
2 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"embed"
|
|
|
|
goose "github.com/pressly/goose/v3"
|
|
"github.com/sirupsen/logrus"
|
|
_ "modernc.org/sqlite"
|
|
|
|
"git.janky.solutions/finn/lockserver/config"
|
|
)
|
|
|
|
const sqliteParams = "?_pragma=foreign_keys(1)&_time_format=sqlite"
|
|
|
|
func Get() (*Queries, *sql.DB, error) {
|
|
db, err := sql.Open("sqlite", config.C.SqliteDatabase+sqliteParams)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return New(db), db, nil
|
|
}
|
|
|
|
//go:embed migrations
|
|
var migrations embed.FS
|
|
|
|
func Migrate() error {
|
|
logrus.WithField("dbfile", config.C.SqliteDatabase).Info("migrating database")
|
|
|
|
_, conn, err := Get()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
goose.SetBaseFS(migrations)
|
|
|
|
if err := goose.SetDialect("sqlite3"); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := goose.Up(conn, "migrations"); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func NullString(s string) sql.NullString {
|
|
return sql.NullString{Valid: s != "", String: s}
|
|
}
|
|
|
|
func NullInt64(i int64) sql.NullInt64 {
|
|
return sql.NullInt64{Valid: true, Int64: i}
|
|
}
|
|
|
|
type loggingDBTX struct {
|
|
Next DBTX
|
|
}
|
|
|
|
func (l loggingDBTX) ExecContext(ctx context.Context, query string, params ...interface{}) (sql.Result, error) {
|
|
logrus.WithFields(logrus.Fields{
|
|
"query": query,
|
|
"params": params,
|
|
}).Debug("ExecContext")
|
|
return l.Next.ExecContext(ctx, query, params...)
|
|
}
|
|
|
|
func (l loggingDBTX) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) {
|
|
logrus.WithFields(logrus.Fields{
|
|
"query": query,
|
|
}).Debug("PrepareContext")
|
|
return l.Next.PrepareContext(ctx, query)
|
|
}
|
|
func (l loggingDBTX) QueryContext(ctx context.Context, query string, params ...interface{}) (*sql.Rows, error) {
|
|
logrus.WithFields(logrus.Fields{
|
|
"query": query,
|
|
"params": params,
|
|
}).Debug("QueryContext")
|
|
return l.Next.QueryContext(ctx, query, params...)
|
|
}
|
|
func (l loggingDBTX) QueryRowContext(ctx context.Context, query string, params ...interface{}) *sql.Row {
|
|
logrus.WithFields(logrus.Fields{
|
|
"query": query,
|
|
"params": params,
|
|
}).Debug("QueryRowContext")
|
|
return l.Next.QueryRowContext(ctx, query, params...)
|
|
}
|