sqlite_fsr/
lib.rs

1pub mod utils;
2pub mod models;
3pub mod command;
4use std::path::PathBuf;
5use crate::models::error::*;
6use crate::command::sql;
7use crate::command::sql::parser::sql_statement::ToSQLStatement;
8
9pub use models::DBFile;
10
11pub fn run(args: &[String]) -> Result<String, RunError> {
12    if args.len() <= 1 {
13        return Err(CommandArgsError::MissingArgs)?;
14    }
15    if args.len() == 2 {
16        return Err(CommandArgsError::MissingCommand)?;
17    }
18
19    let db_path = PathBuf::from(&args[1]);
20    let command: Vec<&str> = args[2]
21                                .trim_matches('"')
22                                .split(" ")
23                                .collect();
24    
25    let mut file = match DBFile::open(db_path) {
26                        Ok(file) => file,
27                        Err(e) => return Err(CommandArgsError::Io(e))?
28                    };
29
30    let output = match command[0] {
31                        ".dbinfo" => {
32                            let (page_size, table_count) = file.get_dbinfo();
33                            Ok(format!(
34                                "database page size: {}\nnumber of tables: {}",
35                                page_size, table_count
36                            ))
37                        }
38                        ".tables" => {
39                            let tables = file.get_table_names();
40                            Ok(format!("{}", tables.join(" ")))
41                        }
42                        "SELECT" => {
43                            let sql_statement = command.to_sql_statment()
44                                                        .map_err(|err| SQLCommandError::UnsupportedCommand(err.to_string()))?;
45
46                            let result = file.execute(sql_statement);
47                            match result {
48                                Ok(rows) => Ok(format!("{}", rows)),
49                                Err(e) => Err(e)?
50                            }
51                        }
52                        _ => Err(CommandArgsError::InvalidCommand(command[0].to_owned()))?
53                    };
54    return output;
55}
56
57