revert: separation of write and read DBs

Signed-off-by: Deluan <deluan@navidrome.org>
This commit is contained in:
Deluan
2024-11-18 15:52:13 +02:00
parent 1bf94531fd
commit 3982ba7258
22 changed files with 78 additions and 161 deletions
+15 -78
View File
@@ -1,12 +1,9 @@
package db
import (
"context"
"database/sql"
"embed"
"fmt"
"runtime"
"time"
"github.com/mattn/go-sqlite3"
"github.com/navidrome/navidrome/conf"
@@ -18,8 +15,9 @@ import (
)
var (
Driver = "sqlite3"
Path string
Dialect = "sqlite3"
Driver = Dialect + "_custom"
Path string
)
//go:embed migrations/*.sql
@@ -27,59 +25,9 @@ var embedMigrations embed.FS
const migrationsFolder = "migrations"
type DB interface {
ReadDB() *sql.DB
WriteDB() *sql.DB
Close()
Backup(ctx context.Context) (string, error)
Prune(ctx context.Context) (int, error)
Restore(ctx context.Context, path string) error
}
type db struct {
readDB *sql.DB
writeDB *sql.DB
}
func (d *db) ReadDB() *sql.DB {
return d.readDB
}
func (d *db) WriteDB() *sql.DB {
return d.writeDB
}
func (d *db) Close() {
if err := d.readDB.Close(); err != nil {
log.Error("Error closing read DB", err)
}
if err := d.writeDB.Close(); err != nil {
log.Error("Error closing write DB", err)
}
}
func (d *db) Backup(ctx context.Context) (string, error) {
destPath := backupPath(time.Now())
err := d.backupOrRestore(ctx, true, destPath)
if err != nil {
return "", err
}
return destPath, nil
}
func (d *db) Prune(ctx context.Context) (int, error) {
return prune(ctx)
}
func (d *db) Restore(ctx context.Context, path string) error {
return d.backupOrRestore(ctx, false, path)
}
func Db() DB {
return singleton.GetInstance(func() *db {
sql.Register(Driver+"_custom", &sqlite3.SQLiteDriver{
func Db() *sql.DB {
return singleton.GetInstance(func() *sql.DB {
sql.Register(Driver, &sqlite3.SQLiteDriver{
ConnectHook: func(conn *sqlite3.SQLiteConn) error {
return conn.RegisterFunc("SEEDEDRAND", hasher.HashFunc(), false)
},
@@ -91,35 +39,24 @@ func Db() DB {
conf.Server.DbPath = Path
}
log.Debug("Opening DataBase", "dbPath", Path, "driver", Driver)
// Create a read database connection
rdb, err := sql.Open(Driver+"_custom", Path)
instance, err := sql.Open(Driver, Path)
if err != nil {
log.Fatal("Error opening read database", err)
}
rdb.SetMaxOpenConns(max(4, runtime.NumCPU()))
// Create a write database connection
wdb, err := sql.Open(Driver+"_custom", Path)
if err != nil {
log.Fatal("Error opening write database", err)
}
wdb.SetMaxOpenConns(1)
return &db{
readDB: rdb,
writeDB: wdb,
panic(err)
}
return instance
})
}
func Close() {
log.Info("Closing Database")
Db().Close()
err := Db().Close()
if err != nil {
log.Error("Error closing Database", err)
}
}
func Init() func() {
db := Db().WriteDB()
db := Db()
// Disable foreign_keys to allow re-creating tables in migrations
_, err := db.Exec("PRAGMA foreign_keys=off")
@@ -136,7 +73,7 @@ func Init() func() {
gooseLogger := &logAdapter{silent: isSchemaEmpty(db)}
goose.SetBaseFS(embedMigrations)
err = goose.SetDialect(Driver)
err = goose.SetDialect(Dialect)
if err != nil {
log.Fatal("Invalid DB driver", "driver", Driver, err)
}