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:
WithoutPants
2023-03-17 10:52:49 +11:00
committed by GitHub
parent c3081700c0
commit 7cff71c35f
105 changed files with 2647 additions and 1086 deletions

View File

@@ -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 {