#如果已定义(SQLITE_ENABLE_PREUPDATE_HOOK) 无效* sqlite3_preupdate_hook( sqlite3 * db, void(* xPreUpdate)( void * pCtx,/ *将第三个arg复制到preupdate_hook()* / sqlite3 * db,/ *数据库句柄* / int op,/ * SQLITE_UPDATE,DELETE或INSERT * / char const * zDb,/ *数据库名称* / char const * zName,/ *表名* / sqlite3_int64 iKey1,/ *要删除/更新的行的Rowid * / sqlite3_int64 iKey2 / *新的rowid值(用于更新rowid)* / ), 空白* ); int sqlite3_preupdate_old(sqlite3 *,int,sqlite3_value **); int sqlite3_preupdate_count(sqlite3 *); int sqlite3_preupdate_depth(sqlite3 *); int sqlite3_preupdate_new(sqlite3 *,int,sqlite3_value **); #万一
仅当使用SQLITE_ENABLE_PREUPDATE_HOOK编译时选项编译SQLite时,这些接口才可用 。
所述sqlite3_preupdate_hook()接口寄存器,每当之前调用的回调函数INSERT,UPDATE,和DELETE上的数据库表的操作。在一个数据库连接上一次最多可以注册一个preupdate挂钩 ; 每次调用sqlite3_preupdate_hook()都会覆盖先前的设置。通过 使用带有NULL指针作为第二个参数的sqlite3_preupdate_hook()来禁用preupdate挂钩。sqlite3_preupdate_hook()的第三个参数作为第一个参数传递给回调。
preupdate挂钩仅在更改实际数据库表时触发。不会调用preupdate挂钩来更改虚拟表或系统表(例如sqlite_sequence或sqlite_stat1)。
preupdate回调的第二个参数是指向注册preupdate挂钩的数据库连接的指针。preupdate回调的第三个参数是常量 SQLITE_INSERT,SQLITE_DELETE或SQLITE_UPDATE之一,用于标识即将发生的更新操作的类型。preupdate回调的第四个参数是正在修改的数据库连接中的数据库名称。对于主数据库,这将是“ main”;对于TEMP表,这将是“ temp”;对于已连接的数据库,这将在ATTACH语句中的AS关键字之后给出。preupdate回调的第五个参数是要修改的表的名称。
对于对rowid表的UPDATE或DELETE操作,传递给preupdate回调的第六个参数是要修改或删除的行的初始rowid。对于rowid表上的INSERT操作或WITHOUT ROWID表上的任何操作,第六个参数的值是未定义的。对于在rowid表上进行INSERT或UPDATE,第七个参数是要插入或更新的行的最终rowid值。没有为WITHOUT ROWID表上的操作或行ID表上的DELETE操作定义传递给回调函数的第七个参数的值。
所述sqlite3_preupdate_old() ,sqlite3_preupdate_new() , sqlite3_preupdate_count() ,和sqlite3_preupdate_depth()接口提供关于更新前的事件的其他信息。这些例程只能在更新前回调中调用。从预更新回调之外或使用与提供给预更新回调的数据库连接指针不同的数据库连接指针来调用这些例程中的任何一个都会 导致未定义的行为,并且可能是不良行为。
所述sqlite3_preupdate_count(d)接口返回正在被插入,更新或删除的行中的列数。
所述sqlite3_preupdate_old(d,N,P)接口写为P指针的保护sqlite3_value包含表行的第N列的值被更新之前。N参数必须比列数少0到1之间,否则行为将是不确定的。只能在SQLITE_UPDATE和SQLITE_DELETE预更新回调中使用;如果它由SQLITE_INSERT回调使用,则该行为是未定义的。当preupdate回调返回时,P指向的sqlite3_value将被销毁。
所述sqlite3_preupdate_new(d,N,P)接口写为P指针的保护sqlite3_value包含表行的第N列的值被更新后。N参数必须比列数少0到1之间,否则行为将是不确定的。只能在SQLITE_INSERT和SQLITE_UPDATE预更新回调中使用;如果它由SQLITE_DELETE回调使用,则该行为是未定义的。当preupdate回调返回时,P指向的sqlite3_value将被销毁。
所述sqlite3_preupdate_depth(d)接口返回0,如果更新前的回调被调用作为直接插入,更新或删除操作的结果; 或1表示由顶级触发器调用的插入,更新或删除;或2表示由顶级触发器调用的触发器引起的更改;等等。
另请参见: sqlite3_update_hook()