Handle hostnames with upper-case letters
[webmin.git] / mysql / edit_dbase.cgi
1 #!/usr/local/bin/perl
2 # edit_dbase.cgi
3 # Show database tables and indexes
4
5 require './mysql-lib.pl';
6 &ReadParse();
7 &can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
8 @titles = grep { &can_edit_db($_) } &list_databases();
9 $desc = "<tt>$in{'db'}</tt>";
10 if (@titles == 1 && $module_info{'usermin'}) {
11         # Single-DB mode
12         &ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase", 1, 1);
13         $single = 1;
14         }
15 else {
16         &ui_print_header($desc, $text{'dbase_title'}, "", "edit_dbase");
17         }
18 @titles = &list_tables($in{'db'});
19 if ($access{'indexes'}) {
20         @indexes = &list_indexes($in{'db'});
21         }
22 if (&supports_views() && $access{'views'}) {
23         @views = &list_views($in{'db'});
24         }
25
26 if ($in{'search'}) {
27         # Limit to those matching search
28         @titles = grep { /\Q$in{'search'}\E/i } @titles;
29         @indexes = grep { /\Q$in{'search'}\E/i } @indexes;
30         @views = grep { /\Q$in{'search'}\E/i } @views;
31         print "<table width=100%><tr>\n";
32         print "<td> <b>",&text('dbase_showing',
33                 "<tt>$in{'search'}</tt>"),"</b></td>\n";
34         print "<td align=right><a href='edit_dbase.cgi?db=$in{'db'}'>",
35                 "$text{'view_searchreset'}</a></td>\n";
36         print "</tr></table>\n";
37         }
38
39 if (@titles+@indexes+@views > $max_dbs && !$in{'search'}) {
40         # Too many tables to show .. display search and jump forms
41         print &ui_form_start("edit_dbase.cgi");
42         print &ui_hidden("db", $in{'db'}),"\n";
43         print $text{'dbase_toomany'},"\n";
44         print &ui_textbox("search", undef, 20),"\n";
45         print &ui_submit($text{'index_search'}),"<br>\n";
46         print &ui_form_end();
47
48         # Table selector
49         print &ui_form_start("edit_table.cgi");
50         print $text{'dbase_jump'},"\n";
51         print &ui_hidden("db", $in{'db'}),"\n";
52         print &ui_select("table", undef, [ map { [ $_ ] } @titles ],
53                          1, 0, 0, 0, "onChange='form.submit()'"),"\n";
54         print &ui_submit($text{'index_jumpok'}),"<br>\n";
55         print &ui_form_end();
56
57         # View selector (if any)
58         if (@views) {
59                 print &ui_form_start("edit_view.cgi");
60                 print $text{'dbase_vjump'},"\n";
61                 print &ui_hidden("db", $in{'db'}),"\n";
62                 print &ui_select("view", undef, [ map { [ $_ ] } @views ],
63                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
64                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
65                 print &ui_form_end();
66                 }
67
68         # Index selector (if any)
69         if (@indexes) {
70                 print &ui_form_start("edit_index.cgi");
71                 print $text{'dbase_ijump'},"\n";
72                 print &ui_hidden("db", $in{'db'}),"\n";
73                 print &ui_select("index", undef, [ map { [ $_ ] } @indexes ],
74                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
75                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
76                 print &ui_form_end();
77                 }
78         }
79 elsif (@titles || @indexes) {
80         @icons = ( ( map { "images/table.gif" } @titles ),
81                    ( map { "images/index.gif" } @indexes ),
82                    ( map { "images/view.gif" } @views ),
83                  );
84         @links = ( ( map { "edit_table.cgi?db=$in{'db'}&table=".&urlize($_) }
85                          @titles ),
86                    ( map { "edit_index.cgi?db=$in{'db'}&index=".&urlize($_) }
87                          @indexes ),
88                    ( map { "edit_view.cgi?db=$in{'db'}&view=".&urlize($_) }
89                          @views ),
90                  );
91         @descs = ( ( map { "" } @titles ),
92                    ( map { " ($text{'dbase_index'})" } @indexes),
93                    ( map { " ($text{'dbase_view'})" } @views),
94                  );
95         #&show_buttons();
96         print &ui_form_start("drop_tables.cgi");
97         print &ui_hidden("db", $in{'db'});
98         @rowlinks = ( &select_all_link("d", $form),
99                       &select_invert_link("d", $form) );
100         print &ui_links_row(\@rowlinks);
101         @checks = ( ( @titles ),
102                     ( map { "!".$_ } @indexes ),
103                     ( map { "*".$_ } @views ),
104                   );
105         if ($displayconfig{'style'} == 1) {
106                 # Show table names, fields and row counts
107                 foreach $t (@titles) {
108                         local $c = &execute_sql($in{'db'},
109                                         "select count(*) from ".quotestr($t));
110                         push(@rows, $c->{'data'}->[0]->[0]);
111                         local @str = &table_structure($in{'db'}, $t);
112                         push(@fields, scalar(@str));
113                         }
114                 foreach $t (@indexes) {
115                         $str = &index_structure($in{'db'}, $t);
116                         push(@rows, "<i>$text{'dbase_index'}</i>");
117                         push(@fields, scalar(@{$str->{'cols'}}));
118                         }
119                 foreach $v (@indexes) {
120                         push(@rows, "<i>$text{'dbase_view'}</i>");
121                         push(@fields, undef);
122                         }
123                 @dtitles = map { &html_escape($_) }
124                                ( @titles, @indexes, @views );
125                 &split_table([ "", $text{'dbase_table'}, $text{'dbase_rows'},
126                                $text{'dbase_cols'} ],
127                              \@checks, \@links, \@dtitles,
128                              \@rows, \@fields) if (@titles);
129                 }
130         elsif ($displayconfig{'style'} == 2) {
131                 # Just show table names
132                 @grid = ( );
133                 @all = ( @titles, @indexes, @views );
134                 for(my $i=0; $i<@links; $i++) {
135                         push(@grid, &ui_checkbox("d", $checks[$i]).
136                           " <a href='$links[$i]'>".
137                           &html_escape($all[$i])." ".$descs[$i]."</a>");
138                         }
139                 print &ui_grid_table(\@grid, 4, 100, undef, undef,
140                                      $text{'dbase_header'});
141                 }
142         else {
143                 # Show table icons
144                 @checks = map { &ui_checkbox("d", $_) } @checks;
145                 @titles = map { &html_escape($_) } ( @titles, @indexes, @views);
146                 &icons_table(\@links, \@titles, \@icons, 5, undef, undef, undef,
147                              \@checks);
148                 }
149         print &ui_links_row(\@rowlinks);
150         if (!$access{'edonly'}) {
151                 print &ui_form_end([ [ "delete", @indexes ? $text{'dbase_delete2'} : $text{'dbase_delete'} ] ]);
152                 }
153         else {
154                 print &ui_form_end();
155                 }
156         }
157 else {
158         if ($in{'search'}) {
159                 print "<b>$text{'dbase_none2'}</b> <p>\n";
160                 }
161         else {
162                 print "<b>$text{'dbase_none'}</b> <p>\n";
163                 }
164         }
165 &show_buttons();
166
167 # Check if the user is from Virtualmin, and if so link back to his DB list
168 if (&foreign_check("virtual-server")) {
169         $virtual_server::no_virtualmin_plugins = 1;
170         &foreign_require("virtual-server", "virtual-server-lib.pl");
171         if (!&virtual_server::master_admin() &&
172             !&virtual_server::reseller_admin()) {
173                 # Is a domain owner .. which domain is this DB in?
174                 foreach my $d (grep { &virtual_server::can_edit_domain($_) }
175                                     &virtual_server::list_domains()) {
176                         @dbs = &virtual_server::domain_databases($d);
177                         ($got) = grep { $_->{'name'} eq $in{'db'} &&
178                                         $_->{'type'} eq 'mysql' } @dbs;
179                         if ($got) {
180                                 $virtualmin = $d->{'id'};
181                                 }
182                         }
183                 }
184         }
185
186 if ($virtualmin) {
187         &ui_print_footer("../virtual-server/list_databases.cgi?dom=$virtualmin",
188                          $text{'index_return'});
189         }
190 elsif ($single) {
191         &ui_print_footer("/", $text{'index'});
192         }
193 else {
194         &ui_print_footer("", $text{'index_return'});
195         }
196
197 sub show_buttons
198 {
199 if (!$access{'edonly'}) {
200         print &ui_form_start("table_form.cgi");
201         print &ui_hidden("db", $in{'db'});
202
203         # Add a new table
204         print &ui_submit($text{'dbase_add'})." ".$text{'dbase_fields'}.
205                           " ".&ui_textbox("fields", 4, 4);
206         print "&nbsp;\n";
207
208         # Add a new view
209         if (&supports_views() && $access{'views'}) {
210                 print &ui_submit($text{'dbase_addview'}, 'addview');
211                 print "&nbsp;\n";
212                 }
213
214         # Delete this database
215         if ($access{'delete'}) {
216                 print &ui_submit($text{'dbase_drop'}, 'dropdb');
217                 print "&nbsp;\n";
218                 }
219
220         # Open backup form
221         if ($access{'buser'}) {
222                 print &ui_submit($text{'dbase_backup'}, 'backupdb');
223                 print "&nbsp;\n";
224                 }
225
226         # Execute SQL form
227         print &ui_submit($text{'dbase_exec'}, 'exec');
228         print "&nbsp;\n";
229
230         print &ui_form_end();
231         $form++;
232         }
233 }
234