开发者

illegal flag specified error in berkeley DB using C

Below is my code:

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

I am geting the error:

illegal flag specified to DB->get DB->get: Invalid argument

Any idea where I am going wrong.

                       int
                       main()

                {


                     pears开发者_如何学编程on_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);
}


A quick glance at the documentation for DB->get says: "For DB_SET_RECNO to be specified, the underlying database must be of type Btree, and it must have been created with the DB_RECNUM flag."

It doesn't look like you created the database with that flag. I haven't looked through the rest of your code, but that's one obvious place that needs to be fixed.

You can also ask these questions on the online Berkeley DB forum.

Regards,

Dave

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜