sqlite.h


Retrollamadas de notificación de commit y rollback

void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);

La función sqlite3_commit_hook() registra una función de retrollamada para ser invocada cada vez que una transacción se complete. Cualquier otra retrollamada asignada mediante una llamada previa a sqlite3_commit_hook() para la misma conexión de base de datos será anulada. La función sqlite3_rollback_hook() registra una función de retrollamada que será invocada cada vez que una transacción se anule. Cualquier retreollamada activada por una llamada previa a sqlite3_rollback_hook() para la misma conexión de base de datos será anulada. El argumento pArg es pasado a través de la retrollamada. Si la retrollamada en una función gancho para commit retorna un valor distinto de cero, entonces el commit se convierte en un rollback.

Las funciones sqlite3_commit_hook(D,C,P) y sqlite3_rollback_hook(D,C,P) devuelven el argumento P usado desde la llamada previa a la misma función para la misma conexión de base de datos D, o NULL para la primera llamada para cada función en D.

La implementación de la retrollamada no debe hacer nada que pueda modificar la conexión de la base de datos que haya invocado a la retrollamada. Cualquier acción que modifique la conexión de la base de datos debe ser retrasada hasta después de que se complete la llamada a sqlite3_step() que haya disparado el gancho commit o rollback en primer lugar. Hay que tener en cuenta que tanto sqlite3_prepare_v2() como sqlite3_step() modifican sus conexiones de base de datos en el sentido que tiene "modificar" para este párrafo.

Registrar una función NULL inhabilita la retrollamada.

Cuando la retrollamada de commit retorna cero, la operación COMMIT puede continuar normalmente. Si retorna un valor distinto de cer, entoces el COMMIT se convierte en un ROLLBACK. El gancho de rollback se invoca en un rollback que resulte de un gancho commit que haya retornado un valor distinto de cero, igual que si hubiera ocurrido cualquier otro rollback.

A los efectos de esta función, se dice que una transacción ha sido cancelada si se ha ejecutado un "ROLLBACK" explícito o si un error o una restricción hace que se produzca un rollback implícito. La retrollamada rollback no es invodada si una transacción se deshace automáticamente porque la conexión de la base de datos se haya cerrado.

Ver también sqlite3_update_hook().