@zhenni94
2015-08-26T04:49:17.000000Z
字数 2004
阅读 1563
LMDB document: http://symas.com/mdb/doc/
LMDB API: http://symas.com/mdb/doc/group__mdb.html
Example: How to begin and end
// open and begin
if (mdb_env_create(&mdb_env) != MDB_SUCCESS)
mex_error("mdb_env_create failed");
if (mdb_env_set_mapsize(mdb_env, 1099511627776) != MDB_SUCCESS) // 1TB
mex_error("mdb_env_set_mapsize failed");
if (mdb_env_open(mdb_env, dbname.c_str(), 0, 0664) != MDB_SUCCESS)
mex_error("mdb_env_open failed");
if (mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn) != MDB_SUCCESS)
mex_error("mdb_txn_begin failed");
if (mdb_open(mdb_txn, NULL, 0, &mdb_dbi) != MDB_SUCCESS)
mex_error("mdb_open failed");
// commit and close
if (mdb_txn_commit(mdb_txn) != MDB_SUCCESS)
mex_error("mdb_txn_commit failed");
mdb_close(mdb_env, mdb_dbi);
mdb_env_close(mdb_env);
Example: How to put some data into the database
string value;
datum.SerializeToString(&value);
// ------- store in db ---------
mdb_data.mv_size = value.size();
mdb_data.mv_data = reinterpret_cast<void*>(&value[0]);
mdb_key.mv_size = keystr.size();
mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]);
//save data item
if ((status = mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0)) != MDB_SUCCESS) {
ostringstream oss;
oss << "mdb_put failed, status = " << status;
mex_error(oss.str());
}
if (++count % BATCH_N == 0) {
// transaction commit
if ((status = mdb_txn_commit(mdb_txn)) != MDB_SUCCESS) {
ostringstream oss;
oss << "mdb_txn_commit failed, status = " << status;
mex_error(oss.str());
}
// transaction begin
if ((status = mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn)) != MDB_SUCCESS) {
ostringstream oss;
oss << "mdb_txn_begin failed, status = " << status;
mex_error(oss.str());
}
ostringstream oss;
oss << "Processed " << count << " patches." << std::endl;
mex_info(oss.str());
}
Example: How to use cursor
int retval;
MDB_cursor* cursor;
retval = mdb_cursor_open(read_txn_, dbi_, &cursor);
CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval);
MDB_val mdbkey;
MDB_val mdbval;
retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_LAST);
CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval);
mdb_cursor_close(cursor);
if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data),
mdbkey.mv_size, key)) {
LOG(ERROR) << "failed to deserialize key";
}