sqlite_opcode/
lib.rs

1mod constant;
2pub use constant::Opcode;
3
4#[derive(Debug)]
5pub struct Explanation {
6    pub table: Option<sqlite_table::Table>,
7}
8
9#[derive(Debug)]
10pub struct Instr {
11    pub addr: i32,
12    pub comment: Option<String>,
13    pub opcode: Opcode,
14    pub p1: serde_json::Value,
15    pub p2: serde_json::Value,
16    pub p3: serde_json::Value,
17    pub p4: serde_json::Value,
18    pub p5: serde_json::Value,
19}
20
21pub fn explain(program: Vec<Instr>, schemas: &sqlite_table::Schemas) -> Explanation {
22    let mut table = None;
23
24    for instr in program {
25        if matches!(
26            instr.opcode,
27            Opcode::OpenRead | Opcode::OpenWrite | Opcode::ReopenIdx
28        ) {
29            let id = match instr.p2 {
30                serde_json::value::Value::Number(n) => n.as_u64().unwrap_or_default() as usize,
31                _ => unreachable!(),
32            };
33
34            table = sqlite_table::find_table_by_root(id, schemas);
35        }
36    }
37
38    Explanation { table }
39}