SQLite C 接口
虚拟表配置选项
#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 #define SQLITE_VTAB_INNOCUOUS 2 #define SQLITE_VTAB_DIRECTONLY 3
这些宏定义了 sqlite3_vtab_config()接口的各种选项,虚拟表实现可以使用这些选项来自定义和优化它们的行为。
- SQLITE_VTAB_CONSTRAINT_SUPPORT
- 支持sqlite3_vtab_config (db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X)形式的调用
,其中 X 是一个整数。如果 X 为零,则其
xCreate或xConnect方法调用sqlite3_vtab_config()的虚拟表不支持约束。在此配置(默认配置)中,如果对xUpdate方法的调用返回SQLITE_CONSTRAINT,则整个语句将回滚,就好像OR ABORT已被指定为用户 SQL 语句的一部分,而不管指定的实际 ON CONFLICT 模式如何。
如果 X 非零,则虚拟表实现保证如果xUpdate返回SQLITE_CONSTRAINT,它将在对内部或持久数据结构进行任何修改之前返回。如果ON CONFLICT模式为 ABORT、FAIL、IGNORE 或 ROLLBACK,则 SQLite 能够回滚语句或数据库事务,并根据需要放弃或继续处理当前 SQL 语句。如果 ON CONFLICT 模式是 REPLACE 并且xUpdate方法返回 SQLITE_CONSTRAINT,SQLite 处理这个就像 ON CONFLICT 模式已经被 ABORT 一样。
处理 OR REPLACE 所需的虚拟表实现必须在xUpdate方法中执行。如果对 sqlite3_vtab_on_conflict()函数的调用表明当前的 ON CONFLICT 策略是 REPLACE,则虚拟表实现应在 xUpdate 回调中静默替换适当的行并返回 SQLITE_OK。或者,如果这不可能,它可能会返回 SQLITE_CONSTRAINT,在这种情况下,SQLite 会回退到 OR ABORT 约束处理。
- SQLITE_VTAB_DIRECTONLY
- 从虚拟表实现的xConnect或xCreate方法中调用 sqlite3_vtab_config (db,SQLITE_VTAB_DIRECTONLY)形式禁止从触发器和视图中使用该虚拟表。
- SQLITE_VTAB_INNOCUOUS
- 从虚拟表实现的xConnect或xCreate方法中以sqlite3_vtab_config (db,SQLITE_VTAB_INNOCUOUS)形式调用表明 该虚拟表可以在触发器和视图中安全使用。从概念上讲,SQLITE_VTAB_INNOCUOUS 标记意味着虚拟表即使被恶意黑客控制也不会造成严重危害。除非绝对必要,否则开发人员应避免设置 SQLITE_VTAB_INNOCUOUS 标志。