我想使用SQLite在文件中存储一些元数据信息。此文件已经是mmap'd。我想要做的是创建一个SQLite数据库,传入一个char *来告诉它在哪里创建数据库,而不是让它自己分配。可以这样做吗?用于内存数据库的SQLite文档只是说使用“:memory:”,并且DB将在进程结束时被销毁,没有指示如何使用已存在的数据或持久化数据。
如果没有,Linux上有哪些变通方法?是否有“反向”mmap,所以我可以获取一个地址并将其映射到一个新文件? (所以/ foo会看到/ bar的一部分吗?)
答案 0 :(得分:2)
VFS绝对是可行的方法,但您甚至不需要自己编写:sqlite3发行版包含一个已经实现了您需要的文件ext/misc/memvfs.c
:
USAGE:
sqlite3_open_v2("file:/whatever?ptr=0xf05538&sz=14336&max=65536", &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI,
"memvfs");
These are the query parameters:
ptr= The address of the memory buffer that holds the database.
sz= The current size the database file
maxsz= The maximum size of the database. In other words, the
amount of space allocated for the ptr= buffer.
freeonclose= If true, then sqlite3_free() is called on the ptr=
value when the connection closes.
The ptr= and sz= query parameters are required. If maxsz= is omitted,
then it defaults to the sz= value. Parameter values can be in either
decimal or hexadecimal. The filename in the URI is ignored.
答案 1 :(得分:1)
答案 2 :(得分:1)
我不是SQLite专家,但似乎您可以使用此处的信息来使用您自己的分配器,并控制SQLite创建内存数据库的内存位置:https://www.sqlite.org/c3ref/mem_methods.html