嵌入式系统上的SQLite

时间:2018-05-08 18:26:15

标签: sqlite arm embedded iot atmel

我正在尝试将SQLite配置为在嵌入式系统(ARM®Cortex®-M7)上运行。我从SQLite网站下载了合并,将其导入到项目中,并添加了以下符号:SQLITE_THREADSAFE = 0,SQLITE_OS_OTHER = 1,SQLITE_OMIT_WAL = 1以允许编译。

然后我下载了test_onefile.c(此处可用:http://www.sqlite.org/vfs.html),它可以让SQLite直接在嵌入式媒体上运行,而无需使用中间文件系统并将其导入项目中(我当然也提供了一个sqlite3_os_init()函数注册VFS)。

SQLITE_API int sqlite3_os_init(void)
{
    extern int fs_register(void);
    return fs_register();
}

在单独的文件中,fs_register()如下所示:

/*
** This procedure registers the fs vfs with SQLite. If the argument is
** true, the fs vfs becomes the new default vfs. It is the only publicly
** available function in this file.
*/
int fs_register(void)
{
    if (fs_vfs.pParent) return SQLITE_OK;

    fs_vfs.pParent = sqlite3_vfs_find(0);
    fs_vfs.base.mxPathname = fs_vfs.pParent->mxPathname;
    fs_vfs.base.szOsFile = MAX(sizeof(tmp_file), sizeof(fs_file));
    return sqlite3_vfs_register(&fs_vfs.base, 0);
}

我可以使用sqlite3_register_vfs(),sqlite3_open()和sqlite3_prepare()成功注册文件系统,打开数据库并准备SQL语句。 打开数据库时,我肯定使用“:memory:”字符串在内存中而不是文件中创建数据库。

static void TestSQLiteOpenDB(void)
{
    /******** setup ********************************/
    sqlite3 *db;
    int rc;

    /******** run element/component under test *****/
    rc = sqlite3_open(":memory:", &db);
    sqlite3_close(db);

    /******** assertion test ***********************/
    TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);
}

我的问题是在尝试运行sqlite3_exec()时。当调用test_onefile.c中的以下代码时,程序崩溃:

/*
** Populate the buffer pointed to by zBufOut with nByte bytes of
** random data.
*/
static int fsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut)
{
   sqlite3_vfs *pParent = ((fs_vfs_t *)pVfs)->pParent;
   return pParent->xRandomness(pParent, nByte, zBufOut);
}

如果我将此功能更改为简单地返回0,则它似乎有效。然后我可以创建表,将数据插入表等...

我的问题是:SQLite是否需要使用随机数据填充此缓冲区,或者这种解决方法是否正常?我不想为自己制造进一步的麻烦,但追踪失败是一个噩梦,我无法完全理解正在发生的事情。

1 个答案:

答案 0 :(得分:3)

SQLite将此随机性用于临时文件,强制更改日志/ WAL文件,生成唯一列名,以及自动增量ID溢出时。

如果返回的值是常量,其中一些可能会进入无限循环,因此您应该尝试获得实际的随机性。 (它不需要加密安全。)