Ste*_*eve 5 sqlite embedded arm atmel iot
我正在尝试将 SQLite 配置为在嵌入式系统(ARM\xc2\xae Cortex\xc2\xae-M7)上运行。我已经从 SQLite 网站下载了合并文件,将其导入到项目中,并添加了以下符号:SQLITE_THREADSAFE=0、SQLITE_OS_OTHER=1、SQLITE_OMIT_WAL=1 以允许其编译。
\n\n然后我下载了 test_onefile.c (可在此处获取: http: //www.sqlite.org/vfs.html),它应该允许 SQLite 直接在嵌入式媒体上运行,而不使用中间文件系统并将其导入到项目中(我是还要确保提供 sqlite3_os_init() 函数来注册 VFS)。
\n\nSQLITE_API int sqlite3_os_init(void)\n{\n extern int fs_register(void);\n return fs_register();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n在单独的文件中,fs_register() 如下所示:
\n\n/*\n** This procedure registers the fs vfs with SQLite. If the argument is\n** true, the fs vfs becomes the new default vfs. It is the only publicly\n** available function in this file.\n*/\nint fs_register(void)\n{\n if (fs_vfs.pParent) return SQLITE_OK;\n\n fs_vfs.pParent = sqlite3_vfs_find(0);\n fs_vfs.base.mxPathname = fs_vfs.pParent->mxPathname;\n fs_vfs.base.szOsFile = MAX(sizeof(tmp_file), sizeof(fs_file));\n return sqlite3_vfs_register(&fs_vfs.base, 0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n我可以使用 sqlite3_register_vfs()、sqlite3_open() 和 sqlite3_prepare() 成功注册文件系统、打开数据库并准备 SQL 语句。\n打开数据库时,我确定使用“:memory:”字符串来创建数据库在内存中而不是作为文件。
\n\nstatic void TestSQLiteOpenDB(void)\n{\n /******** setup ********************************/\n sqlite3 *db;\n int rc;\n\n /******** run element/component under test *****/\n rc = sqlite3_open(":memory:", &db);\n sqlite3_close(db);\n\n /******** assertion test ***********************/\n TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n我的问题是尝试运行 sqlite3_exec() 时。当调用 test_onefile.c 中的以下代码时,程序崩溃:
\n\n/*\n** Populate the buffer pointed to by zBufOut with nByte bytes of\n** random data.\n*/\nstatic int fsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut)\n{\n sqlite3_vfs *pParent = ((fs_vfs_t *)pVfs)->pParent;\n return pParent->xRandomness(pParent, nByte, zBufOut);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n如果我将此函数更改为仅返回 0,它似乎可以工作。然后我可以创建表,将数据插入表等......
\n\n我的问题是:SQLite 是否需要用随机数据填充此缓冲区,或者这个解决方法可以吗?我不想给自己制造更多的麻烦,但将其作为失败点进行追踪是一场噩梦,我无法完全理解正在发生的事情。
\nSQLite 将这种随机性用于临时文件、强制更改日志/WAL 文件、生成唯一的列名以及自动增量 ID 溢出时。
如果返回的值是恒定的,其中一些可能会进入无限循环,因此您应该尝试获得实际的随机性。(它不需要加密安全。)
归档时间: |
|
查看次数: |
2249 次 |
最近记录: |