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 选项编译,则会省略此接口。