mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
Add filesystem based blob storage (#3187)
* Refactor transaction hooks. Add preCommit * Add BlobStore * Use blobStore for tag images * Use blobStore for studio images * Use blobStore for performer images * Use blobStore for scene covers * Don't generate screenshots in legacy directory * Run post-hooks outside original transaction * Use blobStore for movie images * Remove unnecessary DestroyImage methods * Add missing filter for scene cover * Add covers to generate options * Add generate cover option to UI * Add screenshot migration * Delete thumb files as part of screenshot migration
This commit is contained in:
@@ -32,7 +32,7 @@ const (
|
||||
dbConnTimeout = 30
|
||||
)
|
||||
|
||||
var appSchemaVersion uint = 44
|
||||
var appSchemaVersion uint = 45
|
||||
|
||||
//go:embed migrations/*.sql
|
||||
var migrationsBox embed.FS
|
||||
@@ -64,12 +64,16 @@ func (e *MismatchedSchemaVersionError) Error() string {
|
||||
}
|
||||
|
||||
type Database struct {
|
||||
Blobs *BlobStore
|
||||
File *FileStore
|
||||
Folder *FolderStore
|
||||
Image *ImageStore
|
||||
Gallery *GalleryStore
|
||||
Scene *SceneStore
|
||||
Performer *PerformerStore
|
||||
Studio *studioQueryBuilder
|
||||
Tag *tagQueryBuilder
|
||||
Movie *movieQueryBuilder
|
||||
|
||||
db *sqlx.DB
|
||||
dbPath string
|
||||
@@ -82,20 +86,29 @@ type Database struct {
|
||||
func NewDatabase() *Database {
|
||||
fileStore := NewFileStore()
|
||||
folderStore := NewFolderStore()
|
||||
blobStore := NewBlobStore(BlobStoreOptions{})
|
||||
|
||||
ret := &Database{
|
||||
Blobs: blobStore,
|
||||
File: fileStore,
|
||||
Folder: folderStore,
|
||||
Scene: NewSceneStore(fileStore),
|
||||
Scene: NewSceneStore(fileStore, blobStore),
|
||||
Image: NewImageStore(fileStore),
|
||||
Gallery: NewGalleryStore(fileStore, folderStore),
|
||||
Performer: NewPerformerStore(),
|
||||
Performer: NewPerformerStore(blobStore),
|
||||
Studio: NewStudioReaderWriter(blobStore),
|
||||
Tag: NewTagReaderWriter(blobStore),
|
||||
Movie: NewMovieReaderWriter(blobStore),
|
||||
lockChan: make(chan struct{}, 1),
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (db *Database) SetBlobStoreOptions(options BlobStoreOptions) {
|
||||
*db.Blobs = *NewBlobStore(options)
|
||||
}
|
||||
|
||||
// Ready returns an error if the database is not ready to begin transactions.
|
||||
func (db *Database) Ready() error {
|
||||
if db.db == nil {
|
||||
@@ -433,6 +446,12 @@ func (db *Database) optimise() {
|
||||
}
|
||||
}
|
||||
|
||||
// Vacuum runs a VACUUM on the database, rebuilding the database file into a minimal amount of disk space.
|
||||
func (db *Database) Vacuum(ctx context.Context) error {
|
||||
_, err := db.db.ExecContext(ctx, "VACUUM")
|
||||
return err
|
||||
}
|
||||
|
||||
func (db *Database) runCustomMigrations(ctx context.Context, fns []customMigrationFunc) error {
|
||||
for _, fn := range fns {
|
||||
if err := db.runCustomMigration(ctx, fn); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user