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) {
address, err := url.Parse(os.Getenv("MYSQL_URL"))
address, err := url.Parse(os.Getenv("PHOTOVIEW_MYSQL_URL"))
if err != nil {
return nil, errors.Wrap(err, "Could not parse mysql url")
}
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()
@ -35,6 +35,28 @@ func getMysqlAddress() (*url.URL, error) {
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
func SetupDatabase() (*gorm.DB, error) {
@ -44,7 +66,8 @@ func SetupDatabase() (*gorm.DB, error) {
config.Logger = logger.Default.LogMode(logger.Info)
var databaseDialect gorm.Dialector
switch strings.ToLower(os.Getenv("PHOTOVIEW_DATABASE_DRIVER")) {
databaseDriver := strings.ToLower(os.Getenv("PHOTOVIEW_DATABASE_DRIVER"))
switch databaseDriver {
case "mysql":
mysqlAddress, err := getMysqlAddress()
if err != nil {
@ -54,11 +77,11 @@ func SetupDatabase() (*gorm.DB, error) {
databaseDialect = mysql.Open(mysqlAddress.String())
case "sqlite":
path := os.Getenv("PHOTOVIEW_SQLITE_PATH")
if path == "" {
path = "photoview.db"
sqliteAddress, err := getSqliteAddress()
if err != nil {
return nil, err
}
databaseDialect = sqlite.Open(path)
databaseDialect = sqlite.Open(sqliteAddress.String())
}
db, err := gorm.Open(databaseDialect, &config)

View File

@ -1,6 +1,6 @@
# 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_PORT=4001

View File

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

View File

@ -1,6 +1,9 @@
package models
import (
"crypto/md5"
"encoding/hex"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
@ -38,3 +41,9 @@ func (filter *Filter) FormatSQL(tx *gorm.DB) *gorm.DB {
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
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
}

View File

@ -109,7 +109,7 @@ func ScanMedia(tx *gorm.DB, mediaPath string, albumId int, cache *AlbumScannerCa
{
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 {
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
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 {
return result.Error
}