1
Fork 0

Implement postgres support

This commit is contained in:
András Maróy 2021-01-31 17:06:25 +01:00
parent 658e641d30
commit be83849bee
7 changed files with 38 additions and 7 deletions

View File

@ -13,6 +13,7 @@ import (
"github.com/pkg/errors"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
@ -37,6 +38,20 @@ func getMysqlAddress() (*url.URL, error) {
return address, nil
}
func getPostgresAddress() (*url.URL, error) {
addressString := utils.EnvPostgresURL.GetValue()
if addressString == "" {
return nil, errors.New(fmt.Sprintf("Environment variable %s missing, exiting", utils.EnvPostgresURL.GetName()))
}
address, err := url.Parse(addressString)
if err != nil {
return nil, errors.Wrap(err, "Could not parse postgres url")
}
return address, nil
}
func getSqliteAddress() (*url.URL, error) {
path := utils.EnvSqlitePath.GetValue()
if path == "" {
@ -77,6 +92,14 @@ func configureDatabase(config *gorm.Config) (*gorm.DB, error) {
}
log.Printf("Opening SQLITE database: %s", sqliteAddress)
databaseDialect = sqlite.Open(sqliteAddress.String())
case drivers.DatabaseDriverPostgres:
postgresAddress, err := getPostgresAddress()
if err != nil {
return nil, err
}
log.Printf("Connecting to POSTGRES database: %s", postgresAddress)
databaseDialect = postgres.Open(postgresAddress.String())
}
db, err := gorm.Open(databaseDialect, config)

View File

@ -10,8 +10,9 @@ import (
type DatabaseDriverType string
const (
DatabaseDriverMysql DatabaseDriverType = "mysql"
DatabaseDriverSqlite DatabaseDriverType = "sqlite"
DatabaseDriverMysql DatabaseDriverType = "mysql"
DatabaseDriverSqlite DatabaseDriverType = "sqlite"
DatabaseDriverPostgres DatabaseDriverType = "postgres"
)
func DatabaseDriver() DatabaseDriverType {
@ -24,6 +25,8 @@ func DatabaseDriver() DatabaseDriverType {
driver = DatabaseDriverMysql
case "sqlite":
driver = DatabaseDriverSqlite
case "postgres":
driver = DatabaseDriverPostgres
default:
driver = DatabaseDriverMysql
}

View File

@ -3,6 +3,10 @@
PHOTOVIEW_DATABASE_DRIVER=mysql
PHOTOVIEW_MYSQL_URL=user:password@tcp(localhost)/dbname
# Specifies the connection string for the postgres database, if PHOTOVIEW_DATABASE_DRIVER is set to 'postgres'
# See https://www.postgresql.org/docs/current/libpq-ssl.html for possible ssl modes
# PHOTOVIEW_POSTGRES_URL=postgres://user:password@host:port/dbname?sslmode=(disable|allow|...)
# Specifies the filepath for the sqlite database, if PHOTOVIEW_DATABASE_DRIVER is set to 'sqlite'
# PHOTOVIEW_SQLITE_PATH=photoview.db

View File

@ -22,6 +22,7 @@ require (
gopkg.in/vansante/go-ffprobe.v2 v2.0.2
gopkg.in/yaml.v2 v2.4.0 // indirect
gorm.io/driver/mysql v1.0.3
gorm.io/driver/postgres v1.0.7
gorm.io/driver/sqlite v1.1.4
gorm.io/gorm v1.20.11
)

View File

@ -42,7 +42,7 @@ func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter, onl
favoritesSubquery := r.Database.
Model(&models.UserMediaData{UserID: user.ID}).
Where("user_media_data.media_id = media.id").
Where("user_media_data.favorite = 1")
Where("user_media_data.favorite = true")
subQuery = subQuery.Where("EXISTS (?)", favoritesSubquery)
}
@ -95,8 +95,7 @@ type albumResolver struct{ *Resolver }
func (r *albumResolver) Media(ctx context.Context, album *models.Album, filter *models.Filter, onlyFavorites *bool) ([]*models.Media, error) {
query := r.Database.
Joins("Album").
Where("Album.id = ?", album.ID).
Where("media.album_id = ?", album.ID).
Where("media.id IN (?)", r.Database.Model(&models.MediaURL{}).Select("media_urls.media_id").Where("media_urls.media_id = media.id"))
if onlyFavorites != nil && *onlyFavorites == true {
@ -107,7 +106,7 @@ func (r *albumResolver) Media(ctx context.Context, album *models.Album, filter *
favoriteQuery := r.Database.Model(&models.UserMediaData{
UserID: user.ID,
}).Where("user_media_data.media_id = media.id").Where("user_media_data.favorite = 1")
}).Where("user_media_data.media_id = media.id").Where("user_media_data.favorite = true")
query = query.Where("EXISTS (?)", favoriteQuery)
}

View File

@ -54,7 +54,7 @@ func (r *queryResolver) Media(ctx context.Context, id int) (*models.Media, error
err := r.Database.
Joins("Album").
Where("media.id = ?", id).
Where("EXISTS (SELECT * FROM user_albums WHERE user_albums.album_id = Album.id AND user_albums.user_id = ?)", user.ID).
Where("EXISTS (SELECT * FROM user_albums WHERE user_albums.album_id = media.album_id AND user_albums.user_id = ?)", user.ID).
Where("media.id IN (?)", r.Database.Model(&models.MediaURL{}).Select("media_id").Where("media_urls.media_id = media.id")).
First(&media).Error

View File

@ -25,6 +25,7 @@ const (
const (
EnvDatabaseDriver EnvironmentVariable = "PHOTOVIEW_DATABASE_DRIVER"
EnvMysqlURL EnvironmentVariable = "PHOTOVIEW_MYSQL_URL"
EnvPostgresURL EnvironmentVariable = "PHOTOVIEW_POSTGRES_URL"
EnvSqlitePath EnvironmentVariable = "PHOTOVIEW_SQLITE_PATH"
)