小巧。快速。可靠。
三者选其二。

SQLite C 接口

反序列化数据库

int sqlite3_deserialize(
  sqlite3 *db,            /* The database connection */
  const char *zSchema,    /* Which DB to reopen with the deserialization */
  unsigned char *pData,   /* The serialized database content */
  sqlite3_int64 szDb,     /* Number bytes in the deserialization */
  sqlite3_int64 szBuf,    /* Total size of buffer pData[] */
  unsigned mFlags         /* Zero or more SQLITE_DESERIALIZE_* flags */
);

sqlite3_deserialize(D,S,P,N,M,F) 接口导致 数据库连接 D 断开与数据库 S 的连接,然后基于 P 中包含的序列化数据重新打开 S 作为内存数据库。序列化数据库 P 的大小为 N 字节。M 是缓冲区 P 的大小,可能大于 N。如果 M 大于 N,并且 F 中未设置 SQLITE_DESERIALIZE_READONLY 位,则 SQLite 允许向内存数据库添加内容,只要总大小不超过 M 字节。

如果 F 中设置了 SQLITE_DESERIALIZE_FREEONCLOSE 位,则当数据库连接关闭时,SQLite 将对序列化缓冲区调用 sqlite3_free()。如果设置了 SQLITE_DESERIALIZE_RESIZEABLE 位,则如果数据库上的写入导致其大小超过 M 字节,SQLite 将尝试使用 sqlite3_realloc64() 增加缓冲区大小。

应用程序不得在数据库连接 D 关闭之前修改缓冲区 P 或使其失效。

如果数据库当前处于读取事务中或参与备份操作,则 sqlite3_deserialize() 接口将以 SQLITE_BUSY 失败。

无法反序列化到 TEMP 数据库。如果 sqlite3_deserialize(D,S,P,N,M,F) 的 S 参数为“temp”,则函数返回 SQLITE_ERROR。

反序列化的数据库不应该处于 WAL 模式。如果数据库处于 WAL 模式,则任何尝试使用数据库文件的操作都将导致 SQLITE_CANTOPEN 错误。应用程序可以在调用 sqlite3_deserialize(D,S,P,N,M,F) 之前将输入数据库 P 的 文件格式版本号(第 18 和 19 个字节)设置为 0x01,以强制数据库文件进入回滚模式并解决此限制。

如果 sqlite3_deserialize(D,S,P,N,M,F) 由于任何原因失败,并且如果参数 F 中设置了 SQLITE_DESERIALIZE_FREEONCLOSE 位,则在返回之前,sqlite3_free() 将在参数 P 上调用。

如果 SQLite 使用 SQLITE_OMIT_DESERIALIZE 选项编译,则会省略此接口。

另请参见 对象常量函数 列表。