diff --git a/config.json b/config.json index 88c3dbd..b1e1b16 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,7 @@ { "api": { "database_name": "music.sqlite3", + "single_thread": true, "addr": ":8080", "token": "!! config your very strong token here !!", "ffmpeg_threads": 1, diff --git a/pkg/api/api.go b/pkg/api/api.go index 42527bb..7e1f97c 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -9,13 +9,13 @@ import ( ) type API struct { - Db *database.Database - Server http.Server - token string - APIConfig APIConfig - Tmpfs *tmpfs.Tmpfs - store *sessions.CookieStore - defaultSessionName string + Db *database.Database + Server http.Server + token string + APIConfig APIConfig + Tmpfs *tmpfs.Tmpfs + store *sessions.CookieStore + defaultSessionName string } func NewAPIConfig() APIConfig { @@ -25,6 +25,7 @@ func NewAPIConfig() APIConfig { type APIConfig struct { DatabaseName string `json:"database_name"` + SingleThread bool `json:"single_thread,default=true"` Addr string `json:"addr"` Token string `json:"token"` FfmpegThreads int64 `json:"ffmpeg_threads"` @@ -42,12 +43,12 @@ func NewAPI(config Config) (*API, error) { apiConfig := config.APIConfig tmpfsConfig := config.TmpfsConfig - db, err := database.NewDatabase(apiConfig.DatabaseName) + db, err := database.NewDatabase(apiConfig.DatabaseName, apiConfig.SingleThread) if err != nil { return nil, err } - store := sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY"))) + store := sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY"))) mux := http.NewServeMux() apiMux := http.NewServeMux() @@ -58,9 +59,9 @@ func NewAPI(config Config) (*API, error) { Addr: apiConfig.Addr, Handler: mux, }, - APIConfig: apiConfig, - store: store, - defaultSessionName: "msw-open-music", + APIConfig: apiConfig, + store: store, + defaultSessionName: "msw-open-music", } api.Tmpfs = tmpfs.NewTmpfs(tmpfsConfig) diff --git a/pkg/database/database.go b/pkg/database/database.go index 564cc6a..4199be8 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -10,10 +10,34 @@ import ( type Database struct { sqlConn *sql.DB stmt *Stmt - singleThreadLock *sync.Mutex + singleThreadLock SingleThreadLock } -func NewDatabase(dbName string) (*Database, error) { +func NewSingleThreadLock(enabled bool) SingleThreadLock { + return SingleThreadLock{ + lock: sync.Mutex{}, + enabled: enabled, + } +} + +type SingleThreadLock struct { + lock sync.Mutex + enabled bool +} + +func (stl *SingleThreadLock) Lock() { + if stl.enabled { + stl.lock.Lock() + } +} + +func (stl *SingleThreadLock) Unlock() { + if stl.enabled { + stl.lock.Unlock() + } +} + +func NewDatabase(dbName string, singleThread bool) (*Database, error) { var err error // open database @@ -32,7 +56,7 @@ func NewDatabase(dbName string) (*Database, error) { database := &Database{ sqlConn: sqlConn, stmt: stmt, - singleThreadLock: &sync.Mutex{}, + singleThreadLock: NewSingleThreadLock(singleThread), } return database, nil