diff --git a/datafusion-cli/Cargo.toml b/datafusion-cli/Cargo.toml index 04349e57cea5..ba1c6e332dc9 100644 --- a/datafusion-cli/Cargo.toml +++ b/datafusion-cli/Cargo.toml @@ -35,4 +35,5 @@ datafusion = { path = "../datafusion", version = "7.0.0" } arrow = { version = "9.1" } ballista = { path = "../ballista/rust/client", version = "0.6.0", optional=true } env_logger = "0.9" -mimalloc = { version = "*", default-features = false } \ No newline at end of file +mimalloc = { version = "*", default-features = false } +dirs = "4.0.0" diff --git a/datafusion-cli/src/exec.rs b/datafusion-cli/src/exec.rs index 17b329b86d9b..dc3c73e5ab43 100644 --- a/datafusion-cli/src/exec.rs +++ b/datafusion-cli/src/exec.rs @@ -72,6 +72,21 @@ pub async fn exec_from_lines( } } +pub async fn exec_from_files( + files: Vec, + ctx: &mut Context, + print_options: &PrintOptions, +) { + let files = files + .into_iter() + .map(|file_path| File::open(file_path).unwrap()) + .collect::>(); + for file in files { + let mut reader = BufReader::new(file); + exec_from_lines(ctx, &mut reader, print_options).await; + } +} + /// run and execute SQL statements and commands against a context with the given print options pub async fn exec_from_repl(ctx: &mut Context, print_options: &mut PrintOptions) { let mut rl = Editor::::new(); diff --git a/datafusion-cli/src/main.rs b/datafusion-cli/src/main.rs index 1d91f13665ab..08878f9c70eb 100644 --- a/datafusion-cli/src/main.rs +++ b/datafusion-cli/src/main.rs @@ -24,8 +24,6 @@ use datafusion_cli::{ }; use mimalloc::MiMalloc; use std::env; -use std::fs::File; -use std::io::BufReader; use std::path::Path; #[global_allocator] @@ -59,6 +57,16 @@ struct Args { )] file: Vec, + #[clap( + short = 'r', + long, + multiple_values = true, + help = "Run the provided files on startup instead of ~/.datafusionrc", + validator(is_valid_file), + conflicts_with = "file" + )] + rc: Option>, + #[clap(long, arg_enum, default_value_t = PrintFormat::Table)] format: PrintFormat, @@ -107,16 +115,26 @@ pub async fn main() -> Result<()> { }; let files = args.file; - if !files.is_empty() { - let files = files - .into_iter() - .map(|file_path| File::open(file_path).unwrap()) - .collect::>(); - for file in files { - let mut reader = BufReader::new(file); - exec::exec_from_lines(&mut ctx, &mut reader, &print_options).await; + let rc = match args.rc { + Some(file) => file, + None => { + let mut files = Vec::new(); + let home = dirs::home_dir(); + if let Some(p) = home { + let home_rc = p.join(".datafusionrc"); + if home_rc.exists() { + files.push(home_rc.into_os_string().into_string().unwrap()); + } + } + files } + }; + if !files.is_empty() { + exec::exec_from_files(files, &mut ctx, &print_options).await } else { + if !rc.is_empty() { + exec::exec_from_files(rc, &mut ctx, &print_options).await + } exec::exec_from_repl(&mut ctx, &mut print_options).await; }