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