Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3902514
  • 博文数量: 534
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4800
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(534)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(253)

2006年(73)

分类: 数据库开发技术

2008-03-15 18:08:25

自己仿照BDB实例来写的一个小实例, 简单的代码在后面.

db->put()用法注意的:
    当flags设置为0, 当有key相同的时候后面的值将会翻盖原来的值.
    将flags设置为DB_NOOVERWRITE, 当后面值同前面有相同的时候就会报错误:
[gan@localhost 2]$ bdb_per
[0]:: id.0 age.527315018 nm.NM3d7eba4b addr.ADDR1f6e304a
db->put error:DB_KEYEXIST: Key/data pair already exists
   
还有好几个系统代码的实例没有看完, 好好体会, 继续能力!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "db.h"

typedef struct
{
  int id;
  int age;
  char nm[32];
  char addr[128];
} PER;

typedef struct
{
  DB *db;
  char *dbnm;
} PER_DB;
static PER_DB per_db[] = {NULL, "per.db"};

static int per_db_init(PER_DB *per)
{
  int ret;
  DB *db;

  if ((ret = db_create(&db, NULL, 0)) != 0)
  {
    fprintf(stderr, "db_create error:%s\n", db_strerror(ret));
    return (-1);
  }
  per->db = db;

  ret = db->open(db, NULL, per->dbnm, NULL, DB_BTREE, DB_CREATE, 0);
  if (ret != 0)
  {
    fprintf(stderr, "db->open error:%s\n", db_strerror(ret));
    return (-1);
  }

  return (0);
}

static void per_db_term(PER_DB *per)
{
  DB *db = per->db;

  if (db)
    db->close(db, 0);
}

static void get_data(PER *p)
{
  p->id = random();
  snprintf(p->nm, 32, "NM%x", p->id);
  p->age = random()/2;
  snprintf(p->addr, 128, "ADDR%x", p->age);
}

static int per_db_putdata(DB *db)
{
  int i, ret;
  DBT key, v;
  PER per;

  for (i = 0; i < 10; i++)
  {
    memset(&key, 0x00, sizeof(DBT));
    memset(&v, 0x00, sizeof(DBT));
    get_data(&per);
    per.id = i;
    printf("[%d]:: id.%d age.%d nm.%s addr.%s\n"
        , i, per.id, per.age, per.nm, per.addr);

    key.data = &per.id;
    key.size = sizeof(int);

    v.data = &per;
    v.size = sizeof(PER);

    ret = db->put(db, 0, &key, &v, DB_NOOVERWRITE);
    if (ret != 0)
    {
      fprintf(stderr, "db->put error:%s\n", db_strerror(ret));
      return (-1);
    }
  }

  return (0);
}

static int per_db_getdata(DB *db)
{
  int ret, i;
  DBC *dbc;
  DBT key, v;
  PER *per;

  i = 0;
  memset(&key, 0x00, sizeof(DBT));
  memset(&v, 0x00, sizeof(DBT));

  ret = db->cursor(db, NULL, &dbc, 0);
  if (ret != 0)
  {
    fprintf(stderr, "db->cursor error:%s\n", db_strerror(ret));
    return (-1);
  }

  printf("Get Data: \n");
  while ((ret = dbc->c_get(dbc, &key, &v, DB_NEXT)) == 0)
  {
    per = (PER *)v.data;

    printf("[%d] id.%d age.%d nm.%s addr.%s \n"
        , i++, per->id, per->age, per->nm, per->addr);
  }

  dbc->c_close(dbc);
  return (0);
}

/*
 * Main function()
 */

int main(int argc, char **argv)
{
  PER_DB *per = per_db;
  srandom(time(NULL));

  /* create database */
  if (per_db_init(per) < 0)
    goto err_1;

  /* insert data */
  if (per_db_putdata(per->db) < 0)
  {
    per_db_term(per);
    goto err_1;
  }

  /* search data and print */
  if (per_db_getdata(per->db) < 0)
  {
    per_db_term(per);
    goto err_1;
  }

  /* close database */
  per_db_term(per);

  return (0);

err_1:
  return (-1);
}


阅读(2734) | 评论(0) | 转发(0) |
0

上一篇:Berkeley DB实践1

下一篇:学习几个单词!

给主人留下些什么吧!~~