filebrowser/storage/sql/sql.go
2022-11-23 21:09:35 +08:00

80 lines
1.8 KiB
Go

package sql
import (
"database/sql"
"errors"
"strings"
"github.com/filebrowser/filebrowser/v2/auth"
"github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/share"
"github.com/filebrowser/filebrowser/v2/storage"
"github.com/filebrowser/filebrowser/v2/users"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
)
func IsDBPath(path string) bool {
prefixes := []string{"sqlite3", "postgres", "mysql"}
for _, prefix := range prefixes {
if strings.HasPrefix(path, prefix+"://") {
return true
}
}
return false
}
func OpenDB(path string) (*sql.DB, error) {
prefixes := []string{"sqlite3", "postgres", "mysql"}
for _, prefix := range prefixes {
if strings.HasPrefix(path, prefix) {
return connectDB(prefix, strings.TrimPrefix(path, prefix+"://"))
}
}
return nil, errors.New("Unsupported db scheme")
}
func connectDB(dbType string, path string) (*sql.DB, error) {
db, err := sql.Open(dbType, path)
if err == nil {
return db, nil
}
return nil, err
}
func NewStorage(db *sql.DB) (*storage.Storage, error) {
InitUserTable(db)
InitShareTable(db)
InitSettingsTable(db)
userStore := users.NewStorage(usersBackend{db: db})
shareStore := share.NewStorage(shareBackend{db: db})
settingsStore := settings.NewStorage(settingsBackend{db: db})
authStore := auth.NewStorage(authBackend{db: db}, userStore)
err := SetSetting(db, "version", "2")
if checkError(err, "Fail to set version") {
return nil, err
}
// TODO: default
/*
if GetSetting(db, "auther") == "" {
err := SetSetting(db, "auther", "json")
if checkError(err, "Fail to set auther") {
return nil, err
}
}
*/
storage := &storage.Storage{
Auth: authStore,
Users: userStore,
Share: shareStore,
Settings: settingsStore,
}
return storage, nil
}