• 下载代码

https://github.com/LMDB/lmdb

  • 解压
make && sudo make install

注意需要的是lmdb.h还是lmdb++.h。

  • 配置

检查.bashrc的,如果没有/usr/local/lib,要加上。

  • 简单测试

先在当前目录先:

mkdir testdb

再执行:

./mtest
  • 代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>#include <fcntl.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
#include <sys/stat.h> #include "lmdb.h"#define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr)
#define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0))
#define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \"%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(rc)), abort()))#define TEST_DB_DIR  "./testdb"int main(int argc,char * argv[])
{int i = 0, j = 0, rc;MDB_env *env;MDB_dbi dbi;MDB_val key, data;MDB_txn *txn;MDB_stat mst;MDB_cursor *cursor, *cur2;MDB_cursor_op op;int count;int *values;char sval[32] = "";mkdir(TEST_DB_DIR, S_IRWXU | S_IRWXG | S_IRWXO);srand(time(NULL));count = (rand()%384) + 64;values = (int *)malloc(count*sizeof(int));for(i = 0;i<count;i++) {values[i] = rand()%1024;}E(mdb_env_create(&env));E(mdb_env_set_maxreaders(env, 1));E(mdb_env_set_mapsize(env, 10485760));E(mdb_env_open(env, TEST_DB_DIR, MDB_FIXEDMAP /*|MDB_NOSYNC*/, 0664));E(mdb_txn_begin(env, NULL, 0, &txn));E(mdb_dbi_open(txn, NULL, 0, &dbi));key.mv_size = sizeof(int);key.mv_data = sval;printf("Adding %d values\n", count);for (i=0;i<count;i++) {  sprintf(sval, "%03x %d foo bar", values[i], values[i]);/* Set <data> in each iteration, since MDB_NOOVERWRITE may modify it */data.mv_size = sizeof(sval);data.mv_data = sval;if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) {j++;data.mv_size = sizeof(sval);data.mv_data = sval;}}if (j) printf("%d duplicates skipped\n", j);E(mdb_txn_commit(txn));E(mdb_env_stat(env, &mst));E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));E(mdb_cursor_open(txn, dbi, &cursor));while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {printf("key: %p %.*s, data: %p %.*s\n",key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,data.mv_data, (int) data.mv_size, (char *) data.mv_data);}CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get");mdb_cursor_close(cursor);mdb_txn_abort(txn);j=0;key.mv_data = sval;for (i= count - 1; i > -1; i-= (rand()%5)) {j++;txn=NULL;E(mdb_txn_begin(env, NULL, 0, &txn));sprintf(sval, "%03x ", values[i]);if (RES(MDB_NOTFOUND, mdb_del(txn, dbi, &key, NULL))) {j--;mdb_txn_abort(txn);} else {E(mdb_txn_commit(txn));}}free(values);printf("Deleted %d values\n", j);E(mdb_env_stat(env, &mst));E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));E(mdb_cursor_open(txn, dbi, &cursor));printf("Cursor next\n");while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {printf("key: %.*s, data: %.*s\n",(int) key.mv_size,  (char *) key.mv_data,(int) data.mv_size, (char *) data.mv_data);}CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get");printf("Cursor last\n");E(mdb_cursor_get(cursor, &key, &data, MDB_LAST));printf("key: %.*s, data: %.*s\n",(int) key.mv_size,  (char *) key.mv_data,(int) data.mv_size, (char *) data.mv_data);printf("Cursor prev\n");while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) {printf("key: %.*s, data: %.*s\n",(int) key.mv_size,  (char *) key.mv_data,(int) data.mv_size, (char *) data.mv_data);}CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get");printf("Cursor last/prev\n");E(mdb_cursor_get(cursor, &key, &data, MDB_LAST));printf("key: %.*s, data: %.*s\n",(int) key.mv_size,  (char *) key.mv_data,(int) data.mv_size, (char *) data.mv_data);E(mdb_cursor_get(cursor, &key, &data, MDB_PREV));printf("key: %.*s, data: %.*s\n",(int) key.mv_size,  (char *) key.mv_data,(int) data.mv_size, (char *) data.mv_data);mdb_cursor_close(cursor);mdb_txn_abort(txn);printf("Deleting with cursor\n");E(mdb_txn_begin(env, NULL, 0, &txn));E(mdb_cursor_open(txn, dbi, &cur2));for (i=0; i<50; i++) {if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, MDB_NEXT)))break;printf("key: %p %.*s, data: %p %.*s\n",key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,data.mv_data, (int) data.mv_size, (char *) data.mv_data);E(mdb_del(txn, dbi, &key, NULL));}printf("Restarting cursor in txn\n");for (op=MDB_FIRST, i=0; i<=32; op=MDB_NEXT, i++) {if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, op)))break;printf("key: %p %.*s, data: %p %.*s\n",key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,data.mv_data, (int) data.mv_size, (char *) data.mv_data);}mdb_cursor_close(cur2);E(mdb_txn_commit(txn));printf("Restarting cursor outside txn\n");E(mdb_txn_begin(env, NULL, 0, &txn));E(mdb_cursor_open(txn, dbi, &cursor));for (op=MDB_FIRST, i=0; i<=32; op=MDB_NEXT, i++) {if (RES(MDB_NOTFOUND, mdb_cursor_get(cursor, &key, &data, op)))break;printf("key: %p %.*s, data: %p %.*s\n",key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,data.mv_data, (int) data.mv_size, (char *) data.mv_data);}mdb_cursor_close(cursor);mdb_txn_abort(txn);mdb_dbi_close(env, dbi);mdb_env_close(env);return 0;
}

LINUX使用C调用LMDB的方法相关推荐

  1. 嵌入式linux mplayer,QT调用mplayer 的方法

    安装mplayer,之后目录下会有个mplayer-core.exe 提取出来.放到源码下面. 代码: QProcess *mplayerProcess = new QProcess(this); Q ...

  2. linux内核栈与用户栈及调用栈观察方法

    最近linux内核的中断部分,总是被书里的栈弄晕,一会儿内核栈,一会儿用户栈的--很是崩溃,在网上google了一下 找了一篇不错的文章拿来分享. 5.8 Linux 系统中堆栈的使用方法 本节内容概 ...

  3. 在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法

    在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法 1 致谢和参考文章 1.1 致谢 1.2 参考文章 2 环境介绍 3 整体思路 4 ...

  4. 测试掌握的Linux解压,轻松掌握Linux压缩/解压文件的方法

    对于在Linux下解压大型的*.zip文件,相信大家一般都会通过使用winrar直接在smb中来进行解压的操作,虽然说最终可能能够解压但有时候会存在解压时间长或者网络原因出错等故障的情况出现.那么有没 ...

  5. python源程序执行的方式是什么执行-python调用可执行文件的方法

    最近要用到python调用C程序,因此,看了一下python调用别的程序的方法.大致来说,python调用C/C++有两种方式,一种是调用C编译的动态链接库,即so文件,一种是调用C生成的可执行文件. ...

  6. Linux的僵尸进程及其解决方法(转)

    Linux的僵尸进程及其解决方法 摘要: Linux的僵尸进程及其解决方法 1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将 ...

  7. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  8. Linux下动态链接库调用

    Linux下动态链接库调用 2014-11-01 10:39 3人阅读 评论(0) 收藏 编辑 删除 Linux下动态链接库调用 2013-06-08 20:52:48|  分类:集成开发环境相关 | ...

  9. 在linux上获得线程id的方法

    From: http://www.linuxidc.com/Linux/2014-01/94723.htm 我使用了第二种方法,很方便: #define gettid() syscall(__NR_g ...

  10. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现

    转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...

最新文章

  1. PCL学习笔记,区域生长分割(region growing segmentation)
  2. 使用Ansible批量部署SSH免密登录远程主机
  3. jquery 按钮效果 正常、移上、按下
  4. anaconda使用github代码_使用这几款插件,能让你在GitHub看代码的效率翻倍
  5. Cmake构建_选择debug与release的库
  6. 从php的生命周期来优化页面响应时间
  7. redis实现CAS
  8. 阿里巴巴都害怕的区块链电商到底是什么?
  9. 高中数学联赛二试怎么准备
  10. 使用unity3d 接入anySDK的总结2
  11. 怎样实现订单和销量快速增长?电商小程序的五大裂变玩法需了解!
  12. linux pdf 加水印,将动态水印添加到PDF
  13. 高等数学 下册 第九章 平面及空间点集 笔记
  14. stm32c8t6运行freertos
  15. 分子动力学模拟Amber/Gromacs结合自由能计算 药效团模型构建RMSD、RMSF
  16. ImageCombiner图片合成工具
  17. 商用量子通信计算机,首次完成商用专网测试 量子通信商业化时代到来
  18. chrome android 85,终于!安卓版Chrome 85将升级到原生64位:支持Android 10及以上系统...
  19. PPI是什么?pixels per inch像素密度是什么?PPI如何计算?
  20. 04、05、06三年盘点:为了生命的意义--Surfer(新的一学期继续更新。。。。谢谢 ^_^)

热门文章

  1. Microsoft Sql Server 2008 R2 Express 下载地址推荐
  2. tp3.2 批量插入
  3. 为什么开发人员必须要了解数据库锁?
  4. 长春去哪辅导高二理综好?高中生数理化培优补差辅导
  5. 连接mongoDB根据ObjectID写入json数据(初步)
  6. 牛客网Java刷题知识点之调用线程类的start()方法和run()方法的区别
  7. 极客学院文本爬虫实战
  8. 关于SVN更新时文件加锁的小结
  9. VS2010与VS2012变化的快捷键
  10. DNS迭代查询与递归查询的区别