use crate::shell::Shell;
struct Flag {
name: &'static str,
default: Value,
settable: bool,
}
#[derive(Clone, Copy, PartialEq, Eq)]
enum Value {
Switch(bool),
Number(i64),
}
const FLAGS: [Flag; 22] = [
Flag {
name: "attach_create",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "attach_write",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "comments",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "defensive",
default: Value::Switch(true),
settable: true,
},
Flag {
name: "dqs_ddl",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "dqs_dml",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "enable_fkey",
default: Value::Switch(false),
settable: true,
},
Flag {
name: "enable_qpsg",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "enable_trigger",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "enable_view",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "fts3_tokenizer",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "fp_digits",
default: Value::Number(17),
settable: false,
},
Flag {
name: "legacy_alter_table",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "legacy_file_format",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "load_extension",
default: Value::Switch(true),
settable: false,
},
Flag {
name: "no_ckpt_on_close",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "reset_database",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "reverse_scanorder",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "stmt_scanstatus",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "trigger_eqp",
default: Value::Switch(false),
settable: false,
},
Flag {
name: "trusted_schema",
default: Value::Switch(true),
settable: true,
},
Flag {
name: "writable_schema",
default: Value::Switch(false),
settable: true,
},
];
const NAME_WIDTH: usize = 19;
pub fn dbconfig(shell: &mut Shell, arguments: &[&str]) {
let Some(name) = arguments.first().copied() else {
for flag in &FLAGS {
let line = render(flag.name, current(shell, flag));
shell.say(&line);
}
return;
};
let folded = name.to_ascii_lowercase();
let Some(flag) = FLAGS.iter().find(|held| held.name == folded) else {
unknown(shell, arguments);
return;
};
if let Some(word) = arguments.get(1) {
let wanted = crate::dot::truthy(Some(word));
if !apply(shell, flag, wanted) {
shell.complain(&format!(
"Error: this build cannot change dbconfig {}",
flag.name
));
return;
}
}
let line = render(flag.name, current(shell, flag));
shell.say(&line);
}
fn unknown(shell: &mut Shell, arguments: &[&str]) {
const COMMAND: usize = 10;
let line = shell.line;
let typed = format!(".dbconfig {}", arguments.join(" "));
shell.complain(&format!("line {line}: {typed}"));
shell.complain(&format!(
"line {line}: {}^--- unknown dbconfig",
" ".repeat(COMMAND)
));
shell.complain(&format!(
"line {line}: Enter \".dbconfig\" with no arguments for a list"
));
}
fn render(name: &str, value: Value) -> String {
let text = match value {
Value::Switch(true) => "on".to_string(),
Value::Switch(false) => "off".to_string(),
Value::Number(number) => number.to_string(),
};
format!("{name:>NAME_WIDTH$} {text}")
}
fn current(shell: &mut Shell, flag: &Flag) -> Value {
match flag.name {
"defensive" => Value::Switch(shell.defensive),
"enable_fkey" => Value::Switch(shell.boolean_pragma("foreign_keys")),
"writable_schema" => Value::Switch(shell.boolean_pragma("writable_schema")),
"trusted_schema" => Value::Switch(shell.boolean_pragma("trusted_schema")),
_ => flag.default,
}
}
fn apply(shell: &mut Shell, flag: &Flag, wanted: bool) -> bool {
if !flag.settable {
return current(shell, flag) == Value::Switch(wanted);
}
match flag.name {
"defensive" => {
shell.defensive = wanted;
shell.set_defensive(wanted)
}
"enable_fkey" => shell.set_boolean_pragma("foreign_keys", wanted),
"writable_schema" => shell.set_boolean_pragma("writable_schema", wanted),
"trusted_schema" => shell.set_boolean_pragma("trusted_schema", wanted),
_ => false,
}
}