Work on sqlite support
This commit is contained in:
parent
f711da4d9c
commit
fcdb5b4e7b
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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[:])
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue