Search code examples
cdatabaseberkeley-db

Berkeley DB Reading a data fail


I'm working on Berkeley DB for exparimental reasons. But i have a problem about reading a file from DB.

When the procedure like

  • Create db

  • open

  • write

  • read

  • close

in an execution there is no problem at all.

But when i write data to db file, and close it, then open it again and try to read, it throws an error. There is no compiling error or any warning in the code. In the dbRead() method, when program enters db->get (...) part, it throws an error like ;

    BDB1001 illegal record number size
    get error ( 22 ): Invalid argument

My code that writing to DB is;

    int dbWrite()
    {
    DB  *db;
    DBT key, data;
    int ret;
    ret = db_create( &db, NULL, 0 );

    if( ret != 0 )
    {
        db->err( db, ret, "db_create error ( %d )", ret );
        return 1;
    }

    ret = db->set_re_source( db, "db" );

    if( ret != 0 )
    {
        db->err( db, ret, "set_re_source error ( %d )", ret );
        return 2;
    }

    ret = db->open( db, NULL, "db", NULL, DB_RECNO, DB_CREATE, 0 );
    if( ret != 0 )
    {
        db->err( db, ret, "open error ( %d )", ret );
        return 3;
    }

    memset( &key, 0, sizeof( key ) );
    key.data = "key";
    key.size = strlen( "key" );

    memset( &data, 0, sizeof( data ) );
    data.data = "data";
    data.size = strlen( "data" );

    ret = db->put( db, NULL, &key, &data, DB_APPEND );

    if( ret != 0 )
    {
        db->err( db, ret, "put error ( %d )", ret );
        return 4;
    }


    ret = db->close( db, 0 );
    if( ret != 0 )
    {
        fprintf( stderr, "close error ( %d )", ret );
    /*  db->err( db, ret, "" ); */
        return 7;
    }
    return 12;

}

My code that reading from DB is (part that program throws error is in here.)

    int dbRead(){
    DB  *db;
    DBT  data;
    int ret;

    ret = db_create( &db, NULL, 0 );

    if( ret != 0 )
    {
        db->err( db, ret, "db_create error ( %d )", ret );
        return 1;
    }
    ret = db->set_re_source( db, "db" );

    if( ret != 0 )
    {
        db->err( db, ret, "set_re_source error ( %d )", ret );
        return 2;
    }

    ret = db->open( db, NULL, "db", NULL, DB_RECNO, DB_CREATE, 0 );
    if( ret != 0 )
    {
        db->err( db, ret, "open error ( %d )", ret );
        return 3;
    }

    memset( &key, 0, sizeof( key ) );
    key.data = "key";
    key.size = strlen( "key" );

    memset( &data, 0, sizeof( data ) );
    data.size = 255;

    ret = db->get( db, NULL, &key, &data, 0 );
    if( ret != 0 )
    {
        db->err( db, ret, "get error ( %d )", ret );
        return 5;
    }
    printf( "OK \n" );
    printf( "Data: %s \n", data.data );
    return 11;
};

Also, dbWrite's return is 12. And dbRead's return is 5. I'm aware that point is db->get method but i couldn't find really thing.


Solution

  • I couldn't find the problem. But when i'm using DB_BTREE instead of DB_RECNO, it working perfect.