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

然后重新编译fastdbmake 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 databasefile");

       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 tablefields时候(TYPE_DESCRIPTOR or CLASS_DESCRIPTOR)使用KEYRAWKEYRAWFIELD等关键字描述类成员,改用FIELD关键字可解决这一问题。

class MyTable {
       char const *str;

       int4      a;

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

};

12-06 13:05