sqlite.h


Apertura de un BLOB para entrada/salida incremental

int sqlite3_blob_open(
  sqlite3*,
  const char *zDb,
  const char *zTable,
  const char *zColumn,
  sqlite3_int64 iRow,
  int flags,
  sqlite3_blob **ppBlob
);

Este interfaz abre un manipulador de BLOB en la posición determinada por la fila iRow, columna zColumn, tabla zTable en la base de datos zDb; en otras palabras, el mismo BLOB que sería seleccionado mediante:

SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;

Si el parámetro flags es distinto de cero, entonces el BLOB se abre para acceso de lectura y escritura. Si es cero, el BLOB se abre con acceso de lectura. No es posible abrir para escritura una columna que es parte de un índice o de una clave primaria. Si las restricciones para claves foráneas están permitidas, no será posible abrir una columna que sea parte de una clave hija para escritura.

Tenga en cuenta que el nombre de la base de datos no es el nombre de fichero que contiene la base de datos, sino más bien el nombre simbólico de la base de datos que aparece después de la palabra clave AS cuando se realiza la conexión con la base de datos usando ATTACH. Para el fichero de base de datos principal, el nombre de base de datos es "main". Para tablas TEMP, el nombre de base de datos es "temp".

Si tiene éxito, se devuelve SQLITE_OK, y el nuevo manipulador de BLOB se escribe en *ppBlob. En caso contrario se devuelve un código de error y se asigna un puntero nulo a *ppBlob. Esta función actualiza el código y el mensaje de error de la conexión de base de datos accesible mediante sqlite3_errcode() y sqlite3_errmsg() y funciones relacionadas. Hay que tener en cuenta que la variable *ppBlob siempre se inicializa de un modo que la hace segura para invocar sqlite3_blob_close() sobre *ppBlob independientemente del éxito o fracaso de esta función.

Si la fila a la que apunta el manipulador BLOB es modificada por un UPDATE, DELETE, o por los efectos derivados de un ON CONFLICT, entonces el manipulador de BLOB se marca como "muerto" (expired). Esto es así si cualquier columna de la fila cambia, aunque se trate de una columna diferente para la que el manipulador fue abierto. Las llamadas a sqlite3_blob_read() y sqlite3_blob_write() con un manipulador de BLOB muerto fallarán con un código de retorno SQLITE_ABORT. Los cambios escritos en un BLOB anteriores a que el BLOB haya muerto no se deshacen por la expiración del BLOB. Esos cambios finalmente se compromenten si la transacción continúa hasta que se completa.

Usar sqlite3_blob_bytes() para determinar el tammaño del blob abierto. El tamaño de un blob no puede ser cambiado por esta función. Usar la sentencia SQL UPDATE para cambiar el tamaño de un blob.

Las funciones sqlite3_bind_zeroblob() y sqlite3_result_zeroblob() y la función SQL interna zeroblob se pueden usar, si se desea, para crear un blob vacío, lleno de ceros que se puede usar para leer o escribir con esta función.

Para evitar pérdidas de recursos, todos los manipuladores BLIB abiertos deben ser siempre liberados mediante una llamada a sqlite3_blob_close().