berkerly db 中简单的读写操作,有一些C的 还有一些C++的

最近在倒腾BDB,才发现自己确实在C++这一块能力很弱,看了一天的api文档,总算是把BDB的一些api之间的关系理清了,希望初学者要理清数据库基本知识中的环境,句柄,游标的基本概念,这样有助于你更好地理解BDB的程序理解理念吧。(此处要注意,BDB的Database相当于一般数据库的数据表,Environment相当于数据库。)

以下是berkerly db的各个文档的介绍:(这是C的,C++的一样)

  BDB_Installation.pdf: BDB的安装文档,涵盖了不同操作系统,不同的编译工具,不同编程语言等多方面的详细信息;

  BDB_Prog_Reference.pdf: 该文档是使用BDB的开发人员的参考手册,主要从BDB的各种功能和机制的原理进行阐述,供使用BDB作为存储引擎来编写程序的各类程序员(C、Java、C#、Perl)阅读;

  BDB-Porting-Guide.pdf: 该文档是给需要将BDB移植到一个新的平台开发人员准备的;

  InMemoryDBApplication.pdf: 基于内存的BDB应用的相关知识;

  BDB-C_APIReference.pdf: C API参考手册,跟BDB_Prog_Reference.pdf结合使用;

  BerkeleyDB-Core-C-GSG.pdf: 为C语言开发人员提供的BDB的入门手册;

  BerkeleyDB-Core-C-Txn.pdf: 为C语言开发人员提供的BDB事务方面的手册;

  Replication-C-GSG.pdf: 为C语言开发人员提供的BDB复制方面的手册;

具体的介绍我做完这个项目,会详细总结以下,现在先简单说说它的读写,可以节省一些不想看文档的人的时间吧。

  首先是C语言的读写,这一块我也是从网上找的,因为C语言的比较简单,自己也没有太多尝试,但是以下代码亲测可用。

  这个例子就是建立一个简单的数据库,打开数据库,写一个记录进去,然后读出记录,然后将写入的记录删除,然后关闭environment和数据库。

  

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//only this head should include for use bdb.
#include <db.h>   
#define DATABASE "yangjian.db"

int main()
{
    DB_ENV *myEnv;
    DB *dbp;
    DBT key, data;
    int ret,t_ret;
    u_int32_t env_flags;
    //........... Create an environment object and initialize it for error reporting
    ret = db_env_create(&myEnv, 0);
    if (ret != 0)
    {
          fprintf(stderr, "Error creating env handle: %s\n", db_strerror(ret));
          return -1;
    }
    //........If the environment does not exist create it. Initialize the in-memory cache.
    env_flags = DB_CREATE | DB_INIT_MPOOL;
    //........Open the environment.
    ret = myEnv->open(myEnv,"/home/yangbin1/yangjian/my/db/testevn",env_flags,0);
    if (ret != 0)
    {
          fprintf(stderr, "Environment open failed: %s", db_strerror(ret));
          return -1;
    }

    if ((ret = db_create(&dbp, myEnv, 0)) != 0)
    {
          fprintf(stderr, "db_create: %s\n", db_strerror(ret));
          exit (1);
    }

    if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0)
    {
          dbp->err(dbp, ret, "%s", DATABASE);
          exit (1);
    }
    memset(&key, 0, sizeof(key));
    memset(&data, 0, sizeof(data)); key.data = "sport";
    key.size = sizeof("sport");
    data.data = "football";
    data.size = sizeof("football");
/*
    //......put data
    if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
    {
          printf("db: %s: key stored.\n", (char *)key.data);
    }
      else
    {
          dbp->err(dbp, ret, "DB->put");
    }
*/

    //........put data NOOVERWRITE
    if ((ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) == 0)
    printf("db: %s: key stored.\n", (char *)key.data);
    else dbp->err(dbp, ret, "DB->put");

    //.......get data
    if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
    printf("db: %s: key retrieved: data was %s.\n", (char *)key.data, (char *)data.data);
    else
    dbp->err(dbp, ret, "DB->get");

    //......del data
    if((ret = dbp->del(dbp, NULL, &key, 0)) == 0)
    printf("db: %s: key was deleted.\n", (char *)key.data);
    else
    dbp->err(dbp, ret, "DB->del");

    //.........close, only when the db successful closed,the data can real write to the disk.
    //if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0)
    //ret = t_ret;
    //exit(ret);
    if (dbp != NULL)
    dbp->close(dbp, 0);
    //.........close evn
    //........When you are done with an environment, you must close it.
    //........Before you close an environment, make sure you close any opened databases
    if (myEnv != NULL)
    myEnv->close(myEnv, 0);

    return 0;
}

注意ret的使用,在文档中会看到很多关于返回值的叙述,过一段时间我会 认真总结一下。

  然后是C++的编写,这里我分为初级版,中级版,以及我暂时还达不到的终极版。

  首先是初级版,就是排除了任何异常处理,几乎是最简单的读写操作,这也是我打算在我这个简单的小玩意里使用的。

  这一段是我在csdn上找的一个人写的,他总结的比我知道的要多的多:http://blog.csdn.net/mxzy55560593/article/details/7063965

  然后是中级版,中级版就是加了简单的异常处理,就是我上一篇博文里的那个简单示例:http://www.cnblogs.com/sexybear/p/3472501.html

  最后是终极版,终极版是进行了很复杂的考虑,但也几乎是最保险的了,是oracle的维护人员写的,能写出那样的代码也是我的目标:http://www.bdbchina.com/2009/02/berkeley-db%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F%E8%AF%A6%E8%A7%A3-1/

这些几乎都是我收集来的,还没有我自己写的,是因为我自己能力还没超过这些示例,还是不要献丑了,不过等过一段时间闲下来还是会好好做一些关于BDB的自己的总结的。希望这些能对大家有用吧,谢谢了。