您的位置:首页 > 编程语言 > C语言/C++

Berkeley DB 研究入门(一)——创建,打开,访问,关闭

2014-11-20 10:51 309 查看
由于项目的需求,本人对BDB(Berkeley DB)进行研究学习,发现BDB有这么强大,这里先简单说下,后续完善介绍。

长话短说把,先实现一个BDB的基本操作。

Windows 下 BDB的创建,打开,访问,关闭操作,相对完整的代码。当然还有移除操作,后续完善。

注意,当你编译运行程序时,要预先做到以下几点:

1. 把头文件include配置好

2. 相应的lib要添加进工程

3. 由于BDB创建时,不会自动创建文件夹,所以我们要预先创建完成相应的文件夹

当你把这些工作做完时,应该没问题了,就期待着程序的运行成功吧^_^(期间可能些问题,不要放弃,找方法解决,我当时花费两天才通过)

/*
By ivHornet @2014.11
Write a Berkeley DB test program which function is create,open,close.
Procedure:
1. Create, set and open environment
2. Create, set and open database
3. Access database
4. Close database
5. Close environment
*/

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

#include "db.h"

const char *progname = "ex_env";
int EnvFlags =
DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN;

// Setup environment
int db_setup(const char *home,const char *data_dir, FILE *errfp,const char *progname)
{
DB_ENV *dbenv;
DB *dbp;
int ret;

/*
* 创建和初始化BDB环境对象,再设置错误报告
*/
if ((ret = db_env_create(&dbenv,0)) != 0)
{
fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
return 1;
}
dbenv->set_errfile(dbenv, errfp);
dbenv->set_errpfx(dbenv, progname);

/*
* 指定共享池缓冲区大小,而且所有都是以此默认
*/
ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0);
if ( ret != 0)
{
dbenv->err(dbenv, ret, "set_cachesize");
dbenv->close(dbenv, 0);
return 0;
}

/* 数据库设在子目录中 */
(void)dbenv->set_data_dir(dbenv, data_dir);

/* 打开提供事务的环境 */
ret = dbenv->open(dbenv, home, EnvFlags, 0644);
if (ret != 0)
{
dbenv->err(dbenv, ret, "environment open: %s", home);
if (ret == ENOENT)
{
printf("please check whether home dir \"%s\" existed.\n", home);
}
dbenv->close(dbenv, 0);
return 1;
}

/*
* 打开DBENV环境指定数据库目录为正确的
* 然后创建和初始化数据库对象以及它的错误报告
*/
ret = db_create(&dbp, dbenv, 0);
if ( ret )
{
fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
return 1;
}

/* 打开通过DB_TREE方法访问数据的数据库 */
ret = dbp->open(dbp, NULL, "exenv_db1.db", NULL, DB_BTREE, DB_CREATE, 0664);
if (ret)
{
fprintf(stderr, "database open: %s\n", db_strerror(ret));
if (ret==ENOENT)
{
printf("Please check whether data_dir \"%s\" under \"%s\" existed.\n", data_dir, home);
}
return 1;
}

/* 关闭数据库句柄 */
ret = dbp->close(dbp, 0);
if (ret)
{
fprintf(stderr, "database close: %s\n", db_strerror(ret));
return 1;
}

/* 关闭环境句柄 */
ret = dbenv->close(dbenv, 0);
if (ret)
{
fprintf(stderr, "environment close: %s\n", db_strerror(ret));
return 1;
}

// All succeed.
return 0;
}

int main(int argc,char *argv[])
{
int ret = 0;
char *home, *data_dir;

home = "testdir";
data_dir = "db_data";

/*
DB_LOCKDOWN
Lock shared Berkeley DB environment files and memory-mapped databases into memory.
*/
EnvFlags |= DB_LOCKDOWN;

printf("Setup environment\n");
ret = db_setup(home, data_dir, stderr, progname);
//ret = db_setup2(progname);
if (ret)
{
return EXIT_FAILURE;
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BDB Berkeley DB C++开发
相关文章推荐