// Copyright 2023 Harness, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package dbtx import ( "context" "database/sql" "github.com/jmoiron/sqlx" ) // New returns new database Runner interface. func New(db *sqlx.DB) AccessorTx { mx := getLocker(db) run := &runnerDB{ db: sqlDB{db}, mx: mx, } return run } // transactor is combines data access capabilities with transaction starting. type transactor interface { Accessor startTx(ctx context.Context, opts *sql.TxOptions) (TransactionAccessor, error) } // sqlDB is a wrapper for the sqlx.DB that implements the transactor interface. type sqlDB struct { *sqlx.DB } var _ transactor = (*sqlDB)(nil) func (db sqlDB) startTx(ctx context.Context, opts *sql.TxOptions) (TransactionAccessor, error) { tx, err := db.DB.BeginTxx(ctx, opts) return tx, err }