mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
SQLite model refactoring (#3791)
* Remove ID from PerformerPartial * Separate studio model from sqlite model * Separate movie model from sqlite model * Separate tag model from sqlite model * Separate saved filter model from sqlite model * Separate scene marker model from sqlite model * Separate gallery chapter model from sqlite model * Move ErrNoRows checks into sqlite, improve empty result error messages * Move SQLiteDate and SQLiteTimestamp to sqlite * Use changesetTranslator everywhere, refactor for consistency * Make PerformerStore.DestroyImage private * Fix rating on movie create
This commit is contained in:
80
pkg/sqlite/date.go
Normal file
80
pkg/sqlite/date.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"time"
|
||||
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
)
|
||||
|
||||
const sqliteDateLayout = "2006-01-02"
|
||||
|
||||
// Date represents a date stored as "YYYY-MM-DD"
|
||||
type Date struct {
|
||||
Date time.Time
|
||||
}
|
||||
|
||||
// Scan implements the Scanner interface.
|
||||
func (d *Date) Scan(value interface{}) error {
|
||||
d.Date = value.(time.Time)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Value implements the driver Valuer interface.
|
||||
func (d Date) Value() (driver.Value, error) {
|
||||
return d.Date.Format(sqliteDateLayout), nil
|
||||
}
|
||||
|
||||
// NullDate represents a nullable date stored as "YYYY-MM-DD"
|
||||
type NullDate struct {
|
||||
Date time.Time
|
||||
Valid bool
|
||||
}
|
||||
|
||||
// Scan implements the Scanner interface.
|
||||
func (d *NullDate) Scan(value interface{}) error {
|
||||
var ok bool
|
||||
d.Date, ok = value.(time.Time)
|
||||
if !ok {
|
||||
d.Date = time.Time{}
|
||||
d.Valid = false
|
||||
return nil
|
||||
}
|
||||
|
||||
// Zero dates, which primarily come from empty strings in the DB, are treated as being invalid.
|
||||
// TODO: add migration to remove invalid dates from the database and remove this.
|
||||
// Ensure elsewhere that empty date inputs resolve to a null date and not a zero date.
|
||||
// Zero dates shouldn't be invalid.
|
||||
if d.Date.IsZero() {
|
||||
d.Valid = false
|
||||
} else {
|
||||
d.Valid = true
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Value implements the driver Valuer interface.
|
||||
func (d NullDate) Value() (driver.Value, error) {
|
||||
// TODO: don't ignore zero value, as above
|
||||
if !d.Valid || d.Date.IsZero() {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return d.Date.Format(sqliteDateLayout), nil
|
||||
}
|
||||
|
||||
func (d *NullDate) DatePtr() *models.Date {
|
||||
if d == nil || !d.Valid {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &models.Date{Time: d.Date}
|
||||
}
|
||||
|
||||
func NullDateFromDatePtr(d *models.Date) NullDate {
|
||||
if d == nil {
|
||||
return NullDate{Valid: false}
|
||||
}
|
||||
return NullDate{Date: d.Time, Valid: true}
|
||||
}
|
||||
Reference in New Issue
Block a user