fastDB使用过程中遇到的几个问题

1、编译fastDB
Linux下运行程序提示:

Incompatibility between headers and library

fastdb会假设绝大多数的Linux版是64-bit,如果你的机子是32-bit的,必须将config.h文件的如下内容注释掉:

// #if !defined(_WIN32) || defined(_WIN64) // most unixes are now 64-bit, while 32-bit windows is still quite popular

// #define LARGE_DATABASE_SUPPORT

// #endif

然后重新编译fastdb,make install。

 
2、虚拟机下的运行

VirtualBox Linux下调用dbDatabase::open()打开数据库时,出现如下错误提示:

Failed to create database file

而数据库文件却已成功创建到磁盘上,ls命令可见。

 

跟踪dbDatabase::open()的实现(在dbDatabase.cpp文件内):

int rc = file.open(fileName, databaseName, fileOpenFlags, fileSize, false);

    if (rc != dbFile::ok)

    {

        char msgbuf[64];

        file.errorText(rc, msgbuf, sizeof msgbuf);

        TRACE_MSG(("File open error: %s\n", msgbuf));

        handleError(DatabaseOpenError, "Failed to create database file");

        cleanup(status, 8);

        return false;

}

 

显然是调用dbFile::open()时出错,找到UNIX版本的实现,其中有个mmap的操作:

mmapAddr = (char*)mmap(NULL, mmapSize,

(flags & read_only) ? PROT_READ : PROT_READ|PROT_WRITE,

                    mmap_attr, fd, 0);

其中mmap_attr= MAP_SHARED。

关于mmap文件映射,如果flags设置为MAP_SHARED,则多个进程可共享该文件,一个进程修改了文件,对其他进程而言是可见的。

如果将要映射的文件在虚拟机的共享目录下,则虚拟机进程对该文件的修改,主机进程是无法看见的,类似于NFS文件系统下把文件映射进内存会失败一样,虚拟机的文件系统没有实现跨系统的mmap共享文件机制,mmap却使用了共享标志MAP_SHARED,导致冲突,故而mmap操作失败。

如果将标志改为MAP_PRIVATE,重新编译fastdb源码,再次运行,会看见数据库能正常工作,但数据库文件将无法创建到磁盘上。

如果不想重新编译fastdb源码,可在调用dbDatabase::open()之前设置如下:

dbDatabase  db

db.fileOpenFlags = dbFile::ram_file;

这时数据库文件只在内存中创建,不会进行mmap操作。

 

但是工程应用中需要保存数据库到磁盘,以上两种方法均不可行。解决办法很简单,只要将应用程序复制到share folder以外运行即可,且数据库文件的路径不能是share folder。


3、fastDB浏览器Dbrowse的问题 

Dbrowse看到的table各列乱码的问题:

在descrip table的fields时候(TYPE_DESCRIPTOR or CLASS_DESCRIPTOR)使用KEY、RAWKEY、RAWFIELD等关键字描述类成员,改用FIELD关键字可解决这一问题。

class MyTable {
       char const *str;

       int4      a;

TYPE_DESCRIPTOR((FIELD(str), FIELD(a)));

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值