Указан неверный флаг в БД Беркли с использованием C - PullRequest
0 голосов
/ 30 августа 2011

Ниже мой код:

#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);
}

1 Ответ

3 голосов
/ 31 августа 2011

Быстрый взгляд на документацию для DB-> get говорит: «Чтобы указать DB_SET_RECNO, базовая база данных должна иметь тип Btree и должна быть создана с флагом DB_RECNUM».

Не похоже, что вы создали базу данных с этим флагом.Я не просмотрел остальную часть вашего кода, но это одно очевидное место, которое нужно исправить.

Вы также можете задать эти вопросы на онлайн-форуме Berkeley DB .

С уважением,

Дэйв

...