wangya072 发表于 2012-12-26 15:39

berkeley db 如何检测数据库已经存在

berkeley db 如何检测数据库已经存在#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <db.h>

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

int main ()
{
        DB_ENV        *dbenv         = NULL;
        DB        *dbp        = NULL;
        int         ret         = 0;
        DBC        *dbc        = NULL;
        DBT        key         = {0,};
        DBT        data        = {0,};
        int         i        = 10;       
        #if 1
        if (db_env_create (&dbenv, 0)) {
                printf ("db_env_create %s\n", db_strerror (ret));
                goto out;
        }
        printf ("env create success\n");
        //dbenv->set_errpfx (dbenv, "brick_name");
       
        ret = dbenv->open (dbenv, "/tmp/wyz",
                DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK|
                        DB_INIT_MPOOL, 0);
        if (ret) {
                printf ("dbenv_open :%s\n", db_strerror (ret));       
                goto out;
        }
        #endif
        ret = db_create (&dbp, dbenv, 0);
        if (ret) {
                printf ("db_create %s\n", db_strerror (ret));
                goto out;
        }
        ret = dbp->open (dbp, NULL, "a.db", NULL, DB_HASH, DB_CREATE, 0);
        if (ret) {
                printf ("db_open %s\n", db_strerror (ret));
                goto out;
        }
        ret = dbp->cursor (dbp, NULL, &dbc, 0);
        if (ret) {
                printf ("cursor : %s\n", db_strerror (ret));
                goto out;
        }
        init_dbt (&key, &data);
        key.data = &i;
        key.size = sizeof (int);
        data.data = &i;
        data.size = sizeof (int);

        while (i) {
                printf ("put ===============key = %d data = %d\n",*(int*)key.data, *(int*)data.data );
                ret = dbp->put (dbp, NULL, &key, &data, DB_NOOVERWRITE);
                if (ret) {
                        printf ("db_put %s\n", db_strerror (ret));
                        break;
                }
                i--;
        }
        while (1) {
                ret = dbc->get (dbc, &key, &data, DB_NEXT);
                sleep (1);
                if (ret) {
                        printf ("cursor get : %s\n", db_strerror (ret));
                        break;
                }
                printf ("get ===================key = %d data = %d\n",*(int*)key.data, *(int*)data.data );
        }
out:
        return ret;       
}

bsdc 发表于 2013-01-09 21:41

同问啊,万一程序以外终止,没有进行正常关闭,销毁句柄,再次起来,就会出现在put时候卡住的情况.

真米那么 发表于 2013-02-02 16:35

路过看看了~:lol:victory:
页: [1]
查看完整版本: berkeley db 如何检测数据库已经存在