#!/usr/local/bin/perl
# edit_dbase.cgi
# Show database tables and indexes
require './mysql-lib.pl';
&ReadParse();
&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
@titles = grep { &can_edit_db($_) } &list_databases();
$desc = "$in{'db'}";
if (@titles == 1 && $module_info{'usermin'}) {
# Single-DB mode
&ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase", 1, 1);
$single = 1;
}
else {
&ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase");
}
@titles = &list_tables($in{'db'});
if ($access{'indexes'}) {
@indexes = &list_indexes($in{'db'});
}
if (&supports_views() && $access{'views'}) {
@views = &list_views($in{'db'});
}
if ($in{'search'}) {
# Limit to those matching search
@titles = grep { /\Q$in{'search'}\E/i } @titles;
@indexes = grep { /\Q$in{'search'}\E/i } @indexes;
@views = grep { /\Q$in{'search'}\E/i } @views;
print "
\n";
}
if (@titles+@indexes+@views > $max_dbs && !$in{'search'}) {
# Too many tables to show .. display search and jump forms
print &ui_form_start("edit_dbase.cgi");
print &ui_hidden("db", $in{'db'}),"\n";
print $text{'dbase_toomany'},"\n";
print &ui_textbox("search", undef, 20),"\n";
print &ui_submit($text{'index_search'}),"
\n";
print &ui_form_end();
# Table selector
print &ui_form_start("edit_table.cgi");
print $text{'dbase_jump'},"\n";
print &ui_hidden("db", $in{'db'}),"\n";
print &ui_select("table", undef, [ map { [ $_ ] } @titles ],
1, 0, 0, 0, "onChange='form.submit()'"),"\n";
print &ui_submit($text{'index_jumpok'}),"
\n";
print &ui_form_end();
# View selector (if any)
if (@views) {
print &ui_form_start("edit_view.cgi");
print $text{'dbase_vjump'},"\n";
print &ui_hidden("db", $in{'db'}),"\n";
print &ui_select("view", undef, [ map { [ $_ ] } @views ],
1, 0, 0, 0, "onChange='form.submit()'"),"\n";
print &ui_submit($text{'index_jumpok'}),"
\n";
print &ui_form_end();
}
# Index selector (if any)
if (@indexes) {
print &ui_form_start("edit_index.cgi");
print $text{'dbase_ijump'},"\n";
print &ui_hidden("db", $in{'db'}),"\n";
print &ui_select("index", undef, [ map { [ $_ ] } @indexes ],
1, 0, 0, 0, "onChange='form.submit()'"),"\n";
print &ui_submit($text{'index_jumpok'}),"
\n";
print &ui_form_end();
}
}
elsif (@titles || @indexes) {
@icons = ( ( map { "images/table.gif" } @titles ),
( map { "images/index.gif" } @indexes ),
( map { "images/view.gif" } @views ),
);
@links = ( ( map { "edit_table.cgi?db=$in{'db'}&table=".&urlize($_) }
@titles ),
( map { "edit_index.cgi?db=$in{'db'}&index=".&urlize($_) }
@indexes ),
( map { "edit_view.cgi?db=$in{'db'}&view=".&urlize($_) }
@views ),
);
@descs = ( ( map { "" } @titles ),
( map { " ($text{'dbase_index'})" } @indexes),
( map { " ($text{'dbase_view'})" } @views),
);
#&show_buttons();
print &ui_form_start("drop_tables.cgi");
print &ui_hidden("db", $in{'db'});
@rowlinks = ( &select_all_link("d", $form),
&select_invert_link("d", $form) );
print &ui_links_row(\@rowlinks);
@checks = ( ( @titles ),
( map { "!".$_ } @indexes ),
( map { "*".$_ } @views ),
);
if ($displayconfig{'style'} == 1) {
# Show table names, fields and row counts
foreach $t (@titles) {
local $c = &execute_sql($in{'db'},
"select count(*) from ".quotestr($t));
push(@rows, $c->{'data'}->[0]->[0]);
local @str = &table_structure($in{'db'}, $t);
push(@fields, scalar(@str));
}
foreach $t (@indexes) {
$str = &index_structure($in{'db'}, $t);
push(@rows, "$text{'dbase_index'}");
push(@fields, scalar(@{$str->{'cols'}}));
}
foreach $v (@indexes) {
push(@rows, "$text{'dbase_view'}");
push(@fields, undef);
}
@dtitles = map { &html_escape($_) }
( @titles, @indexes, @views );
&split_table([ "", $text{'dbase_table'}, $text{'dbase_rows'},
$text{'dbase_cols'} ],
\@checks, \@links, \@dtitles,
\@rows, \@fields) if (@titles);
}
elsif ($displayconfig{'style'} == 2) {
# Just show table names
@grid = ( );
@all = ( @titles, @indexes, @views );
for(my $i=0; $i<@links; $i++) {
push(@grid, &ui_checkbox("d", $checks[$i]).
" ".
&html_escape($all[$i])." ".$descs[$i]."");
}
print &ui_grid_table(\@grid, 4, 100, undef, undef,
$text{'dbase_header'});
}
else {
# Show table icons
@checks = map { &ui_checkbox("d", $_) } @checks;
@titles = map { &html_escape($_) } ( @titles, @indexes, @views);
&icons_table(\@links, \@titles, \@icons, 5, undef, undef, undef,
\@checks);
}
print &ui_links_row(\@rowlinks);
if (!$access{'edonly'}) {
print &ui_form_end([ [ "delete", @indexes ? $text{'dbase_delete2'} : $text{'dbase_delete'} ] ]);
}
else {
print &ui_form_end();
}
}
else {
if ($in{'search'}) {
print "$text{'dbase_none2'} \n";
}
else {
print "$text{'dbase_none'}
\n";
}
}
&show_buttons();
# Check if the user is from Virtualmin, and if so link back to his DB list
if (&foreign_check("virtual-server")) {
$virtual_server::no_virtualmin_plugins = 1;
&foreign_require("virtual-server", "virtual-server-lib.pl");
if (!&virtual_server::master_admin() &&
!&virtual_server::reseller_admin()) {
# Is a domain owner .. which domain is this DB in?
foreach my $d (grep { &virtual_server::can_edit_domain($_) }
&virtual_server::list_domains()) {
@dbs = &virtual_server::domain_databases($d);
($got) = grep { $_->{'name'} eq $in{'db'} &&
$_->{'type'} eq 'mysql' } @dbs;
if ($got) {
$virtualmin = $d->{'id'};
}
}
}
}
if ($virtualmin) {
&ui_print_footer("../virtual-server/list_databases.cgi?dom=$virtualmin",
$text{'index_return'});
}
elsif ($single) {
&ui_print_footer("/", $text{'index'});
}
else {
&ui_print_footer("", $text{'index_return'});
}
sub show_buttons
{
if (!$access{'edonly'}) {
print &ui_form_start("table_form.cgi");
print &ui_hidden("db", $in{'db'});
# Add a new table
print &ui_submit($text{'dbase_add'})." ".$text{'dbase_fields'}.
" ".&ui_textbox("fields", 4, 4);
print " \n";
# Add a new view
if (&supports_views() && $access{'views'}) {
print &ui_submit($text{'dbase_addview'}, 'addview');
print " \n";
}
# Delete this database
if ($access{'delete'}) {
print &ui_submit($text{'dbase_drop'}, 'dropdb');
print " \n";
}
# Open backup form
if ($access{'buser'}) {
print &ui_submit($text{'dbase_backup'}, 'backupdb');
print " \n";
}
# Execute SQL form
print &ui_submit($text{'dbase_exec'}, 'exec');
print " \n";
print &ui_form_end();
$form++;
}
}