int LMDBEngine::Del(const Slice& key) { LMDBContext& holder = m_ctx_local.GetValue(); MDB_txn *txn = holder.readonly_txn; if (NULL == txn || holder.batch_write == 0) { MDB_val k; k.mv_data = const_cast<char*>(key.data()); k.mv_size = key.size(); mdb_txn_begin(m_env, NULL, 0, &txn); mdb_del(txn, m_dbi, &k, NULL); mdb_txn_commit(txn); return 0; } DelOperation* op = new DelOperation; op->key.assign((const char*) key.data(), key.size()); m_write_queue.Push(op); if (holder.batch_write == 0) { CheckPointOperation* ck = new CheckPointOperation(holder.cond); m_write_queue.Push(ck); NotifyBackgroundThread(); ck->Wait(); DELETE(ck); return 0; } return 0; }
int LMDBEngine::Put(const Slice& key, const Slice& value, const Options& options) { LMDBContext& holder = m_ctx_local.GetValue(); MDB_txn *txn = holder.readonly_txn; if (NULL == txn || holder.batch_write == 0) { MDB_val k, v; k.mv_data = const_cast<char*>(key.data()); k.mv_size = key.size(); v.mv_data = const_cast<char*>(value.data()); v.mv_size = value.size(); CHECK_OP(mdb_txn_begin(m_env, NULL, 0, &txn)); CHECK_OP(mdb_put(txn, m_dbi, &k, &v, 0)); CHECK_OP(mdb_txn_commit(txn)); return 0; } PutOperation* op = new PutOperation; op->key.assign((const char*) key.data(), key.size()); op->value.assign((const char*) value.data(), value.size()); m_write_queue.Push(op); if (holder.batch_write == 0) { CheckPointOperation* ck = new CheckPointOperation(holder.cond); m_write_queue.Push(ck); NotifyBackgroundThread(); ck->Wait(); DELETE(ck); return 0; } return 0; }
int LMDBEngine::DiscardBatchWrite() { LMDBContext& holder = m_ctx_local.GetValue(); holder.batch_write--; if (holder.batch_write == 0) { CheckPointOperation* ck = new CheckPointOperation(holder.cond); m_write_queue.Push(ck); NotifyBackgroundThread(); ck->Wait(); DELETE(ck); } return 0; }