嵌入式系统上的 SQLite

Posted

技术标签:

【中文标题】嵌入式系统上的 SQLite【英文标题】:SQLite on Embedded System 【发布时间】:2018-05-08 18:26:14 【问题描述】:

我正在尝试将 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 中是否需要用随机数据填充此缓冲区,或者这种解决方法是否可行?我不想让自己更加头疼,但是将其作为失败点来追踪是一场噩梦,我无法完全理解正在发生的事情。

【问题讨论】:

感谢您的发帖,这对我帮助很大。你能分享你的实现的任何教程或源代码吗?我也在尝试在 M7 中使用 SQLite,但没有成功。谢谢。 【参考方案1】:

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

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

【讨论】:

以上是关于嵌入式系统上的 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

在嵌入式系统/微控制器中运行 SQLITE 的最低硬件规范

数据库—SQLite3

精品博文基于嵌入式系统的SQLite C/C++接口

SQLite-嵌入式迷你数据库

Sqlite嵌入式数据库讲解

SQLite