stash/pkg/sqlite/transaction.go
WithoutPants 964b559309 Restructure data layer (#2532)
* Add new txn manager interface
* Add txn management to sqlite
* Rename get to getByID
* Add contexts to repository methods
* Update query builders
* Add context to reader writer interfaces
* Use repository in resolver
* Tighten interfaces
* Tighten interfaces in dlna
* Tighten interfaces in match package
* Tighten interfaces in scraper package
* Tighten interfaces in scan code
* Tighten interfaces on autotag package
* Remove ReaderWriter usage
* Merge database package into sqlite
2022-09-06 07:03:40 +00:00

68 lines
1.4 KiB
Go

package sqlite
import (
"context"
"fmt"
"github.com/jmoiron/sqlx"
"github.com/stashapp/stash/pkg/models"
)
type key int
const (
txnKey key = iota + 1
)
func (db *Database) Begin(ctx context.Context) (context.Context, error) {
if tx, _ := getTx(ctx); tx != nil {
return nil, fmt.Errorf("already in transaction")
}
tx, err := db.db.BeginTxx(ctx, nil)
if err != nil {
return nil, fmt.Errorf("beginning transaction: %w", err)
}
return context.WithValue(ctx, txnKey, tx), nil
}
func (db *Database) Commit(ctx context.Context) error {
tx, err := getTx(ctx)
if err != nil {
return err
}
return tx.Commit()
}
func (db *Database) Rollback(ctx context.Context) error {
tx, err := getTx(ctx)
if err != nil {
return err
}
return tx.Rollback()
}
func getTx(ctx context.Context) (*sqlx.Tx, error) {
tx, ok := ctx.Value(txnKey).(*sqlx.Tx)
if !ok || tx == nil {
return nil, fmt.Errorf("not in transaction")
}
return tx, nil
}
func (db *Database) TxnRepository() models.Repository {
return models.Repository{
TxnManager: db,
Gallery: GalleryReaderWriter,
Image: ImageReaderWriter,
Movie: MovieReaderWriter,
Performer: PerformerReaderWriter,
Scene: SceneReaderWriter,
SceneMarker: SceneMarkerReaderWriter,
ScrapedItem: ScrapedItemReaderWriter,
Studio: StudioReaderWriter,
Tag: TagReaderWriter,
SavedFilter: SavedFilterReaderWriter,
}
}