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