mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
* Restructure data layer part 2 (#2599) * Refactor and separate image model * Refactor image query builder * Handle relationships in image query builder * Remove relationship management methods * Refactor gallery model/query builder * Add scenes to gallery model * Convert scene model * Refactor scene models * Remove unused methods * Add unit tests for gallery * Add image tests * Add scene tests * Convert unnecessary scene value pointers to values * Convert unnecessary pointer values to values * Refactor scene partial * Add scene partial tests * Refactor ImagePartial * Add image partial tests * Refactor gallery partial update * Add partial gallery update tests * Use zero/null package for null values * Add files and scan system * Add sqlite implementation for files/folders * Add unit tests for files/folders * Image refactors * Update image data layer * Refactor gallery model and creation * Refactor scene model * Refactor scenes * Don't set title from filename * Allow galleries to freely add/remove images * Add multiple scene file support to graphql and UI * Add multiple file support for images in graphql/UI * Add multiple file for galleries in graphql/UI * Remove use of some deprecated fields * Remove scene path usage * Remove gallery path usage * Remove path from image * Move funscript to video file * Refactor caption detection * Migrate existing data * Add post commit/rollback hook system * Lint. Comment out import/export tests * Add WithDatabase read only wrapper * Prepend tasks to list * Add 32 pre-migration * Add warnings in release and migration notes
104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
package goqu
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/doug-martin/goqu/v9/exp"
|
|
"github.com/doug-martin/goqu/v9/internal/sb"
|
|
"github.com/doug-martin/goqu/v9/sqlgen"
|
|
)
|
|
|
|
type (
|
|
SQLDialectOptions = sqlgen.SQLDialectOptions
|
|
// An adapter interface to be used by a Dataset to generate SQL for a specific dialect.
|
|
// See DefaultAdapter for a concrete implementation and examples.
|
|
SQLDialect interface {
|
|
Dialect() string
|
|
ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses)
|
|
ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses)
|
|
ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses)
|
|
ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses)
|
|
ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses)
|
|
}
|
|
// The default adapter. This class should be used when building a new adapter. When creating a new adapter you can
|
|
// either override methods, or more typically update default values.
|
|
// See (github.com/doug-martin/goqu/dialect/postgres)
|
|
sqlDialect struct {
|
|
dialect string
|
|
dialectOptions *SQLDialectOptions
|
|
selectGen sqlgen.SelectSQLGenerator
|
|
updateGen sqlgen.UpdateSQLGenerator
|
|
insertGen sqlgen.InsertSQLGenerator
|
|
deleteGen sqlgen.DeleteSQLGenerator
|
|
truncateGen sqlgen.TruncateSQLGenerator
|
|
}
|
|
)
|
|
|
|
var (
|
|
dialects = make(map[string]SQLDialect)
|
|
DefaultDialectOptions = sqlgen.DefaultDialectOptions
|
|
dialectsMu sync.RWMutex
|
|
)
|
|
|
|
func init() {
|
|
RegisterDialect("default", DefaultDialectOptions())
|
|
}
|
|
|
|
func RegisterDialect(name string, do *SQLDialectOptions) {
|
|
dialectsMu.Lock()
|
|
defer dialectsMu.Unlock()
|
|
lowerName := strings.ToLower(name)
|
|
dialects[lowerName] = newDialect(lowerName, do)
|
|
}
|
|
|
|
func DeregisterDialect(name string) {
|
|
dialectsMu.Lock()
|
|
defer dialectsMu.Unlock()
|
|
delete(dialects, strings.ToLower(name))
|
|
}
|
|
|
|
func GetDialect(name string) SQLDialect {
|
|
name = strings.ToLower(name)
|
|
if d, ok := dialects[name]; ok {
|
|
return d
|
|
}
|
|
return newDialect("default", DefaultDialectOptions())
|
|
}
|
|
|
|
func newDialect(dialect string, do *SQLDialectOptions) SQLDialect {
|
|
return &sqlDialect{
|
|
dialect: dialect,
|
|
dialectOptions: do,
|
|
selectGen: sqlgen.NewSelectSQLGenerator(dialect, do),
|
|
updateGen: sqlgen.NewUpdateSQLGenerator(dialect, do),
|
|
insertGen: sqlgen.NewInsertSQLGenerator(dialect, do),
|
|
deleteGen: sqlgen.NewDeleteSQLGenerator(dialect, do),
|
|
truncateGen: sqlgen.NewTruncateSQLGenerator(dialect, do),
|
|
}
|
|
}
|
|
|
|
func (d *sqlDialect) Dialect() string {
|
|
return d.dialect
|
|
}
|
|
|
|
func (d *sqlDialect) ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses) {
|
|
d.selectGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses) {
|
|
d.updateGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses) {
|
|
d.insertGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses) {
|
|
d.deleteGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses) {
|
|
d.truncateGen.Generate(b, clauses)
|
|
}
|