package ledis

// import (
// 	"errors"
// 	"fmt"
// 	"github.com/siddontang/go/log"
// 	"github.com/siddontang/ledisdb/store"
// )

// var (
// 	ErrNestTx = errors.New("nest transaction not supported")
// 	ErrTxDone = errors.New("Transaction has already been committed or rolled back")
// )

// type Tx struct {
// 	*DB

// 	tx *store.Tx

// 	data *store.BatchData
// }

// func (db *DB) IsTransaction() bool {
// 	return db.status == DBInTransaction
// }

// // Begin a transaction, it will block all other write operations before calling Commit or Rollback.
// // You must be very careful to prevent long-time transaction.
// func (db *DB) Begin() (*Tx, error) {
// 	log.Warn("Transaction support will be removed later, use your own risk!!!")

// 	if db.IsTransaction() {
// 		return nil, ErrNestTx
// 	}

// 	tx := new(Tx)

// 	tx.data = &store.BatchData{}

// 	tx.DB = new(DB)
// 	tx.DB.l = db.l

// 	tx.l.wLock.Lock()

// 	tx.DB.sdb = db.sdb

// 	var err error
// 	tx.tx, err = db.sdb.Begin()
// 	if err != nil {
// 		tx.l.wLock.Unlock()
// 		return nil, err
// 	}

// 	tx.DB.bucket = tx.tx

// 	tx.DB.status = DBInTransaction

// 	tx.DB.index = db.index

// 	tx.DB.kvBatch = tx.newBatch()
// 	tx.DB.listBatch = tx.newBatch()
// 	tx.DB.hashBatch = tx.newBatch()
// 	tx.DB.zsetBatch = tx.newBatch()
// 	tx.DB.setBatch = tx.newBatch()

// 	tx.DB.lbkeys = db.lbkeys

// 	return tx, nil
// }

// func (tx *Tx) Commit() error {
// 	if tx.tx == nil {
// 		return ErrTxDone
// 	}

// 	err := tx.l.handleCommit(tx.data, tx.tx)
// 	tx.data.Reset()

// 	tx.tx = nil

// 	tx.l.wLock.Unlock()

// 	tx.DB.bucket = nil

// 	return err
// }

// func (tx *Tx) Rollback() error {
// 	if tx.tx == nil {
// 		return ErrTxDone
// 	}

// 	err := tx.tx.Rollback()
// 	tx.data.Reset()
// 	tx.tx = nil

// 	tx.l.wLock.Unlock()
// 	tx.DB.bucket = nil

// 	return err
// }

// func (tx *Tx) newBatch() *batch {
// 	return tx.l.newBatch(tx.tx.NewWriteBatch(), &txBatchLocker{}, tx)
// }

// func (tx *Tx) Select(index int) error {
// 	if index < 0 || index >= int(tx.l.cfg.Databases) {
// 		return fmt.Errorf("invalid db index %d", index)
// 	}

// 	tx.DB.index = uint8(index)
// 	return nil
// }
