#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PragmaSpec {
pub name: &'static str,
pub columns: &'static [&'static str],
pub takes_argument: bool,
}
pub const REGISTER: &[PragmaSpec] = &[
boolean("analysis_limit"),
boolean("application_id"),
boolean("auto_vacuum"),
boolean("automatic_index"),
PragmaSpec {
name: "busy_timeout",
columns: &["timeout"],
takes_argument: true,
},
boolean("cache_size"),
boolean("cache_spill"),
boolean("case_sensitive_like"),
boolean("cell_size_check"),
boolean("checkpoint_fullfsync"),
PragmaSpec {
name: "collation_list",
columns: &["seq", "name"],
takes_argument: false,
},
PragmaSpec {
name: "compile_options",
columns: &["compile_options"],
takes_argument: false,
},
boolean("count_changes"),
boolean("data_store_directory"),
boolean("data_version"),
PragmaSpec {
name: "database_list",
columns: &["seq", "name", "file"],
takes_argument: false,
},
boolean("default_cache_size"),
boolean("defensive"),
boolean("defer_foreign_keys"),
boolean("empty_result_callbacks"),
PragmaSpec {
name: "encoding",
columns: &["encoding"],
takes_argument: true,
},
PragmaSpec {
name: "foreign_key_check",
columns: &["table", "rowid", "parent", "fkid"],
takes_argument: true,
},
PragmaSpec {
name: "foreign_key_list",
columns: &[
"id",
"seq",
"table",
"from",
"to",
"on_update",
"on_delete",
"match",
],
takes_argument: true,
},
boolean("foreign_keys"),
boolean("freelist_count"),
boolean("full_column_names"),
boolean("fullfsync"),
PragmaSpec {
name: "function_list",
columns: &["name", "builtin", "type", "enc", "narg", "flags"],
takes_argument: false,
},
boolean("hard_heap_limit"),
boolean("ignore_check_constraints"),
boolean("incremental_vacuum"),
PragmaSpec {
name: "index_info",
columns: &["seqno", "cid", "name"],
takes_argument: true,
},
PragmaSpec {
name: "index_list",
columns: &["seq", "name", "unique", "origin", "partial"],
takes_argument: true,
},
PragmaSpec {
name: "index_xinfo",
columns: &["seqno", "cid", "name", "desc", "coll", "key"],
takes_argument: true,
},
PragmaSpec {
name: "integrity_check",
columns: &["integrity_check"],
takes_argument: true,
},
PragmaSpec {
name: "journal_mode",
columns: &["journal_mode"],
takes_argument: true,
},
boolean("journal_size_limit"),
boolean("legacy_alter_table"),
PragmaSpec {
name: "locking_mode",
columns: &["locking_mode"],
takes_argument: true,
},
boolean("max_page_count"),
boolean("mmap_size"),
PragmaSpec {
name: "module_list",
columns: &["name"],
takes_argument: false,
},
boolean("optimize"),
boolean("page_count"),
boolean("page_size"),
PragmaSpec {
name: "pragma_list",
columns: &["name"],
takes_argument: false,
},
boolean("query_only"),
PragmaSpec {
name: "quick_check",
columns: &["quick_check"],
takes_argument: true,
},
boolean("read_uncommitted"),
boolean("recursive_triggers"),
boolean("reverse_unordered_selects"),
boolean("schema_version"),
boolean("secure_delete"),
boolean("short_column_names"),
boolean("shrink_memory"),
boolean("soft_heap_limit"),
boolean("synchronous"),
PragmaSpec {
name: "table_info",
columns: &["cid", "name", "type", "notnull", "dflt_value", "pk"],
takes_argument: true,
},
PragmaSpec {
name: "table_list",
columns: &["schema", "name", "type", "ncol", "wr", "strict"],
takes_argument: true,
},
PragmaSpec {
name: "table_xinfo",
columns: &[
"cid",
"name",
"type",
"notnull",
"dflt_value",
"pk",
"hidden",
],
takes_argument: true,
},
boolean("temp_store"),
boolean("temp_store_directory"),
boolean("threads"),
boolean("trusted_schema"),
boolean("user_version"),
PragmaSpec {
name: "wal_autocheckpoint",
columns: &["wal_autocheckpoint"],
takes_argument: true,
},
PragmaSpec {
name: "wal_checkpoint",
columns: &["busy", "log", "checkpointed"],
takes_argument: true,
},
boolean("writable_schema"),
];
const fn boolean(name: &'static str) -> PragmaSpec {
PragmaSpec {
name,
columns: &[],
takes_argument: true,
}
}
pub fn spec(name: &[u8]) -> Option<&'static PragmaSpec> {
let folded = name.to_ascii_lowercase();
REGISTER
.iter()
.find(|entry| entry.name.as_bytes() == folded.as_slice())
}
pub fn columns(name: &[u8]) -> Vec<Vec<u8>> {
let Some(spec) = spec(name) else {
return Vec::new();
};
if spec.columns.is_empty() {
return vec![spec.name.as_bytes().to_vec()];
}
spec.columns
.iter()
.map(|column| column.as_bytes().to_vec())
.collect()
}