2021-01-18 01:23:20 +00:00
|
|
|
package sqlite
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
"github.com/stashapp/stash/pkg/models"
|
|
|
|
)
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
type key int
|
2021-01-18 01:23:20 +00:00
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
const (
|
|
|
|
txnKey key = iota + 1
|
|
|
|
)
|
2021-01-18 01:23:20 +00:00
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
func (db *Database) Begin(ctx context.Context) (context.Context, error) {
|
|
|
|
if tx, _ := getTx(ctx); tx != nil {
|
|
|
|
return nil, fmt.Errorf("already in transaction")
|
2021-04-11 23:31:33 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
tx, err := db.db.BeginTxx(ctx, nil)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
2022-05-19 07:49:32 +00:00
|
|
|
return nil, fmt.Errorf("beginning transaction: %w", err)
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
return context.WithValue(ctx, txnKey, tx), nil
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
func (db *Database) Commit(ctx context.Context) error {
|
|
|
|
tx, err := getTx(ctx)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
2022-05-19 07:49:32 +00:00
|
|
|
return err
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
2022-05-19 07:49:32 +00:00
|
|
|
return tx.Commit()
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
func (db *Database) Rollback(ctx context.Context) error {
|
|
|
|
tx, err := getTx(ctx)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
2022-05-19 07:49:32 +00:00
|
|
|
return err
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
2022-05-19 07:49:32 +00:00
|
|
|
return tx.Rollback()
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
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")
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|
2022-05-19 07:49:32 +00:00
|
|
|
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,
|
2021-04-11 23:31:33 +00:00
|
|
|
}
|
2021-01-18 01:23:20 +00:00
|
|
|
}
|