热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

Berkeley DB 简单综合范例

来源: 作者: 时间:2007-12-02 Tag: 点击:

在参考前一篇代码基础上,有所添加。在Red Hat Linux 8.0平台,测试通过。

在第一次运行的时候,要在应用程序所在的目录新建立一个文件夹“dbtestENV”,存放环境用;其次,要把注释掉的代码还原,因为得向空的数据库里添加数据。之后可以注释掉。

程序大意:在一个环境(dbenv)中打开两个数据库(dbp1, dbp2),建立指向两个数据库的游标(cur1, cur2),dbp1是在一个事务(txn)中运行。对两个数据库的动作都是添加数据,查找显示数据。

#include <db.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>

void print_error(int ret)
{
 if(ret != 0)
  printf("ERROR: %s\n",db_strerror(ret));
}

void init_DBT(DBT * key, DBT * data)
{
 memset(key, 0, sizeof(DBT));
 memset(data, 0, sizeof(DBT));
}

int main(void)
{
 DB *dbp1, *dbp2;          
 DBT key, data;
 DB_ENV *dbenv;
 DBC *cur1, *cur2;
 DB_TXN *txn = NULL;
 u_int32_t flags; 
 int ret;

 char *fruit = "apple";
/* int number = 15;
 char *orange = "orange";
 int number2 = 10;
*/
 typedef struct customer
 {
  int  c_id;
  char name[10];
  char address[20];
  int  age;
 } CUSTOMER;
 CUSTOMER cust;

 cust.c_id = 1;
 strncpy(cust.name, "javer", 9);
 strncpy(cust.address, "chengdu", 19);
 cust.age = 32;
 

 ret = db_env_create(&dbenv, 0);
 print_error(ret);

 ret = dbenv->open(dbenv, "./dbtestENV", DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK| DB_INIT_MPOOL|DB_INIT_TXN, 0);
 print_error(ret);

 ret = db_create(&dbp1, dbenv, 0);
 print_error(ret);

 ret = dbenv->txn_begin(dbenv, NULL, &txn, 0);
 print_error(ret);

 flags = DB_CREATE;
 ret = dbp1->open(dbp1, txn, "single.db", NULL, DB_BTREE, flags, 0);
 print_error(ret);
 
 ret = dbp1->cursor(dbp1, txn, &cur1, 0);
 print_error(ret);
 
 init_DBT(&key, &data);
 key.data = fruit;
 key.size = strlen(fruit) + 1;
/* data.data = &number;
 data.size = sizeof(int);
 ret = dbp1->put(dbp1, txn, &key, &data, DB_NOOVERWRITE);
 print_error(ret);
 init_DBT(&key, &data);
 key.data = orange;
 key.size = strlen(orange) + 1;
 data.data = &number2;
 data.size = sizeof(int);
 ret = dbp1->put(dbp1, txn, &key, &data, DB_NOOVERWRITE);
 print_error(ret);
*/
 while((ret = cur1->c_get(cur1, &key, &data, DB_NEXT)) == 0)
 {
  printf("The fruit = %s, The number = %d\n", (char *)(key.data), *(int*)(data.data));
 }

 ret = db_create(&dbp2, dbenv, 0);
 print_error(ret);

 flags = DB_CREATE;   

 ret = dbp2->open(dbp2, NULL, "complex.db",NULL, DB_HASH, flags, 0);
 print_error(ret);

 ret = dbp2->cursor(dbp2, NULL, &cur2, 0);
 print_error(ret);
 
 init_DBT(&key, &data);
 key.size = sizeof(int);
 key.data = &(cust.c_id);
 data.data = &cust;
 data.ulen = sizeof(CUSTOMER);
 data.flags = DB_DBT_USERMEM;

 //ret = dbp2->put(dbp2, NULL, &key, &data,DB_NOOVERWRITE);
 //print_error(ret);

 while((ret = cur2->c_get(cur2, &key, &data, DB_NEXT)) == 0)
 {
  printf("c_id = %d name = %s address = %s age = %d\n",
   cust.c_id, cust.name, cust.address, cust.age);
 }

 ret = cur1->c_close(cur1);
 print_error(ret);
 ret = cur2->c_close(cur2);
 print_error(ret);
 ret = txn->commit(txn, 0);
 print_error(ret);
 if(dbp1 != NULL)
  dbp1->close(dbp1, 0);
 if(dbp2 != NULL)
  dbp2->close(dbp2, 0);
     dbenv->close(dbenv, 0);
 return 0;
}




相关文章:
SQLite3 C/C++ 开发接口简介(API函数) 二
SQLite3 使用教学
Scaling out MySQL - Hardware today and tomorro
SQLite适用的范围
sybase cursor declare
SQL语句大全精要
用户配额
decode函数
Oracle 数据库创建表空间、创建用户指定表空间
MySQL教会我使用GnuPG验证软件包
MySQL中MyISAM引擎与InnoDB引擎性能简单测试
initdb
mysqladmin在线帮助文档
CentOS 4.7 安装Oracle 9.2.0.4的一些问题
文本如何导入oracle(sqlldr 的用法)
ORA-00600: 内部错误代码,自变量: [16201], [],
分布式Oracle的database link
install a MySQL source distribution
Mysql备份脚本(未验证)
oracle 9.2.0.1 update 9.2.0.5
每小时Dump所有mysql数据库到NAS存储设备上
Oracle SCN机制解析
Account LOCKED(TIMED)
MySQL数据库5.0的my.cnf配置选项
oracle存储过程中调用其他用户的表
修改sqlplus提示符
MYSQL建表实例
一些对Mysql DBA有用的脚本
Oracle DBA 强悍挑战OS 64位 Solaris 10-真正休
[Bugzilla]由Mysql迁移到Oracle的方法