mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 12:54:38 +03:00
[Files Refactor] Performance tuning (#2865)
* Don't load image files by default * Don't load gallery files by default * Don't load scene files by default * Retry locked transactions forever * Don't show release notes if config not loaded * Don't translate path slashes in export
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
package models
|
||||
|
||||
import "context"
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/stashapp/stash/pkg/file"
|
||||
)
|
||||
|
||||
type SceneIDLoader interface {
|
||||
GetSceneIDs(ctx context.Context, relatedID int) ([]int, error)
|
||||
@@ -26,6 +30,18 @@ type StashIDLoader interface {
|
||||
GetStashIDs(ctx context.Context, relatedID int) ([]StashID, error)
|
||||
}
|
||||
|
||||
type VideoFileLoader interface {
|
||||
GetFiles(ctx context.Context, relatedID int) ([]*file.VideoFile, error)
|
||||
}
|
||||
|
||||
type ImageFileLoader interface {
|
||||
GetFiles(ctx context.Context, relatedID int) ([]*file.ImageFile, error)
|
||||
}
|
||||
|
||||
type FileLoader interface {
|
||||
GetFiles(ctx context.Context, relatedID int) ([]file.File, error)
|
||||
}
|
||||
|
||||
// RelatedIDs represents a list of related IDs.
|
||||
// TODO - this can be made generic
|
||||
type RelatedIDs struct {
|
||||
@@ -189,3 +205,266 @@ func (r *RelatedStashIDs) load(fn func() ([]StashID, error)) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type RelatedVideoFiles struct {
|
||||
primaryFile *file.VideoFile
|
||||
files []*file.VideoFile
|
||||
primaryLoaded bool
|
||||
}
|
||||
|
||||
func NewRelatedVideoFiles(files []*file.VideoFile) RelatedVideoFiles {
|
||||
ret := RelatedVideoFiles{
|
||||
files: files,
|
||||
primaryLoaded: true,
|
||||
}
|
||||
|
||||
if len(files) > 0 {
|
||||
ret.primaryFile = files[0]
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (r *RelatedVideoFiles) SetPrimary(f *file.VideoFile) {
|
||||
r.primaryFile = f
|
||||
r.primaryLoaded = true
|
||||
}
|
||||
|
||||
func (r *RelatedVideoFiles) Set(f []*file.VideoFile) {
|
||||
r.files = f
|
||||
if len(r.files) > 0 {
|
||||
r.primaryFile = r.files[0]
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
}
|
||||
|
||||
// Loaded returns true if the relationship has been loaded.
|
||||
func (r RelatedVideoFiles) Loaded() bool {
|
||||
return r.files != nil
|
||||
}
|
||||
|
||||
// Loaded returns true if the primary file relationship has been loaded.
|
||||
func (r RelatedVideoFiles) PrimaryLoaded() bool {
|
||||
return r.primaryLoaded
|
||||
}
|
||||
|
||||
// List returns the related files. Panics if the relationship has not been loaded.
|
||||
func (r RelatedVideoFiles) List() []*file.VideoFile {
|
||||
if !r.Loaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.files
|
||||
}
|
||||
|
||||
// Primary returns the primary file. Panics if the relationship has not been loaded.
|
||||
func (r RelatedVideoFiles) Primary() *file.VideoFile {
|
||||
if !r.PrimaryLoaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.primaryFile
|
||||
}
|
||||
|
||||
func (r *RelatedVideoFiles) load(fn func() ([]*file.VideoFile, error)) error {
|
||||
if r.Loaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.files, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(r.files) > 0 {
|
||||
r.primaryFile = r.files[0]
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RelatedVideoFiles) loadPrimary(fn func() (*file.VideoFile, error)) error {
|
||||
if r.PrimaryLoaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.primaryFile, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type RelatedImageFiles struct {
|
||||
primaryFile *file.ImageFile
|
||||
files []*file.ImageFile
|
||||
primaryLoaded bool
|
||||
}
|
||||
|
||||
func NewRelatedImageFiles(files []*file.ImageFile) RelatedImageFiles {
|
||||
ret := RelatedImageFiles{
|
||||
files: files,
|
||||
primaryLoaded: true,
|
||||
}
|
||||
|
||||
if len(files) > 0 {
|
||||
ret.primaryFile = files[0]
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// Loaded returns true if the relationship has been loaded.
|
||||
func (r RelatedImageFiles) Loaded() bool {
|
||||
return r.files != nil
|
||||
}
|
||||
|
||||
// Loaded returns true if the primary file relationship has been loaded.
|
||||
func (r RelatedImageFiles) PrimaryLoaded() bool {
|
||||
return r.primaryLoaded
|
||||
}
|
||||
|
||||
// List returns the related files. Panics if the relationship has not been loaded.
|
||||
func (r RelatedImageFiles) List() []*file.ImageFile {
|
||||
if !r.Loaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.files
|
||||
}
|
||||
|
||||
// Primary returns the primary file. Panics if the relationship has not been loaded.
|
||||
func (r RelatedImageFiles) Primary() *file.ImageFile {
|
||||
if !r.PrimaryLoaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.primaryFile
|
||||
}
|
||||
|
||||
func (r *RelatedImageFiles) load(fn func() ([]*file.ImageFile, error)) error {
|
||||
if r.Loaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.files, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(r.files) > 0 {
|
||||
r.primaryFile = r.files[0]
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RelatedImageFiles) loadPrimary(fn func() (*file.ImageFile, error)) error {
|
||||
if r.PrimaryLoaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.primaryFile, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type RelatedFiles struct {
|
||||
primaryFile file.File
|
||||
files []file.File
|
||||
primaryLoaded bool
|
||||
}
|
||||
|
||||
func NewRelatedFiles(files []file.File) RelatedFiles {
|
||||
ret := RelatedFiles{
|
||||
files: files,
|
||||
primaryLoaded: true,
|
||||
}
|
||||
|
||||
if len(files) > 0 {
|
||||
ret.primaryFile = files[0]
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// Loaded returns true if the relationship has been loaded.
|
||||
func (r RelatedFiles) Loaded() bool {
|
||||
return r.files != nil
|
||||
}
|
||||
|
||||
// Loaded returns true if the primary file relationship has been loaded.
|
||||
func (r RelatedFiles) PrimaryLoaded() bool {
|
||||
return r.primaryLoaded
|
||||
}
|
||||
|
||||
// List returns the related files. Panics if the relationship has not been loaded.
|
||||
func (r RelatedFiles) List() []file.File {
|
||||
if !r.Loaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.files
|
||||
}
|
||||
|
||||
// Primary returns the primary file. Panics if the relationship has not been loaded.
|
||||
func (r RelatedFiles) Primary() file.File {
|
||||
if !r.PrimaryLoaded() {
|
||||
panic("relationship has not been loaded")
|
||||
}
|
||||
|
||||
return r.primaryFile
|
||||
}
|
||||
|
||||
func (r *RelatedFiles) load(fn func() ([]file.File, error)) error {
|
||||
if r.Loaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.files, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(r.files) > 0 {
|
||||
r.primaryFile = r.files[0]
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RelatedFiles) loadPrimary(fn func() (file.File, error)) error {
|
||||
if r.PrimaryLoaded() {
|
||||
return nil
|
||||
}
|
||||
|
||||
var err error
|
||||
r.primaryFile, err = fn()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r.primaryLoaded = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user