SQlite源码分析

函数sqlite3VdbeHalt

          这一部分功能用于处理当程序VDBE出现停机的情况,如果VDBE处于开启自动模式时,会自动提交对数据库的改写。如果需要事物回滚,就会回滚。这是唯一的方式能够将一个VM的状态从SQLITE_MAGIC_RUN转为SQLITE_MAGIC_HALT。因为竞争所的原因造成无法完成数据提交,将返回SQLITE_BUSY,那么将意味着数据库没有关闭需要对前面的代码重复执行一次。在方法中会包含处理逻辑用于判断一个语句或一个事务被虚拟机处理后返回是提交成功还是事务回滚。如果以下四种任何一种错误发生的话(SQLITE_NOMEM,SQLITE_IOERR,SQLITE_FULL,SQLITE_INTERRUPT),那将会导致内部缓存出现不一致的状态,那么我们需要回滚事务,如果没有完整的事务声明。在程序执行的过程中会检查isSpecialError的值,如果sSpecialError的值是一个大于0的值会细分到更具体的情况来说明来处理数据库停机的情况。当SQL语句是只读的时候而且错误代码返回值是SQLITE_INTERRUPT则不需要回滚,因为没有对数据库有任何写操作。其他的情况会发生对数据库改变需要执行数据库事务回滚来达到数据库的一致性(即为写操作回滚到原来数据库一致的状态)。对于一个简单的读取数据的语句,更重要的是关心一个语句或者事务的回滚操作。如果错误发生在写日志或者一个数据文件做为释放缓存页面的一个操作时,事务的回滚可以保持页的数据一致性。如果说eStatementOp的值不等于0,那么对于一个声明事务要么提交,要们回滚事务,调用函数sqlite3VdbeCloseStatement(p,eOp)来完成功能当p->iStatement 的值大于0会关闭当前的声明事务.其中形参eOp必须是SAVEPOINT_ROLLBACK或者SAVEPOINT_RELEASE,不可以取其他的值。如果eOp取值为SAVEPOINT_ROLLBACK,当前的事务会回滚;如果eOp取值为SAVEPOINT_RELEASE会提交当前的事务。如果执行的过程中出现了IO日常错误,形如SQLITE_IOERR_XXX的错误代码会返回给程序的调用,否则程序返回True。如果这是一个插入,更新,删除和没有任何声明式事务回滚,那么就可以对更新数据库连接改变计数器。最后在程序正常结束时需要释放数据库锁。