在前文LMDB简介的基础上,本文介绍LMDB数据库的基本用法,包括环境environment创建、数据存储put、数据读取get等;
ULONG cvtest_Test4_Lmdb()
{
INT iRet;
MDB_txn *pstTxn = NULL;
MDB_dbi stDbi;
UINT uiKey = 1;
UINT uiData = 100;
iRet = mdb_env_create(&g_pstMdbEnv);
if (0 != iRet)
{
return ERROR_FAILED;
}
mdb_env_set_maxreaders(g_pstMdbEnv, 1);
mdb_env_set_mapsize(g_pstMdbEnv, 4096 * 4096);
if (ERROR_SUCCESS != Lib_CreateDir(CVTEST_LMDB_PATH))
{
mdb_env_close(g_pstMdbEnv);
return ERROR_FAILED;
}
iRet = mdb_env_open(g_pstMdbEnv, CVTEST_LMDB_PATH, MDB_WRITEMAP, 0);
E(iRet, "Env open failed...");
iRet += mdb_txn_begin(g_pstMdbEnv, NULL, 0, &pstTxn);
E(iRet, "Txm begin open failed...");
iRet += mdb_dbi_open(pstTxn, NULL, MDB_CREATE, &stDbi);
E(iRet, "dbi_open failed...");
MDB_val stKey;
MDB_val stData;
stKey.mv_size = sizeof(UINT);
stKey.mv_data = (VOID *)&uiKey;
/* mdb_put 存数据 */
stData.mv_size = sizeof(UINT);
stData.mv_data = (VOID *)&uiData;
iRet = mdb_put(pstTxn, stDbi, &stKey, &stData, 0);
if (iRet != MDB_SUCCESS)
{
printf("mdb_put failed : %s\n", mdb_strerror(iRet));
mdb_env_close(g_pstMdbEnv);
return ERROR_FAILED;
}
mdb_txn_commit(pstTxn);
/* 重新begin一个事务---进行读 */
MDB_txn *pstReadTxn = NULL;
MDB_dbi stDbiRead;
MDB_val stReadValue;
CHAR szBuf[BUF_LEN_100] = {0, };
stReadValue.mv_size = BUF_LEN_100;
stReadValue.mv_data = (VOID *)szBuf;
mdb_txn_begin(g_pstMdbEnv, NULL, MDB_RDONLY, &pstReadTxn);
iRet = mdb_dbi_open(pstReadTxn, NULL, 0, &stDbiRead);
iRet += mdb_get(pstReadTxn, stDbiRead, &stKey, &stReadValue);
if (iRet != MDB_SUCCESS)
{
printf("mdb_get failed : %s\n", mdb_strerror(iRet));
return ERROR_FAILED;
}
printf("stReadValue.data is %d \n", *(UINT *)stReadValue.mv_data);
return ERROR_SUCCESS;
}
#define E(Rest, expr) LMDB_CHECK((Rest) == MDB_SUCCESS, #expr)
#define LMDB_CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
"%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(test)), abort()))
最后,我们将程序编译/得到,得到如下结果。
在相关目录产生数据文件和锁文件。
zglinux cvtest # ls -lrth /home/zhaogang/code_my/lmdb/
total 32K
---------- 1 root root 192 5月 27 21:29 lock.mdb
---------- 1 root root 16M 5月 27 21:29 data.mdb
zglinux cvtest #
结果表明:测试正确。
LMDB全部源码12K行,想要进一步了解其实现的读者可以参阅其源码。源码中也提供mtest、mtest2~mtest6等多个测试案例供参阅。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。