2007-04-12 20:24:50 +00:00
|
|
|
#!/usr/local/bin/perl
|
|
|
|
# exec_file.cgi
|
|
|
|
# Execute some SQL commands from a file and display the output
|
|
|
|
|
|
|
|
require './mysql-lib.pl';
|
|
|
|
&ReadParseMime();
|
|
|
|
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
|
|
|
|
$access{'edonly'} && &error($text{'dbase_ecannot'});
|
|
|
|
&error_setup($text{'exec_err'});
|
2011-12-07 16:24:10 -08:00
|
|
|
$sql_charset = $in{'charset'};
|
2007-04-12 20:24:50 +00:00
|
|
|
|
2023-06-30 13:42:31 +03:00
|
|
|
my ($ver, $variant) = &get_remote_mysql_variant();
|
|
|
|
|
2007-04-12 20:24:50 +00:00
|
|
|
if ($in{'mode'}) {
|
|
|
|
# From uploaded file
|
|
|
|
$in{'upload'} || &error($text{'exec_eupload'});
|
|
|
|
$file = &transname();
|
|
|
|
open(TEMP, ">$file");
|
|
|
|
print TEMP $in{'upload'};
|
|
|
|
close(TEMP);
|
|
|
|
&ui_print_header(undef, $text{'exec_title'}, "");
|
|
|
|
print "$text{'exec_uploadout'}<p>\n";
|
|
|
|
$need_unlink = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
# From local file
|
|
|
|
-r $in{'file'} || &error($text{'exec_efile'});
|
|
|
|
$file = $in{'file'};
|
|
|
|
&ui_print_header(undef, $text{'exec_title'}, "");
|
|
|
|
print &text('exec_fileout', "<tt>$in{'file'}</tt>"),"<p>\n";
|
|
|
|
$need_unlink = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Un-compress file if needed
|
|
|
|
$cf = &compression_format($file);
|
|
|
|
$cmd = $cf == 1 ? "gunzip -c" :
|
|
|
|
$cf == 2 ? "uncompress -C" :
|
|
|
|
$cf == 3 ? "bunzip2 -c" : undef;
|
|
|
|
if ($cmd) {
|
|
|
|
($prog, @args) = split(/\s+/, $cmd);
|
|
|
|
&has_command($prog) ||
|
|
|
|
&error(&text('exec_ecompress', "<tt>$prog</tt>"));
|
|
|
|
$tempfile = &transname();
|
2023-02-23 23:34:39 -08:00
|
|
|
$out = &backquote_command(
|
|
|
|
"$cmd <".quotemeta($file)." 2>&1 >".quotemeta($tempfile));
|
2007-04-12 20:24:50 +00:00
|
|
|
if ($?) {
|
|
|
|
&error(&text('exec_ecompress2', "<pre>$out</pre>"));
|
|
|
|
}
|
|
|
|
unlink($file) if ($need_unlink);
|
|
|
|
$file = $tempfile;
|
|
|
|
$need_unlink = 1;
|
|
|
|
}
|
|
|
|
|
2008-06-23 00:04:13 +00:00
|
|
|
# Check the file for tables created and rows inserted
|
2023-06-30 13:42:31 +03:00
|
|
|
my $create_count = 0;
|
|
|
|
my $insert_count = 0;
|
|
|
|
my $collation_downgrade = 0;
|
2020-03-14 17:20:54 -07:00
|
|
|
open(SQL, "<$file");
|
2008-06-23 00:04:13 +00:00
|
|
|
while(<SQL>) {
|
|
|
|
if (/^\s*insert\s+into\s+`(\S+)`/i ||
|
2023-06-30 13:44:47 +03:00
|
|
|
/^\s*insert\s+into\s+(\S+)/i) {
|
2008-06-23 00:04:13 +00:00
|
|
|
$insert_count++;
|
|
|
|
}
|
|
|
|
if (/^\s*create\s+table\s+`(\S+)`/i ||
|
2023-06-30 13:44:47 +03:00
|
|
|
/^\s*create\s+table\s+(\S+)/i) {
|
2008-06-23 00:04:13 +00:00
|
|
|
$create_count++;
|
|
|
|
}
|
2023-06-30 13:42:31 +03:00
|
|
|
if ($variant eq 'mariadb' && /COLLATE\s+utf8mb4_0900_ai_ci/i) {
|
|
|
|
$collation_downgrade++;
|
|
|
|
}
|
2008-06-23 00:04:13 +00:00
|
|
|
}
|
|
|
|
close(SQL);
|
|
|
|
|
2007-04-12 20:24:50 +00:00
|
|
|
print "<pre>";
|
2009-06-24 13:47:53 +00:00
|
|
|
($ex, $out) = &execute_sql_file($in{'db'}, $file,
|
|
|
|
undef, undef, $access{'buser'});
|
2007-04-12 20:24:50 +00:00
|
|
|
print &html_escape($out);
|
|
|
|
$got++ if ($out =~ /\S/);
|
|
|
|
print "<i>$text{'exec_noout'}</i>\n" if (!$got);
|
|
|
|
print "</pre>\n";
|
2008-06-23 00:04:13 +00:00
|
|
|
if (!$ex) {
|
2023-06-30 13:42:31 +03:00
|
|
|
if ($collation_downgrade) {
|
|
|
|
print &text('exec_collationdown', 'utf8mb4_0900_ai_ci', 'utf8mb4_unicode_520_ci'),"<br>\n";
|
|
|
|
}
|
2008-06-23 00:04:13 +00:00
|
|
|
if ($create_count) {
|
|
|
|
print &text('exec_created', $create_count),"\n";
|
|
|
|
}
|
|
|
|
if ($insert_count) {
|
|
|
|
print &text('exec_inserted', $insert_count),"\n";
|
|
|
|
}
|
|
|
|
if ($create_count || $insert_count) {
|
|
|
|
print "<p>\n";
|
|
|
|
}
|
|
|
|
}
|
2007-04-12 20:24:50 +00:00
|
|
|
&webmin_log("execfile", undef, $in{'db'}, { 'mode' => $in{'mode'},
|
|
|
|
'file' => $in{'file'} });
|
|
|
|
unlink($file) if ($need_unlink);
|
|
|
|
|
2008-01-15 01:29:16 +00:00
|
|
|
&ui_print_footer("exec_form.cgi?db=$in{'db'}&mode=file", $text{'exec_return'},
|
2007-04-12 20:24:50 +00:00
|
|
|
"edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
|
2012-07-28 17:27:22 -07:00
|
|
|
&get_databases_return_link($in{'db'}), $text{'index_return'});
|
2007-04-12 20:24:50 +00:00
|
|
|
|