Implement postgres support
This commit is contained in:
parent
658e641d30
commit
be83849bee
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/logger"
|
"gorm.io/gorm/logger"
|
||||||
|
@ -37,6 +38,20 @@ func getMysqlAddress() (*url.URL, error) {
|
||||||
return address, nil
|
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) {
|
func getSqliteAddress() (*url.URL, error) {
|
||||||
path := utils.EnvSqlitePath.GetValue()
|
path := utils.EnvSqlitePath.GetValue()
|
||||||
if path == "" {
|
if path == "" {
|
||||||
|
@ -77,6 +92,14 @@ func configureDatabase(config *gorm.Config) (*gorm.DB, error) {
|
||||||
}
|
}
|
||||||
log.Printf("Opening SQLITE database: %s", sqliteAddress)
|
log.Printf("Opening SQLITE database: %s", sqliteAddress)
|
||||||
databaseDialect = sqlite.Open(sqliteAddress.String())
|
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)
|
db, err := gorm.Open(databaseDialect, config)
|
||||||
|
|
|
@ -10,8 +10,9 @@ import (
|
||||||
type DatabaseDriverType string
|
type DatabaseDriverType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
DatabaseDriverMysql DatabaseDriverType = "mysql"
|
DatabaseDriverMysql DatabaseDriverType = "mysql"
|
||||||
DatabaseDriverSqlite DatabaseDriverType = "sqlite"
|
DatabaseDriverSqlite DatabaseDriverType = "sqlite"
|
||||||
|
DatabaseDriverPostgres DatabaseDriverType = "postgres"
|
||||||
)
|
)
|
||||||
|
|
||||||
func DatabaseDriver() DatabaseDriverType {
|
func DatabaseDriver() DatabaseDriverType {
|
||||||
|
@ -24,6 +25,8 @@ func DatabaseDriver() DatabaseDriverType {
|
||||||
driver = DatabaseDriverMysql
|
driver = DatabaseDriverMysql
|
||||||
case "sqlite":
|
case "sqlite":
|
||||||
driver = DatabaseDriverSqlite
|
driver = DatabaseDriverSqlite
|
||||||
|
case "postgres":
|
||||||
|
driver = DatabaseDriverPostgres
|
||||||
default:
|
default:
|
||||||
driver = DatabaseDriverMysql
|
driver = DatabaseDriverMysql
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
PHOTOVIEW_DATABASE_DRIVER=mysql
|
PHOTOVIEW_DATABASE_DRIVER=mysql
|
||||||
PHOTOVIEW_MYSQL_URL=user:password@tcp(localhost)/dbname
|
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'
|
# Specifies the filepath for the sqlite database, if PHOTOVIEW_DATABASE_DRIVER is set to 'sqlite'
|
||||||
# PHOTOVIEW_SQLITE_PATH=photoview.db
|
# PHOTOVIEW_SQLITE_PATH=photoview.db
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ require (
|
||||||
gopkg.in/vansante/go-ffprobe.v2 v2.0.2
|
gopkg.in/vansante/go-ffprobe.v2 v2.0.2
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gorm.io/driver/mysql v1.0.3
|
gorm.io/driver/mysql v1.0.3
|
||||||
|
gorm.io/driver/postgres v1.0.7
|
||||||
gorm.io/driver/sqlite v1.1.4
|
gorm.io/driver/sqlite v1.1.4
|
||||||
gorm.io/gorm v1.20.11
|
gorm.io/gorm v1.20.11
|
||||||
)
|
)
|
||||||
|
|
|
@ -42,7 +42,7 @@ func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter, onl
|
||||||
favoritesSubquery := r.Database.
|
favoritesSubquery := r.Database.
|
||||||
Model(&models.UserMediaData{UserID: user.ID}).
|
Model(&models.UserMediaData{UserID: user.ID}).
|
||||||
Where("user_media_data.media_id = media.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)
|
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) {
|
func (r *albumResolver) Media(ctx context.Context, album *models.Album, filter *models.Filter, onlyFavorites *bool) ([]*models.Media, error) {
|
||||||
|
|
||||||
query := r.Database.
|
query := r.Database.
|
||||||
Joins("Album").
|
Where("media.album_id = ?", album.ID).
|
||||||
Where("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"))
|
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 {
|
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{
|
favoriteQuery := r.Database.Model(&models.UserMediaData{
|
||||||
UserID: user.ID,
|
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)
|
query = query.Where("EXISTS (?)", favoriteQuery)
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ func (r *queryResolver) Media(ctx context.Context, id int) (*models.Media, error
|
||||||
err := r.Database.
|
err := r.Database.
|
||||||
Joins("Album").
|
Joins("Album").
|
||||||
Where("media.id = ?", id).
|
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")).
|
Where("media.id IN (?)", r.Database.Model(&models.MediaURL{}).Select("media_id").Where("media_urls.media_id = media.id")).
|
||||||
First(&media).Error
|
First(&media).Error
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ const (
|
||||||
const (
|
const (
|
||||||
EnvDatabaseDriver EnvironmentVariable = "PHOTOVIEW_DATABASE_DRIVER"
|
EnvDatabaseDriver EnvironmentVariable = "PHOTOVIEW_DATABASE_DRIVER"
|
||||||
EnvMysqlURL EnvironmentVariable = "PHOTOVIEW_MYSQL_URL"
|
EnvMysqlURL EnvironmentVariable = "PHOTOVIEW_MYSQL_URL"
|
||||||
|
EnvPostgresURL EnvironmentVariable = "PHOTOVIEW_POSTGRES_URL"
|
||||||
EnvSqlitePath EnvironmentVariable = "PHOTOVIEW_SQLITE_PATH"
|
EnvSqlitePath EnvironmentVariable = "PHOTOVIEW_SQLITE_PATH"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue