微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 sqlite 数据库嵌入到 C++ 可执行文件中

如何解决将 sqlite 数据库嵌入到 C++ 可执行文件中

我认为我的问题与 this 相关,但那个是关于 png 的,我不确定如何将其转化为我的案例。

我在一个以 .db 结尾的文件中使用 sqlite 创建了一个数据库。现在我有一个只能从这个数据库读取的程序。有没有办法将数据库文件包含到可执行文件中?

现在,如果我编译,我必须将可执行文件文件保存在一起。可以通过将数据库文件放在绝对路径中来删除这种依赖关系,但我也在研究 hpc 集群,所以这不起作用。我需要一个相对路径,以便 db 文件与我的 main.cpp 处于同一层次结构,但我希望能够在不处理 db 文件的情况下复制可执行文件,因此在某种程度上,db 文件已经是可执行文件的一部分。

解决方法

假设您将 SQLite 数据库嵌入到您的二进制文件中,您有一个 const char *embedded_startsize_t embedded_length 表示数据库的开始和长度。

答案取决于您愿意投入多少工作:

  1. 最简单的方法是创建一个临时文件,将 sqlite 字节转储到其中,然后像对待任何其他 SQLite 数据库一样对待它。
FILE *db = tmpfile();
fwrite(embedded_start,embedded_length,1,db);
fflush(db);
std::string path = std::string{"/proc/self/fd/"} + std::to_string(fileno(db));
sqlite3_open_v2(path.c_str(),&dbconn,SQLITE_OPEN_READONLY,nullptr);
  1. 如果您不希望文件在磁盘上逗留,请使用 memfd_create 创建一个文件描述符,将字节加载到其中,然后让 SQLite 打开 /proc/self/fd/X
  2. 实现在内存中执行所有操作的自定义 VFS。 This link 可能是一个开始。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。