#include <lmdb/lmdb.h>
#include <iostream>
#include <direct.h>
#include <string>
using namespace std;
inline void MDB_CHECK(int mdb_status){//错误检测
if (mdb_status != MDB_SUCCESS){
cout << "error" << mdb_strerror(mdb_status) << endl;
return;
}
else{
return;
}
}
void main(){
string key("hello man");
string value("20160713");
const size_t LMDB_MAP_SIZE = 1073741824;//lmdb的大小
//MDB_env 为一个结构体,Opaque structure for a database environment.
MDB_env* mdb_env_;
MDB_dbi mdb_dbi_;
//int mdb_env_create(MDB_env** env)
//它的作用就是创建一个LMDB的环境handle,这个函数会为MDB_env结构体分配一个内存。
//输入参数是&mdb_env_,执行前mdb_env_=NULL,执行后mdb_env_值为分配的内存地址
//我们使用handle 的时候,首先要用mdb_env_open()函数打开,最后也要调用mdb_env_close()函数释放掉内存
MDB_CHECK(mdb_env_create(&mdb_env_));
// int mdb_env_set_mapsize ( MDB_env * env, size_t size)
// 作用:设置环境的memory map 的大小;注意:默认大小 为:10485760 bytes
MDB_CHECK(mdb_env_set_mapsize(mdb_env_, LMDB_MAP_SIZE));
if (_mkdir("D:\\1byav\\Caffe_Detail\\tmp") != 0){
cout << "mkdir failed\n";
//system("pause");
//return;
}
int flag = 0;
//int mdb_env_open (MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode)
// http://104.237.133.194/doc/group__mdb.html#ga32a193c6bf4d7d5c5d579e71f22e9340
MDB_CHECK(mdb_env_open(mdb_env_, "D:\\1byav\\Caffe_Detail\\tmp", flag, 0664));
cout << "open lmdb " << "D:\\1byav\\Caffe_Detail\\tmp" << endl;
//write
//MDB_txn :Opaque structure for a transaction handle.
MDB_txn* mdb_txn;
//int mdb_txn_begin (MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **txn)
//Create a transaction for use with the environment.
MDB_CHECK(mdb_txn_begin(mdb_env_, NULL, 0, &mdb_txn));
// int mdb_dbi_open ( MDB_txn * txn, const char * name, unsigned int flags, MDB_dbi * dbi)
// dbi Address where the new MDB_dbi handle will be stored
MDB_CHECK(mdb_dbi_open(mdb_txn, NULL, 0, &mdb_dbi_));
/*
typedef struct MDB_val {
size_t mv_size; //size of the data item
void *mv_data; //address of the data item
} MDB_val;
*/
MDB_val mdb_key, mdb_value;
mdb_key.mv_data = const_cast<char*>(key.data());
mdb_key.mv_size = key.size();
mdb_value.mv_data = const_cast<char*>(value.data());
mdb_value.mv_size = value.size();
// int mdb_put (MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data, unsigned int flags)
// Store items into a database
MDB_CHECK(mdb_put(mdb_txn, mdb_dbi_, &mdb_key, &mdb_value, 0));
// int mdb_txn_commit (MDB_txn *txn)
// Commit all the operations of a transaction into the database.
MDB_CHECK(mdb_txn_commit(mdb_txn));
if (mdb_env_ != NULL){
mdb_dbi_close(mdb_env_, mdb_dbi_);
mdb_env_close(mdb_env_);
mdb_env_ = NULL;
}
cout << "finish write!" << endl<<endl;
flag = MDB_RDONLY | MDB_NOTLS;
MDB_CHECK(mdb_env_create(&mdb_env_));
MDB_CHECK(mdb_env_set_mapsize(mdb_env_, LMDB_MAP_SIZE));
MDB_CHECK(mdb_env_open(mdb_env_, "D:\\1byav\\Caffe_Detail\\tmp", flag, 0664));
cout << "open lmdb " << "D:\\1byav\\Caffe_Detail\\tmp" << endl;
MDB_cursor* mdb_cursor;
MDB_CHECK(mdb_txn_begin(mdb_env_, NULL, MDB_RDONLY, &mdb_txn));
MDB_CHECK(mdb_dbi_open(mdb_txn, NULL, 0, &mdb_dbi_));
//int mdb_cursor_open (MDB_txn *txn, MDB_dbi dbi, MDB_cursor **cursor)
// Create a cursor handle.
MDB_CHECK(mdb_cursor_open(mdb_txn, mdb_dbi_, &mdb_cursor));
// int mdb_cursor_get (MDB_cursor *cursor, MDB_val *key, MDB_val *data, MDB_cursor_op op)
// retrieves key/data pairs from the database
mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_FIRST);
cout << string(static_cast<const char*>(mdb_key.mv_data), mdb_key.mv_size) << endl;
cout << string(static_cast<const char*>(mdb_value.mv_data), mdb_value.mv_size) << endl;
cout << "finish write!" << endl << endl;
system("pause");
}
http://www.cnblogs.com/yinheyi/p/5986629.html?utm_source=itdadao&utm_medium=referral
http://104.237.133.194/doc/group__mdb.html#ga32a193c6bf4d7d5c5d579e71f22e9340