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的基本操作。
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;
}
相关文章推荐
- 系统调用-文件访问 创建、打开、关闭、读、写
- 系统调用-文件访问 创建、打开、关闭、读、写
- javascript入门·Document对象入门讲解(访问表单,创建新页,获取页标题)
- javascript入门·Document对象入门讲解(访问表单,创建新页,获取页标题)
- MMC不能打开文件C:\WINDOWS\system32\devmgmt.msc。这可能是由于文件不存在,不是一个MMC控制台,或者用后来版本的MMC创建 。也可能是由于您没有访问此文件的足够权限
- 关于Berkeley DB打开创建数据库文件
- 深入VCL源码研究DELPHI窗体的创建和关闭
- .Net数据库访问问题:已有打开的与此连接相关联的 DataReader,必须首先将它关闭。
- 03-01 创建和编辑AutoCAD实体(一) 打开和关闭对象
- 解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
- 解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
- 02-03 控制AutoCAD环境(三) 创建、打开、保存和关闭图形
- 关于MMC不能打开文件C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQL Server Enterprise Manager.MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
- js入门·打开/关闭指定URL的窗口/改变链接时候状态栏的文字
- asp.net2.0数据访问(1)-入门-创建数据访问层
- 解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
- 创建、修改、打开、关闭、显示、删除数据库
- 关于MMC不能打开文件C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQL Server Enterprise Manager.MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
- javascript入门·Document对象入门讲解(访问表单,创建新页,获取页标题)
- 深入VCL源码研究Delphi窗体的创建和关闭