Implement postgres support
This commit is contained in:
parent
658e641d30
commit
be83849bee
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in New Issue