| /* |
| * Copyright 2017 Dgraph Labs, Inc. and Contributors |
| * |
| * 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 badger |
| |
| // ManagedDB allows end users to manage the transactions themselves. Transaction |
| // start and commit timestamps are set by end-user. |
| // |
| // This is only useful for databases built on top of Badger (like Dgraph), and |
| // can be ignored by most users. |
| // |
| // WARNING: This is an experimental feature and may be changed significantly in |
| // a future release. So please proceed with caution. |
| type ManagedDB struct { |
| *DB |
| } |
| |
| // OpenManaged returns a new ManagedDB, which allows more control over setting |
| // transaction timestamps. |
| // |
| // This is only useful for databases built on top of Badger (like Dgraph), and |
| // can be ignored by most users. |
| func OpenManaged(opts Options) (*ManagedDB, error) { |
| opts.managedTxns = true |
| db, err := Open(opts) |
| if err != nil { |
| return nil, err |
| } |
| return &ManagedDB{db}, nil |
| } |
| |
| // NewTransaction overrides DB.NewTransaction() and panics when invoked. Use |
| // NewTransactionAt() instead. |
| func (db *ManagedDB) NewTransaction(update bool) { |
| panic("Cannot use NewTransaction() for ManagedDB. Use NewTransactionAt() instead.") |
| } |
| |
| // NewTransactionAt follows the same logic as DB.NewTransaction(), but uses the |
| // provided read timestamp. |
| // |
| // This is only useful for databases built on top of Badger (like Dgraph), and |
| // can be ignored by most users. |
| func (db *ManagedDB) NewTransactionAt(readTs uint64, update bool) *Txn { |
| txn := db.DB.NewTransaction(update) |
| txn.readTs = readTs |
| return txn |
| } |
| |
| // CommitAt commits the transaction, following the same logic as Commit(), but |
| // at the given commit timestamp. This will panic if not used with ManagedDB. |
| // |
| // This is only useful for databases built on top of Badger (like Dgraph), and |
| // can be ignored by most users. |
| func (txn *Txn) CommitAt(commitTs uint64, callback func(error)) error { |
| if !txn.db.opt.managedTxns { |
| return ErrManagedTxn |
| } |
| txn.commitTs = commitTs |
| return txn.Commit(callback) |
| } |
| |
| // PurgeVersionsBelow will delete all versions of a key below the specified version |
| func (db *ManagedDB) PurgeVersionsBelow(key []byte, ts uint64) error { |
| txn := db.NewTransactionAt(ts, false) |
| defer txn.Discard() |
| return db.purgeVersionsBelow(txn, key, ts) |
| } |