lmdb读写

#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

https://blog.csdn.net/u012235274/article/details/51899598

https://blog.csdn.net/zhaogang1993/article/details/79440492

猜你喜欢

转载自blog.csdn.net/zlf19910726/article/details/81144293
今日推荐