From cd5199de3145f6f950f94c52a698fca04abd2137 Mon Sep 17 00:00:00 2001 From: Reilly Wood <26268125+rgwood@users.noreply.github.com> Date: Tue, 26 Apr 2022 16:16:46 -0700 Subject: [PATCH] `db info` tweaks (#5338) * Rename db info to db schema * Change db schema to take db as input --- .../nu-command/src/database/commands/mod.rs | 6 ++-- .../database/commands/{info.rs => schema.rs} | 35 ++++++++----------- .../nu-command/src/database/values/sqlite.rs | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) rename crates/nu-command/src/database/commands/{info.rs => schema.rs} (89%) diff --git a/crates/nu-command/src/database/commands/mod.rs b/crates/nu-command/src/database/commands/mod.rs index 2042e908e..9f4a053ba 100644 --- a/crates/nu-command/src/database/commands/mod.rs +++ b/crates/nu-command/src/database/commands/mod.rs @@ -2,9 +2,9 @@ mod collect; mod command; mod describe; mod from; -mod info; mod open; mod query; +mod schema; mod select; mod utils; @@ -12,10 +12,10 @@ use collect::CollectDb; use command::Database; use describe::DescribeDb; use from::FromDb; -use info::InfoDb; use nu_protocol::engine::StateWorkingSet; use open::OpenDb; use query::QueryDb; +use schema::SchemaDb; use select::SelectDb; pub fn add_database_decls(working_set: &mut StateWorkingSet) { @@ -29,5 +29,5 @@ pub fn add_database_decls(working_set: &mut StateWorkingSet) { } // Series commands - bind_command!(CollectDb, Database, DescribeDb, FromDb, QueryDb, SelectDb, OpenDb, InfoDb); + bind_command!(CollectDb, Database, DescribeDb, FromDb, QueryDb, SelectDb, OpenDb, SchemaDb); } diff --git a/crates/nu-command/src/database/commands/info.rs b/crates/nu-command/src/database/commands/schema.rs similarity index 89% rename from crates/nu-command/src/database/commands/info.rs rename to crates/nu-command/src/database/commands/schema.rs index c98f9fa32..ba6e2c89d 100644 --- a/crates/nu-command/src/database/commands/info.rs +++ b/crates/nu-command/src/database/commands/schema.rs @@ -1,56 +1,51 @@ use super::super::SQLiteDatabase; use crate::database::values::db_row::DbRow; -use nu_engine::CallExt; use nu_protocol::{ ast::Call, engine::{Command, EngineState, Stack}, - Category, Example, PipelineData, ShellError, Signature, Spanned, SyntaxShape, Value, + Category, Example, PipelineData, ShellError, Signature, Value, }; -use std::path::PathBuf; #[derive(Clone)] -pub struct InfoDb; +pub struct SchemaDb; -impl Command for InfoDb { +impl Command for SchemaDb { fn name(&self) -> &str { - "db info" + "db schema" } fn signature(&self) -> Signature { - Signature::build(self.name()) - .required("db", SyntaxShape::Filepath, "sqlite database file name") - .category(Category::Custom("database".into())) + Signature::build(self.name()).category(Category::Custom("database".into())) } fn usage(&self) -> &str { - "Show database information." + "Show database information, including its schema." } fn examples(&self) -> Vec { vec![Example { - description: "Show information of a SQLite database", - example: r#"db info foo.db"#, + description: "Show the schema of a SQLite database", + example: r#"open foo.db | db schema"#, result: None, }] } fn search_terms(&self) -> Vec<&str> { - vec!["database", "info", "SQLite"] + vec!["database", "info", "SQLite", "schema"] } fn run( &self, - engine_state: &EngineState, - stack: &mut Stack, + _engine_state: &EngineState, + _stack: &mut Stack, call: &Call, - _input: PipelineData, + input: PipelineData, ) -> Result { - let db_file: Spanned = call.req(engine_state, stack, 0)?; - let span = db_file.span; let mut cols = vec![]; let mut vals = vec![]; + let span = call.head; - let sqlite_db = SQLiteDatabase::try_from_path(db_file.item.as_path(), db_file.span)?; + let sqlite_db = SQLiteDatabase::try_from_pipeline(input, span)?; let conn = sqlite_db.open_connection().map_err(|e| { ShellError::GenericError( "Error opening file".into(), @@ -73,7 +68,7 @@ impl Command for InfoDb { cols.push("db_filename".into()); vals.push(Value::String { - val: db_file.item.to_string_lossy().to_string(), + val: sqlite_db.path.to_string_lossy().to_string(), span, }); diff --git a/crates/nu-command/src/database/values/sqlite.rs b/crates/nu-command/src/database/values/sqlite.rs index 1fbe3e591..48d7ed7aa 100644 --- a/crates/nu-command/src/database/values/sqlite.rs +++ b/crates/nu-command/src/database/values/sqlite.rs @@ -19,7 +19,7 @@ pub struct SQLiteDatabase { // I considered storing a SQLite connection here, but decided against it because // 1) YAGNI, 2) it's not obvious how cloning a connection could work, 3) state // management gets tricky quick. Revisit this approach if we find a compelling use case. - path: PathBuf, + pub path: PathBuf, pub query: Option, }