diff --git a/src/client/commands/show_privs.rs b/src/client/commands/show_privs.rs index d2b664e..b9fd1bb 100644 --- a/src/client/commands/show_privs.rs +++ b/src/client/commands/show_privs.rs @@ -27,6 +27,12 @@ pub struct ShowPrivsArgs { #[arg(short, long)] json: bool, + /// Show single-character privilege names in addition to human-readable names + /// + /// This flag has no effect when used with --json + #[arg(short, long)] + long: bool, + /// Return a non-zero exit code if any of the results were erroneous #[arg(short, long)] fail: bool, @@ -67,7 +73,7 @@ pub async fn show_database_privileges( if args.json { print_list_privileges_output_status_json(&privilege_data); } else { - print_list_privileges_output_status(&privilege_data); + print_list_privileges_output_status(&privilege_data, args.long); } if args.fail && privilege_data.values().any(|res| res.is_err()) { diff --git a/src/core/database_privileges/base.rs b/src/core/database_privileges/base.rs index b2f2639..69a99f2 100644 --- a/src/core/database_privileges/base.rs +++ b/src/core/database_privileges/base.rs @@ -101,3 +101,22 @@ pub fn db_priv_field_human_readable_name(name: &str) -> String { _ => format!("Unknown({})", name), } } + +/// Converts a database privilege field name to a single-character name. +/// (the characters from the cli privilege editor) +pub fn db_priv_field_single_character_name(name: &str) -> &str { + match name { + "select_priv" => "s", + "insert_priv" => "i", + "update_priv" => "u", + "delete_priv" => "d", + "create_priv" => "c", + "drop_priv" => "D", + "alter_priv" => "a", + "index_priv" => "I", + "create_tmp_table_priv" => "t", + "lock_tables_priv" => "l", + "references_priv" => "r", + _ => "?", + } +} diff --git a/src/core/protocol/commands/list_privileges.rs b/src/core/protocol/commands/list_privileges.rs index 6747cb9..02588b7 100644 --- a/src/core/protocol/commands/list_privileges.rs +++ b/src/core/protocol/commands/list_privileges.rs @@ -13,6 +13,7 @@ use crate::core::{ common::yn, database_privileges::{ DATABASE_PRIVILEGE_FIELDS, DatabasePrivilegeRow, db_priv_field_human_readable_name, + db_priv_field_single_character_name, }, protocol::request_validation::{NameValidationError, OwnerValidationError}, types::{DbOrUser, MySQLDatabase}, @@ -23,7 +24,7 @@ pub type ListPrivilegesRequest = Option>; pub type ListPrivilegesResponse = BTreeMap, GetDatabasesPrivilegeDataError>>; -pub fn print_list_privileges_output_status(output: &ListPrivilegesResponse) { +pub fn print_list_privileges_output_status(output: &ListPrivilegesResponse, long_names: bool) { let mut final_privs_map: BTreeMap> = BTreeMap::new(); for (db_name, db_result) in output { match db_result { @@ -45,7 +46,19 @@ pub fn print_list_privileges_output_status(output: &ListPrivilegesResponse) { table.add_row(Row::new( DATABASE_PRIVILEGE_FIELDS .into_iter() - .map(db_priv_field_human_readable_name) + .map(|field| { + if field == "Db" || field == "User" { + db_priv_field_human_readable_name(field) + } else if long_names { + format!( + "{} ({})", + db_priv_field_human_readable_name(field), + db_priv_field_single_character_name(field), + ) + } else { + db_priv_field_human_readable_name(field) + } + }) .map(|name| Cell::new(&name)) .collect(), ));