mirror of
https://git.vectorsigma.ru/public/photoview.git
synced 2026-08-03 21:09:05 +00:00
Drop tables instead of truncating tables. (#1224)
This commit is contained in:
@@ -2,6 +2,7 @@ package database
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -204,50 +205,16 @@ func MigrateDatabase(db *gorm.DB) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ClearDatabase(db *gorm.DB) error {
|
func ClearDatabase(db *gorm.DB) error {
|
||||||
return db.Transaction(func(tx *gorm.DB) error {
|
var errs []error
|
||||||
|
|
||||||
dbDriver := drivers.DatabaseDriverFromEnv()
|
|
||||||
|
|
||||||
if dbDriver == drivers.MYSQL {
|
|
||||||
if err := tx.Exec("SET FOREIGN_KEY_CHECKS = 0;").Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := clearTables(tx, dbDriver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if dbDriver == drivers.MYSQL {
|
|
||||||
if err := tx.Exec("SET FOREIGN_KEY_CHECKS = 1;").Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func clearTables(tx *gorm.DB, dbDriver drivers.DatabaseDriverType) error {
|
|
||||||
dryRun := tx.Session(&gorm.Session{DryRun: true})
|
|
||||||
for _, model := range database_models {
|
for _, model := range database_models {
|
||||||
// get table name of model structure
|
if err := db.Migrator().DropTable(model); err != nil {
|
||||||
table := dryRun.Find(model).Statement.Table
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch dbDriver {
|
if err := errors.Join(errs...); err != nil {
|
||||||
case drivers.POSTGRES:
|
return fmt.Errorf("drop tables error: %w", err)
|
||||||
if err := tx.Exec(fmt.Sprintf("TRUNCATE TABLE %s CASCADE", table)).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case drivers.MYSQL:
|
|
||||||
if err := tx.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case drivers.SQLITE:
|
|
||||||
if err := tx.Exec(fmt.Sprintf("DELETE FROM %s", table)).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ func (a *Album) Thumbnail(db *gorm.DB) (*Media, error) {
|
|||||||
)
|
)
|
||||||
SELECT * FROM media
|
SELECT * FROM media
|
||||||
WHERE media.album_id IN (SELECT id FROM sub_albums)
|
WHERE media.album_id IN (SELECT id FROM sub_albums)
|
||||||
|
ORDER BY media.id
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
package media_type
|
package media_type
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"flag"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Avoid panic with providing flags in `test_utils/integration_setup.go`.
|
||||||
|
flag.CommandLine.Init("media_type", flag.ContinueOnError)
|
||||||
|
}
|
||||||
|
|
||||||
type boolImage bool
|
type boolImage bool
|
||||||
|
|
||||||
const isImage boolImage = true
|
const isImage boolImage = true
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func DatabaseTest(t *testing.T) *gorm.DB {
|
|||||||
t.Skip("Database integration tests disabled")
|
t.Skip("Database integration tests disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := test_dbm.SetupOrReset(); err != nil {
|
if err := test_dbm.SetupAndReset(); err != nil {
|
||||||
t.Fatalf("failed to setup or reset test database: %v", err)
|
t.Fatalf("failed to setup or reset test database: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package test_utils
|
package test_utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/photoview/photoview/api/database"
|
"github.com/photoview/photoview/api/database"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/logger"
|
"gorm.io/gorm/logger"
|
||||||
)
|
)
|
||||||
@@ -11,12 +12,14 @@ type TestDBManager struct {
|
|||||||
DB *gorm.DB
|
DB *gorm.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dbm *TestDBManager) SetupOrReset() error {
|
func (dbm *TestDBManager) SetupAndReset() error {
|
||||||
if dbm.DB == nil {
|
if dbm.DB == nil {
|
||||||
return dbm.setup()
|
if err := dbm.setup(); err != nil {
|
||||||
} else {
|
return fmt.Errorf("setup db error: %w", err)
|
||||||
return dbm.reset()
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dbm.reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dbm *TestDBManager) Close() error {
|
func (dbm *TestDBManager) Close() error {
|
||||||
@@ -24,13 +27,9 @@ func (dbm *TestDBManager) Close() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := dbm.reset(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlDB, err := dbm.DB.DB()
|
sqlDB, err := dbm.DB.DB()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "get db instance when closing test database")
|
return fmt.Errorf("get db instance when closing test database error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlDB.Close()
|
sqlDB.Close()
|
||||||
@@ -45,26 +44,21 @@ func (dbm *TestDBManager) setup() error {
|
|||||||
}
|
}
|
||||||
db, err := database.ConfigureDatabase(&config)
|
db, err := database.ConfigureDatabase(&config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "configure test database")
|
return fmt.Errorf("configure test database error: %w", err)
|
||||||
}
|
|
||||||
|
|
||||||
if err := database.MigrateDatabase(db); err != nil {
|
|
||||||
return errors.Wrap(err, "migrate test database")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dbm.DB = db
|
dbm.DB = db
|
||||||
|
|
||||||
if err := dbm.reset(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dbm *TestDBManager) reset() error {
|
func (dbm *TestDBManager) reset() error {
|
||||||
|
|
||||||
if err := database.ClearDatabase(dbm.DB); err != nil {
|
if err := database.ClearDatabase(dbm.DB); err != nil {
|
||||||
return errors.Wrap(err, "reset test database")
|
return fmt.Errorf("clean database error: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := database.MigrateDatabase(dbm.DB); err != nil {
|
||||||
|
return fmt.Errorf("migrate database error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user