SQLite C 接口
为增量 I/O 打开一个 BLOB
int sqlite3_blob_open( sqlite3*, const char *zDb, const char *zTable, const char *zColumn, sqlite3_int64 iRow, int flags, sqlite3_blob **ppBlob );
该接口打开位于数据库 zDb 中行 iRow、列 zColumn、表 zTable 中的 BLOB的句柄;换句话说,相同的 BLOB 将由以下人员选择:
SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
参数 zDb 不是包含数据库的文件名,而是数据库的符号名称。对于附加数据库,这是出现在ATTACH语句中 AS 关键字之后的名称。对于主数据库文件,数据库名称是“main”。对于 TEMP 表,数据库名称是“temp”。
如果标志参数不为零,则打开 BLOB 以进行读写访问。如果标志参数为零,则打开 BLOB 以进行只读访问。
成功时,将返回SQLITE_OK并将新的BLOB 句柄存储在 *ppBlob 中。否则返回一个错误代码,除非错误代码是 SQLITE_MISUSE,*ppBlob 被设置为 NULL。这意味着,只要 API 未被滥用, 在该函数返回后调用 *ppBlob 上的sqlite3_blob_close()总是安全的。
如果以下任一情况为真,此函数将失败并返回 SQLITE_ERROR:
- 数据库 zDb 不存在,
- 数据库 zDb 中不存在表 zTable,
- 表 zTable 是一个 WITHOUT ROWID 表,
- 列 zColumn 不存在,
- 表中不存在行 iRow,
- iRow 行的指定列包含一个不是 TEXT 或 BLOB 值的值,
- 列 zColumn 是索引、PRIMARY KEY 或 UNIQUE 约束的一部分,并且正在打开 blob 以进行读/写访问,
- 外键约束已启用,列 zColumn 是子键定义的一部分,并且正在打开 blob 以进行读/写访问。
除非返回 SQLITE_MISUSE,否则此函数设置 数据库连接错误代码和消息,可通过 sqlite3_errcode()和sqlite3_errmsg()及相关函数访问。
sqlite3_blob_open() 引用的 BLOB 可以使用 sqlite3_blob_read()接口读取并 使用sqlite3_blob_write () 修改。可以使用sqlite3_blob_reopen() 接口将BLOB 句柄移动到同一表的不同行。但是,打开BLOB 句柄 后,不能更改BLOB 句柄的列、表或数据库。
如果 BLOB 句柄指向的行被 UPDATE、DELETE或ON CONFLICT副作用修改,则 BLOB 句柄被标记为“已过期”。如果行的任何列发生更改,即使是打开 BLOB 句柄的列以外的列,也是如此。为过期的 BLOB 句柄调用sqlite3_blob_read()和sqlite3_blob_write()失败,返回代码为SQLITE_ABORT。在 BLOB 到期之前写入 BLOB 的更改不会在 BLOB 到期时回滚。如果事务继续完成,此类更改最终将提交。
使用sqlite3_blob_bytes()接口来确定打开的 blob 的大小。此接口不能更改 blob 的大小。使用UPDATE SQL 命令更改 blob 的大小。
sqlite3_bind_zeroblob()和sqlite3_result_zeroblob()接口以及内置的zeroblob SQL函数可用于创建零填充的 blob,以使用增量 blob 接口进行读取或写入。
为了避免资源泄漏,每个打开的BLOB 句柄最终都应该通过调用sqlite3_blob_close()来释放。
另见:sqlite3_blob_close()、 sqlite3_blob_reopen()、sqlite3_blob_read()、 sqlite3_blob_bytes()、sqlite3_blob_write()。