From 00383e15fef64d41b616f9372389e21e51260b99 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Mon, 31 Aug 2026 22:26:19 +0200 Subject: [PATCH] Add database import action to menu --- scripts/Modules/TUI.pm | 58 ++++++++++++++++++++++++++++++++++++++++++ scripts/menu.pl | 31 ++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/scripts/Modules/TUI.pm b/scripts/Modules/TUI.pm index 39be47b..6e9fdaa 100644 --- a/scripts/Modules/TUI.pm +++ b/scripts/Modules/TUI.pm @@ -4,7 +4,9 @@ use strict; use warnings; use diagnostics; +use Curses; use Curses::UI; +use Curses::UI::Common; # Singleton my $_cui; @@ -125,4 +127,60 @@ sub select_from_list { return @selection; } +# Returns the entered string or undef when cancelled +sub read_string { + my ( $title, $default ) = @_; + + my $value; + + my $cui = init_cui(); + my $win = $cui->add( 'root', 'Window', ); + + my $entry; + $entry = $win->add( + 'string_entry', + 'TextEntry', + -title => $title, + -border => 1, + -text => ( defined $default ? $default : '' ), + ); + + $win->add( + 'info', 'Label', + -y => -1, + -text => "Enter = confirm, Esc = cancel", + ); + + # Set cursor to the end + $entry->pos( length $entry->get() ); + + # Enter would otherwise just leave the entry + $entry->clear_binding('loose-focus'); + + $entry->set_binding( + sub { + $value = $entry->get(); + $value =~ s/^\s+|\s+$//g; + $cui->mainloopExit(); + }, + KEY_ENTER(), + ); + + $entry->set_binding( + sub { + $value = undef; + $cui->mainloopExit(); + }, + CUI_ESCAPE(), + ); + + $entry->focus(); + $cui->mainloop(); + + $cui->leave_curses(); + $cui->delete('root'); + + return $value; +} + 1; diff --git a/scripts/menu.pl b/scripts/menu.pl index e2b74ab..d45d101 100644 --- a/scripts/menu.pl +++ b/scripts/menu.pl @@ -817,6 +817,37 @@ my %handlers = ( } }, + '32. Import Database (Mars)' => sub { + + # Import databse dump on mars + die "No dumps in $local_dump_dir" unless -d $local_dump_dir; + my @dumps = grep { /\.sql$/ } Util::find_files($local_dump_dir); + my @selected_dumps = + TUI::select_from_list( "Select Dump to Import into Mars", 0, @dumps ); + die "No dump selected" unless @selected_dumps; + my $dump_file = "$local_dump_dir/$selected_dumps[0]"; + + # Determine database name + my $db = TUI::read_string( + "Database Name to Import Into", + $selected_dumps[0] =~ s/\.sql$//r + ); + die "No database name given" unless defined $db && length $db; + die "Invalid database name: $db" unless $db =~ /^[\w.:-]+$/; + die "Database $db already exists on mars" + if grep { $_ eq $db } Mars::db_list(); + + # mariadb-dump doesn't create the database, so create it here + Mars::db_create($db); + + # point db.conf at the database + Util::rewrite_file( $local_db_conf, "database=", "database=$db\n" ); + + say "Importing $dump_file into $db..."; + Util::run( join ' ', 'mariadb', "--defaults-file=$local_db_conf", + '<', Util::shell_quote($dump_file) ); + }, + '95. Delete Builds' => sub { # Delete old build files