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.
I couldn't find the problem. But when i'm using DB_BTREE instead of DB_RECNO, it working perfect.