我试图用bdb的c api访问mysql建立的bdb表,但是出现了些状况!
具体进行了如下步骤:
CREATE TABLE `t_bdb` (
  `i` int(11) default NULL
) ENGINE=BerkeleyDB
此时,相应的目录生成了一个t_bdb.db文件
我用如下代码访问该文件,结果在 DB->open() 抛出异常 :
files containing multiple databases may only be opened read-only
db_open: Invalid argument

#include <stdio.h>
#include <db.h>
#include <string.h>//gcc -o mydb mydb.c -I/usr/local/BerkeleyDB.4.1/include/ /usr/local/BerkeleyDB.4.1/lib/libdb.so -lpthread
//gcc -o mydb mydb.c -I/usr/local/BerkeleyDB.4.8/include/ /usr/local/BerkeleyDB.4.8/lib/libdb.soint
main()
{
DB *dbp = NULL;
DB_ENV *myEnv = NULL;
u_int32_t db_flags = 0;
u_int32_t env_flags = 0;
int ret; ret = db_env_create(&myEnv, 0);
if(ret != 0)
{
dbp->err(NULL, ret, "db_env_create");
return -1;
} env_flags = DB_CREATE |
     DB_INIT_MPOOL;
ret = myEnv->open(myEnv,
"/usr/local/mysql/data/test/",
env_flags,
0); if(ret != 0)
        {
printf("%d\n", ret);
return -1;
        } //myEnv->set_cachesize(myEnv, 0, 5 * 1024 * 1024, 0); ret = db_create(&dbp, myEnv, 0);
if(ret != 0)
{
dbp->err(dbp, ret, "db_create");
return 1;
} db_flags = DB_CREATE;
ret = dbp->open(dbp,
     NULL,
     "/usr/local/mysql/data/test/t_bdb.db",
     /*"./env/my_db.db",*/
     NULL,
     DB_BTREE,
     db_flags,
      0); if(ret != 0)
{
printf("%d.\n", ret);
dbp->err(dbp, ret, "db_open");
dbp->close(dbp, 0);
return 1;
}#if 0
DBT key, data;
float money;

memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
DBC *cursor;  dbp->cursor(dbp, NULL, &cursor, 0);/*
money = 12.1;
key.data = &money;
key.size = sizeof(float);
*/
        while((ret = cursor->get(cursor, &key, &data, DB_NEXT)) == 0)
        {
                printf("key: %f\n", *(int*)key.data);
                printf("data: %s\n", (char*)data.data);
                printf("%d\n", data.size);
        } if(cursor != NULL)
cursor->close(cursor);
#endif if(dbp != NULL)
dbp->close(dbp, 0);
if(myEnv != NULL)
myEnv->close(myEnv, 0);

}用bdb自带的工具db_stat查看.db文件的属性.
db_stat -d /usr/local/mysql/data/test/t_bdb.db 
Fri Sep 25 16:40:23 2009        Local time
53162   Btree magic number
9       Btree version number
Little-endian   Byte order
multiple-databases      Flags
2       Minimum keys per-page
4096    Underlying database page size
1007    Overflow key/data size
1       Number of levels in the tree
2       Number of unique keys in the tree
2       Number of data items in the tree
0       Number of tree internal pages
0       Number of bytes free in tree internal pages (0% ff)
1       Number of tree leaf pages
4026    Number of bytes free in tree leaf pages (1% ff)
0       Number of tree duplicate pages
0       Number of bytes free in tree duplicate pages (0% ff)
0       Number of tree overflow pages
0       Number of bytes free in tree overflow pages (0% ff)
0       Number of empty pages
0       Number of pages on the free list红字中说明t_bdb.db文件中有多个databases(这里的database的概念与关系数据库中的不同),在网上找了很多资料,都没有具体说明如何打开这种 multiple-databases的数据文件!不知谁是否曾经遇上这样的问题!