Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overhaul schema command, remove database name #7344

Merged
merged 1 commit into from
Dec 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Overhaul schema command, remove database name
  • Loading branch information
rgwood committed Dec 4, 2022
commit 639353259ad7f481fbcd2f326b95aef45402661e
129 changes: 48 additions & 81 deletions crates/nu-command/src/database/commands/schema.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::super::SQLiteDatabase;
use crate::database::values::definitions::{db::Db, db_row::DbRow, db_table::DbTable};
use crate::database::values::definitions::{db_row::DbRow, db_table::DbTable};
use nu_protocol::{
ast::Call,
engine::{Command, EngineState, Stack},
Expand All @@ -22,7 +22,7 @@ impl Command for SchemaDb {
}

fn usage(&self) -> &str {
"Show SQLite database information, including its schema."
"Show the schema of a SQLite database."
}

fn examples(&self) -> Vec<Example> {
Expand Down Expand Up @@ -50,77 +50,64 @@ impl Command for SchemaDb {

let sqlite_db = SQLiteDatabase::try_from_pipeline(input, span)?;
let conn = open_sqlite_db_connection(&sqlite_db, span)?;
let dbs = get_databases_and_tables(&sqlite_db, &conn, span)?;
let tables = sqlite_db.get_tables(&conn).map_err(|e| {
ShellError::GenericError(
"Error reading tables".into(),
e.to_string(),
Some(span),
None,
Vec::new(),
)
})?;

cols.push("db_filename".into());
vals.push(Value::String {
val: sqlite_db.path.to_string_lossy().into(),
span,
});
let mut table_names = vec![];
let mut table_values = vec![];
for table in tables {
let column_info = get_table_columns(&sqlite_db, &conn, &table, span)?;
let constraint_info = get_table_constraints(&sqlite_db, &conn, &table, span)?;
let foreign_key_info = get_table_foreign_keys(&sqlite_db, &conn, &table, span)?;
let index_info = get_table_indexes(&sqlite_db, &conn, &table, span)?;

for db in dbs {
let tables = get_database_tables(&db);
let mut table_list: Vec<Value> = vec![];
let mut table_names = vec![];
let mut table_values = vec![];
for table in tables {
let column_info = get_table_columns(&sqlite_db, &conn, &table, span)?;
let constraint_info = get_table_constraints(&sqlite_db, &conn, &table, span)?;
let foreign_key_info = get_table_foreign_keys(&sqlite_db, &conn, &table, span)?;
let index_info = get_table_indexes(&sqlite_db, &conn, &table, span)?;
let mut cols = vec![];
let mut vals = vec![];

table_names.push(table.name);
table_values.push(Value::Record {
cols: vec![
"columns".into(),
"constraints".into(),
"foreign_keys".into(),
"indexes".into(),
],
vals: vec![
Value::List {
vals: column_info,
span,
},
Value::List {
vals: constraint_info,
span,
},
Value::List {
vals: foreign_key_info,
span,
},
Value::List {
vals: index_info,
span,
},
],
span,
});
}
table_list.push(Value::Record {
cols: table_names,
vals: table_values,
cols.push("columns".into());
vals.push(Value::List {
vals: column_info,
span,
});

cols.push("databases".into());

let mut rcols = vec![];
let mut rvals = vec![];
rcols.push("name".into());
rvals.push(Value::string(db.name().to_string(), span));
cols.push("constraints".into());
vals.push(Value::List {
vals: constraint_info,
span,
});

rcols.push("tables".into());
rvals.append(&mut table_list);
cols.push("foreign_keys".into());
vals.push(Value::List {
vals: foreign_key_info,
span,
});

vals.push(Value::Record {
cols: rcols,
vals: rvals,
cols.push("indexes".into());
vals.push(Value::List {
vals: index_info,
span,
});

table_names.push(table.name);
table_values.push(Value::Record { cols, vals, span });
}

cols.push("tables".into());
vals.push(Value::Record {
cols: table_names,
vals: table_values,
span,
});

// TODO: add views and triggers

Ok(PipelineData::Value(
Value::Record { cols, vals, span },
None,
Expand All @@ -140,26 +127,6 @@ fn open_sqlite_db_connection(db: &SQLiteDatabase, span: Span) -> Result<Connecti
})
}

fn get_databases_and_tables(
db: &SQLiteDatabase,
conn: &Connection,
span: Span,
) -> Result<Vec<Db>, ShellError> {
db.get_databases_and_tables(conn).map_err(|e| {
ShellError::GenericError(
"Error getting databases and tables".into(),
e.to_string(),
Some(span),
None,
Vec::new(),
)
})
}

fn get_database_tables(db: &Db) -> Vec<DbTable> {
db.tables()
}

fn get_table_columns(
db: &SQLiteDatabase,
conn: &Connection,
Expand Down
27 changes: 0 additions & 27 deletions crates/nu-command/src/database/values/definitions/db.rs

This file was deleted.

1 change: 0 additions & 1 deletion crates/nu-command/src/database/values/definitions/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
pub mod db;
pub mod db_column;
pub mod db_constraint;
pub mod db_foreignkey;
Expand Down
31 changes: 1 addition & 30 deletions crates/nu-command/src/database/values/sqlite.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::definitions::{
db::Db, db_column::DbColumn, db_constraint::DbConstraint, db_foreignkey::DbForeignKey,
db_column::DbColumn, db_constraint::DbConstraint, db_foreignkey::DbForeignKey,
db_index::DbIndex, db_table::DbTable,
};

Expand Down Expand Up @@ -101,35 +101,6 @@ impl SQLiteDatabase {
Ok(conn)
}

pub fn get_databases_and_tables(&self, conn: &Connection) -> Result<Vec<Db>, rusqlite::Error> {
let mut db_query = conn.prepare("SELECT name FROM pragma_database_list")?;

let databases = db_query.query_map([], |row| {
let name: String = row.get(0)?;
Ok(Db::new(name, self.get_tables(conn)?))
})?;

let mut db_list = vec![];
for db in databases {
db_list.push(db?);
}

Ok(db_list)
}

pub fn get_databases(&self, conn: &Connection) -> Result<Vec<String>, rusqlite::Error> {
let mut db_query = conn.prepare("SELECT name FROM pragma_database_list")?;

let mut db_list = vec![];
let _ = db_query.query_map([], |row| {
let name: String = row.get(0)?;
db_list.push(name);
Ok(())
})?;

Ok(db_list)
}

pub fn get_tables(&self, conn: &Connection) -> Result<Vec<DbTable>, rusqlite::Error> {
let mut table_names =
conn.prepare("SELECT name FROM sqlite_master WHERE type = 'table'")?;
Expand Down