Open A BLOB For Incremental I/O
Open A BLOB For Incremental I/O
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”。
如果flags参数非零,那么打开BLOB以进行读写访问。如果flags参数为零,则BLOB将以只读访问方式打开。
成功时,返回SQLITE_OK,并将新的BLOB句柄存储在* ppBlob中。否则,将返回错误代码,除非错误代码为SQLITE_MISUSE,否则将* ppBlob设置为NULL。这意味着,如果API没有被滥用,在返回这个函数后,在* ppBlob上调用sqlite3_blob_close()总是安全的。
如果满足以下任一条件,则此函数将失败并显示SQLITE_ERROR:
- 数据库zDb不存在,
- 数据库zDb中不存在表zTable,
- Table zTable是一个WITHOUT ROWID表,
- 列zColumn不存在,
- 行iRow不在表中,
- 行iRow的指定列包含一个不是TEXT或BLOB值的值,
- 列zColumn是索引,PRIMARY KEY或UNIQUE约束的一部分,并且正在打开用于读/写访问的blob,
- 启用外键约束,列zColumn是子键定义的一部分,并且打开blob以进行读/写访问。
除非它返回SQLITE_MISUSE,否则此函数会设置数据库连接错误代码和可通过sqlite3_errcode()和sqlite3_errmsg()及相关函数访问的消息。
可以使用sqlite3_blob_read()接口读取由sqlite3_blob_open()引用的BLOB,并使用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函数来创建一个使用incremental-blob接口读取或写入的零填充blob。
为了避免资源泄漏,每个打开的BLOB句柄最终都应该通过调用sqlite3_blob_close()来释放。