1
Fork 0

Work on sqlite support

This commit is contained in:
viktorstrate 2021-01-17 12:45:23 +01:00
parent f711da4d9c
commit fcdb5b4e7b
No known key found for this signature in database
GPG Key ID: 3F855605109C1E8A
7 changed files with 45 additions and 17 deletions

View File

@ -18,13 +18,13 @@ import (
) )
func getMysqlAddress() (*url.URL, error) { func getMysqlAddress() (*url.URL, error) {
address, err := url.Parse(os.Getenv("MYSQL_URL")) address, err := url.Parse(os.Getenv("PHOTOVIEW_MYSQL_URL"))
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Could not parse mysql url") return nil, errors.Wrap(err, "Could not parse mysql url")
} }
if address.String() == "" { if address.String() == "" {
return nil, errors.New("Environment variable MYSQL_URL missing, exiting") return nil, errors.New("Environment variable PHOTOVIEW_MYSQL_URL missing, exiting")
} }
queryValues := address.Query() queryValues := address.Query()
@ -35,6 +35,28 @@ func getMysqlAddress() (*url.URL, error) {
return address, nil return address, nil
} }
func getSqliteAddress() (*url.URL, error) {
path := os.Getenv("PHOTOVIEW_SQLITE_PATH")
if path == "" {
path = "photoview.db"
}
address, err := url.Parse(path)
if err != nil {
return nil, errors.Wrapf(err, "Could not parse sqlite url (%s)", path)
}
queryValues := address.Query()
queryValues.Add("cache", "shared")
queryValues.Add("mode", "rwc")
// queryValues.Add("_busy_timeout", "60000") // 1 minute
address.RawQuery = queryValues.Encode()
// log.Panicf("%s", address.String())
return address, nil
}
// SetupDatabase connects to the database using environment variables // SetupDatabase connects to the database using environment variables
func SetupDatabase() (*gorm.DB, error) { func SetupDatabase() (*gorm.DB, error) {
@ -44,7 +66,8 @@ func SetupDatabase() (*gorm.DB, error) {
config.Logger = logger.Default.LogMode(logger.Info) config.Logger = logger.Default.LogMode(logger.Info)
var databaseDialect gorm.Dialector var databaseDialect gorm.Dialector
switch strings.ToLower(os.Getenv("PHOTOVIEW_DATABASE_DRIVER")) { databaseDriver := strings.ToLower(os.Getenv("PHOTOVIEW_DATABASE_DRIVER"))
switch databaseDriver {
case "mysql": case "mysql":
mysqlAddress, err := getMysqlAddress() mysqlAddress, err := getMysqlAddress()
if err != nil { if err != nil {
@ -54,11 +77,11 @@ func SetupDatabase() (*gorm.DB, error) {
databaseDialect = mysql.Open(mysqlAddress.String()) databaseDialect = mysql.Open(mysqlAddress.String())
case "sqlite": case "sqlite":
path := os.Getenv("PHOTOVIEW_SQLITE_PATH") sqliteAddress, err := getSqliteAddress()
if path == "" { if err != nil {
path = "photoview.db" return nil, err
} }
databaseDialect = sqlite.Open(path) databaseDialect = sqlite.Open(sqliteAddress.String())
} }
db, err := gorm.Open(databaseDialect, &config) db, err := gorm.Open(databaseDialect, &config)

View File

@ -1,6 +1,6 @@
# Copy this file to .env # Copy this file to .env
MYSQL_URL=user:password@tcp(localhost)/dbname PHOTOVIEW_MYSQL_URL=user:password@tcp(localhost)/dbname
PHOTOVIEW_LISTEN_IP=localhost PHOTOVIEW_LISTEN_IP=localhost
PHOTOVIEW_LISTEN_PORT=4001 PHOTOVIEW_LISTEN_PORT=4001

View File

@ -1,8 +1,6 @@
package models package models
import ( import (
"crypto/md5"
"encoding/hex"
"path" "path"
"strings" "strings"
"time" "time"
@ -40,12 +38,10 @@ func (Media) TableName() string {
func (m *Media) BeforeSave(tx *gorm.DB) error { func (m *Media) BeforeSave(tx *gorm.DB) error {
// Update hashes // Update hashes
hash := md5.Sum([]byte(m.Path)) m.PathHash = MD5Hash(m.Path)
m.PathHash = hex.EncodeToString(hash[:])
if m.SideCarPath != nil { if m.SideCarPath != nil {
hash = md5.Sum([]byte(*m.SideCarPath)) encodedHash := MD5Hash(*m.SideCarPath)
encodedHash := hex.EncodeToString(hash[:])
m.SideCarHash = &encodedHash m.SideCarHash = &encodedHash
} }

View File

@ -1,6 +1,9 @@
package models package models
import ( import (
"crypto/md5"
"encoding/hex"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )
@ -38,3 +41,9 @@ func (filter *Filter) FormatSQL(tx *gorm.DB) *gorm.DB {
return tx return tx
} }
// MD5Hash hashes value to a 32 length digest, the result is the same as the MYSQL function md5()
func MD5Hash(value string) string {
hash := md5.Sum([]byte(value))
return hex.EncodeToString(hash[:])
}

View File

@ -20,7 +20,7 @@ func NewRootAlbum(db *gorm.DB, rootPath string, owner *models.User) (*models.Alb
} }
var matchedAlbums []models.Album var matchedAlbums []models.Album
if err := db.Where("path_hash = MD5(?)", rootPath).Find(&matchedAlbums).Error; err != nil { if err := db.Where("path_hash = ?", models.MD5Hash(rootPath)).Find(&matchedAlbums).Error; err != nil {
return nil, err return nil, err
} }

View File

@ -109,7 +109,7 @@ func ScanMedia(tx *gorm.DB, mediaPath string, albumId int, cache *AlbumScannerCa
{ {
var media []*models.Media var media []*models.Media
result := tx.Where("path_hash = MD5(?)", mediaPath).Find(&media) result := tx.Where("path_hash = ?", models.MD5Hash(mediaPath)).Find(&media)
if result.Error != nil { if result.Error != nil {
return nil, false, errors.Wrap(result.Error, "scan media fetch from database") return nil, false, errors.Wrap(result.Error, "scan media fetch from database")

View File

@ -80,7 +80,7 @@ func findAlbumsForUser(db *gorm.DB, user *models.User, album_cache *AlbumScanner
// check if album already exists // check if album already exists
var albumResult []models.Album var albumResult []models.Album
result := tx.Where("path_hash = md5(?)", albumPath).Find(&albumResult) result := tx.Where("path_hash = ?", models.MD5Hash(albumPath)).Find(&albumResult)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
} }