[关闭]
@zhenni94 2015-08-26T04:49:17.000000Z 字数 2004 阅读 1403

Notes: LMDB API

LMDB document: http://symas.com/mdb/doc/
LMDB API: http://symas.com/mdb/doc/group__mdb.html

Example: How to begin and end

  1. // open and begin
  2. if (mdb_env_create(&mdb_env) != MDB_SUCCESS)
  3. mex_error("mdb_env_create failed");
  4. if (mdb_env_set_mapsize(mdb_env, 1099511627776) != MDB_SUCCESS) // 1TB
  5. mex_error("mdb_env_set_mapsize failed");
  6. if (mdb_env_open(mdb_env, dbname.c_str(), 0, 0664) != MDB_SUCCESS)
  7. mex_error("mdb_env_open failed");
  8. if (mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn) != MDB_SUCCESS)
  9. mex_error("mdb_txn_begin failed");
  10. if (mdb_open(mdb_txn, NULL, 0, &mdb_dbi) != MDB_SUCCESS)
  11. mex_error("mdb_open failed");
  12. // commit and close
  13. if (mdb_txn_commit(mdb_txn) != MDB_SUCCESS)
  14. mex_error("mdb_txn_commit failed");
  15. mdb_close(mdb_env, mdb_dbi);
  16. mdb_env_close(mdb_env);

Example: How to put some data into the database

  1. string value;
  2. datum.SerializeToString(&value);
  3. // ------- store in db ---------
  4. mdb_data.mv_size = value.size();
  5. mdb_data.mv_data = reinterpret_cast<void*>(&value[0]);
  6. mdb_key.mv_size = keystr.size();
  7. mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]);
  8. //save data item
  9. if ((status = mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0)) != MDB_SUCCESS) {
  10. ostringstream oss;
  11. oss << "mdb_put failed, status = " << status;
  12. mex_error(oss.str());
  13. }
  14. if (++count % BATCH_N == 0) {
  15. // transaction commit
  16. if ((status = mdb_txn_commit(mdb_txn)) != MDB_SUCCESS) {
  17. ostringstream oss;
  18. oss << "mdb_txn_commit failed, status = " << status;
  19. mex_error(oss.str());
  20. }
  21. // transaction begin
  22. if ((status = mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn)) != MDB_SUCCESS) {
  23. ostringstream oss;
  24. oss << "mdb_txn_begin failed, status = " << status;
  25. mex_error(oss.str());
  26. }
  27. ostringstream oss;
  28. oss << "Processed " << count << " patches." << std::endl;
  29. mex_info(oss.str());
  30. }

Example: How to use cursor

  1. int retval;
  2. MDB_cursor* cursor;
  3. retval = mdb_cursor_open(read_txn_, dbi_, &cursor);
  4. CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval);
  5. MDB_val mdbkey;
  6. MDB_val mdbval;
  7. retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_LAST);
  8. CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval);
  9. mdb_cursor_close(cursor);
  10. if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data),
  11. mdbkey.mv_size, key)) {
  12. LOG(ERROR) << "failed to deserialize key";
  13. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注