c - 非法标志在使用 C 的 berkeley DB 中指定错误

标签 c berkeley-db

下面是我的代码:

#include <sys/types.h>
                           #include <stdio.h>
                           #include <string.h>
                           #include <stdlib.h>
                           #include <db.h>

                           #define  DATABASE "access.db"

                       typedef struct {

                   char data1[20];
                   char src[20];
                    } pearson_record;

我收到错误:

指定给 DB->get 的非法标志 DB->get: 无效参数

知道我哪里出错了。

                       int
                       main()

                {


                     pearson_record s;
                 char *papa="1.1.1.1";
                 char *source="papa";
                 DB *dbp;
                 DBT key, data;
                 int ret, t_ret;
                 db_recno_t recno;



    if ((ret = db_create(&dbp, NULL, 0)) != 0) {
        fprintf(stderr, "db_create: %s\n", db_strerror(ret));
        exit (1);
    }
    if ((ret = dbp->open(dbp,
        NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
        dbp->err(dbp, ret, "%s", DATABASE);
        goto err;
    }


    recno = 10;

#define BUFFER_LENGTH   (5 * 1024 * 1024)
data.ulen = BUFFER_LENGTH;
    data.flags = DB_DBT_USERMEM;

    strncpy(s.data1, papa, strlen(papa)+1);
    strncpy(s.src, source, strlen(source)+1);

    memset(&key, 0, sizeof(key));
    memset(&data, 0, sizeof(data));
    //memset(&s, 0, sizeof(struct pearson_record));
    key.data = &recno;
    key.size = sizeof(recno);
    data.data = &s;
    data.size = sizeof(s);


    papa="1.1.1.2";
    source="papaa";
        strncpy(s.data1, papa, strlen(papa)+1);
    strncpy(s.src, source, strlen(source)+1);


        if ((ret = dbp->put(dbp, NULL, &key,&data,0)) == 0)
    printf("db: %d: key stored.\n", *(int *)key.data);
    else
    {
        dbp->err(dbp, ret, "DB->put");
        goto err;
    }
    recno = 11;


    strncpy(s.data1, papa, strlen(papa)+1);
    strncpy(s.src, source, strlen(source)+1);

    memset(&key, 0, sizeof(key));
    memset(&data, 0, sizeof(data));
    //memset(&s, 0, sizeof(struct pearson_record));
    key.data = &recno;
    key.size = sizeof(recno);
    data.data = &s;
    data.size = sizeof(s);


    papa="1.1.1.2";
    source="papaa";
    strncpy(s.data1, papa, strlen(papa)+1);
    strncpy(s.src, source, strlen(source)+1);


    if ((ret = dbp->put(dbp, NULL, &key,&data,0)) == 0)
    printf("db: %d: key stored.\n", *(int *)key.data);
    else
    {
        dbp->err(dbp, ret, "DB->put");
        goto err;
    }
    pearson_record *ppr;
         if ((ret = dbp->get(dbp, NULL, &key, &data, DB_SET_RECNO)) == 0) {

    ppr = (pearson_record *) data.data;

    printf("db: %d: key retrieved: data was %s,%s. %d\n",
            *(int *)key.data, ppr->data1,ppr->src, data.size);
    }
    else {
        dbp->err(dbp, ret, "DB->get");
        goto err;
    }

if ((ret = dbp->get(dbp, NULL, &key, &data, DB_SET_RECNO)) == 0) {

    ppr = (pearson_record *) data.data;

    printf("db: %d: key retrieved: data was %s,%s. %d\n",
            *(int *)key.data, ppr->data1,ppr->src, data.size);
    }
    else {
        dbp->err(dbp, ret, "DB->get");
        goto err;
    }



err:    if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0)
        ret = t_ret; 


    exit(ret);
}

最佳答案

快速浏览 DB->get 的文档说:“要指定 DB_SET_RECNO,底层数据库必须是 Btree 类型,并且必须使用 DB_RECNUM 标志创建。”

看起来您没有使用该标志创建数据库。我没有查看您的其余代码,但这是一个明显需要修复的地方。

您也可以在线咨询这些问题Berkeley DB forum .

问候,

戴夫

关于c - 非法标志在使用 C 的 berkeley DB 中指定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238955/

相关文章:

c - C语言分离输出数据

c++ - 从 C、C++ 在 Linux 中发出系统命令

java - Windows下C和java编译过程

c++ - 无法使用 libssh2 进行编译

java - Berkeley DB可以在java中异步使用吗?

java - Berkeley DB 的 GUI

使用 Bison 的 C 到 Forth 解析器

java - Berkley 使用散列配置将数据更新为新值

optimization - 向 BerkeleyDB-JE 插入数据越来越慢

c - Berkeley DB 中的函数指针迭代器