Handle hostnames with upper-case letters
[webmin.git] / postgresql / edit_dbase.cgi
1 #!/usr/local/bin/perl
2 # edit_dbase.cgi
3 # Show database tables
4
5 require './postgresql-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-database 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
19 # Is this database accepting connections?
20 if (!&accepting_connections($in{'db'})) {
21         print "$text{'dbase_noconn'}<p>\n";
22         &ui_print_footer("", $text{'index_return'});
23         exit;
24         }
25
26 @titles = &list_tables($in{'db'});
27 if (&supports_indexes() && $access{'indexes'}) {
28         @indexes = &list_indexes($in{'db'});
29         }
30 if (&supports_views() && $access{'views'}) {
31         @views = &list_views($in{'db'});
32         }
33 if (&supports_sequences() && $access{'seqs'}) {
34         @seqs = &list_sequences($in{'db'});
35         }
36
37 if ($in{'search'}) {
38         # Limit to those matching search
39         @titles = grep { /\Q$in{'search'}\E/i } @titles;
40         @indexes = grep { /\Q$in{'search'}\E/i } @indexes;
41         @views = grep { /\Q$in{'search'}\E/i } @views;
42         @seqs = grep { /\Q$in{'search'}\E/i } @seqs;
43         print "<table width=100%><tr>\n";
44         print "<td> <b>",&text('dbase_showing',
45                 "<tt>$in{'search'}</tt>"),"</b></td>\n";
46         print "<td align=right><a href='edit_dbase.cgi?db=$in{'db'}'>",
47                 "$text{'view_searchreset'}</a></td>\n";
48         print "</tr></table>\n";
49         }
50
51 if (@titles+@indexes+@views+@seqs > $max_dbs && !$in{'search'}) {
52         # Too many tables to show .. display search and jump forms
53         print &ui_form_start("edit_dbase.cgi");
54         print &ui_hidden("db", $in{'db'}),"\n";
55         print $text{'dbase_toomany'},"\n";
56         print &ui_textbox("search", undef, 20),"\n";
57         print &ui_submit($text{'index_search'}),"<br>\n";
58         print &ui_form_end();
59
60         # Table selector
61         print &ui_form_start("edit_table.cgi");
62         print $text{'dbase_jump'},"\n";
63         print &ui_hidden("db", $in{'db'}),"\n";
64         print &ui_select("table", undef, [ map { [ $_ ] } @titles ],
65                          1, 0, 0, 0, "onChange='form.submit()'"),"\n";
66         print &ui_submit($text{'index_jumpok'}),"<br>\n";
67         print &ui_form_end();
68
69         # View selector (if any)
70         if (@views) {
71                 print &ui_form_start("edit_view.cgi");
72                 print $text{'dbase_vjump'},"\n";
73                 print &ui_hidden("db", $in{'db'}),"\n";
74                 print &ui_select("view", undef, [ map { [ $_ ] } @views ],
75                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
76                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
77                 print &ui_form_end();
78                 }
79
80         # Index selector (if any)
81         if (@indexes) {
82                 print &ui_form_start("edit_index.cgi");
83                 print $text{'dbase_ijump'},"\n";
84                 print &ui_hidden("db", $in{'db'}),"\n";
85                 print &ui_select("index", undef, [ map { [ $_ ] } @indexes ],
86                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
87                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
88                 print &ui_form_end();
89                 }
90
91         # Sequence selector (if any)
92         if (@seqs) {
93                 print &ui_form_start("edit_seq.cgi");
94                 print $text{'dbase_sjump'},"\n";
95                 print &ui_hidden("db", $in{'db'}),"\n";
96                 print &ui_select("seq", undef, [ map { [ $_ ] } @seqs ],
97                                  1, 0, 0, 0, "onChange='form.submit()'"),"\n";
98                 print &ui_submit($text{'index_jumpok'}),"<br>\n";
99                 print &ui_form_end();
100                 }
101         }
102 elsif (@titles || @indexes || @views || @seqs) {
103         @icons = ( ( map { "images/table.gif" } @titles ),
104                    ( map { "images/index.gif" } @indexes ),
105                    ( map { "images/view.gif" } @views ),
106                    ( map { "images/seq.gif" } @seqs ),
107                  );
108         @links = ( ( map { "edit_table.cgi?db=$in{'db'}&table=".&urlize($_) }
109                          @titles ),
110                    ( map { "edit_index.cgi?db=$in{'db'}&index=".&urlize($_) }
111                          @indexes ),
112                    ( map { "edit_view.cgi?db=$in{'db'}&view=".&urlize($_) }
113                          @views ),
114                    ( map { "edit_seq.cgi?db=$in{'db'}&seq=".&urlize($_) }
115                          @seqs ),
116                  );
117         @descs = ( ( map { "" } @titles ),
118                    ( map { " ($text{'dbase_index'})" } @indexes),
119                    ( map { " ($text{'dbase_view'})" } @views),
120                    ( map { " ($text{'dbase_seq'})" } @seqs),
121                  );
122         #&show_buttons();
123         @rowlinks = ( );
124         if ($access{'tables'}) {
125                 print &ui_form_start("drop_tables.cgi");
126                 print &ui_hidden("db", $in{'db'});
127                 push(@rowlinks, &select_all_link("d", $form),
128                                 &select_invert_link("d", $form) );
129                 @checks = ( ( @titles ),
130                             ( map { "!".$_ } @indexes ),
131                             ( map { "*".$_ } @views ),
132                             ( map { "/".$_ } @seqs ),
133                            );
134                 }
135         print &ui_links_row(\@rowlinks);
136         @dtitles = map { &html_escape($_) } ( @titles, @indexes, @views,@seqs );
137         if ($displayconfig{'style'} == 1) {
138                 # Show as table
139                 foreach $t (@titles) {
140                         local $c;
141                         eval {
142                                 local $main::error_must_die = 1;
143                                 $c = &execute_sql($in{'db'},
144                                     "select count(*) from ".quote_table($t));
145                                 };
146                         $c ||= { 'data' => [ [ "-" ] ] };
147                         push(@rows, $c->{'data'}->[0]->[0]);
148                         local @str = &table_structure($in{'db'}, $t);
149                         push(@fields, scalar(@str));
150                         }
151                 foreach $t (@indexes) {
152                         $str = &index_structure($in{'db'}, $t);
153                         push(@rows, "<i>$text{'dbase_index'}</i>");
154                         push(@fields, scalar(@{$str->{'cols'}}));
155                         }
156                 foreach $t (@views) {
157                         push(@rows, "<i>$text{'dbase_view'}</i>");
158                         push(@fields, undef);
159                         }
160                 foreach $t (@seqs) {
161                         $str = &sequence_structure($in{'db'}, $t);
162                         push(@rows, "<i>$text{'dbase_seq'}</i>");
163                         push(@fields, $str->{'last_value'});
164                         }
165                 &split_table([ "", $text{'dbase_table'}, $text{'dbase_rows'},
166                                $text{'dbase_cols'} ],
167                              \@checks, \@links, \@dtitles,
168                              \@rows, \@fields) if (@titles);
169                 }
170         elsif ($displayconfig{'style'} == 2) {
171                 # Just show table names
172                 @grid = ( );
173                 @all = ( @titles, @indexes, @views, @seqs );
174                 for(my $i=0; $i<@links; $i++) {
175                         push(@grid, &ui_checkbox("d", $checks[$i]).
176                           " <a href='$links[$i]'>".
177                           &html_escape($all[$i])." ".$descs[$i]."</a>");
178                         }
179                 print &ui_grid_table(\@grid, 4, 100, undef, undef,
180                                      $text{'dbase_header'});
181                 }
182         else {
183                 # Show as icons
184                 @checks = map { &ui_checkbox("d", $_) } @checks;
185                 &icons_table(\@links, \@dtitles, \@icons, 5, undef, undef,undef,
186                              @checks ? \@checks : undef);
187                 }
188         print &ui_links_row(\@rowlinks);
189         if ($access{'tables'}) {
190                 print &ui_form_end([ [ "delete", $text{'dbase_delete'} ] ]);
191                 }
192         }
193 else {
194         print "<b>$text{'dbase_none'}</b> <p>\n";
195         }
196 &show_buttons();
197
198 # Check if the user is from Virtualmin, and if so link back to his DB list
199 if (&foreign_check("virtual-server")) {
200         $virtual_server::no_virtualmin_plugins = 1;
201         &foreign_require("virtual-server", "virtual-server-lib.pl");
202         if (!&virtual_server::master_admin() &&
203             !&virtual_server::reseller_admin()) {
204                 # Is a domain owner .. which domain is this DB in?
205                 foreach my $d (grep { &virtual_server::can_edit_domain($_) }
206                                     &virtual_server::list_domains()) {
207                         @dbs = &virtual_server::domain_databases($d);
208                         ($got) = grep { $_->{'name'} eq $in{'db'} &&
209                                         $_->{'type'} eq 'postgres' } @dbs;
210                         if ($got) {
211                                 $virtualmin = $d->{'id'};
212                                 }
213                         }
214                 }
215         }
216
217 if ($virtualmin) {
218         &ui_print_footer("../virtual-server/list_databases.cgi?dom=$virtualmin",
219                          $text{'index_return'});
220         }
221 elsif ($single) {
222         &ui_print_footer("/", $text{'index'});
223         }
224 else {
225         &ui_print_footer("", $text{'index_return'});
226         }
227
228 # Display buttons for adding tables, views and so on
229 sub show_buttons
230 {
231 print &ui_form_start("table_form.cgi");
232 print &ui_hidden("db", $in{'db'});
233
234 if ($access{'tables'}) {
235         # Add a new table
236         print &ui_submit($text{'dbase_add'})." ".$text{'dbase_fields'}.
237                          " ".&ui_textbox("fields", 4, 4);
238         print "&nbsp;\n";
239
240         # Add a new view
241         if (&supports_views() && $access{'views'}) {
242                 print &ui_submit($text{'dbase_vadd'}, 'addview');
243                 print "&nbsp;\n";
244                 }
245
246         # Add a new sequence
247         if (&supports_sequences() && $access{'seqs'}) {
248                 print &ui_submit($text{'dbase_sadd'}, 'addseq');
249                 print "&nbsp;\n";
250                 }
251         }
252
253 # Drop database button
254 if ($access{'delete'}) {
255         print &ui_submit($text{'dbase_drop'}, 'dropdb');
256         print "&nbsp;\n";
257         }
258
259 # Backup and restore buttons
260 if (&get_postgresql_version() >= 7.2) {
261         if ($access{'backup'}) {
262                 print &ui_submit($text{'dbase_bkup'}, 'backupdb');
263                 print "&nbsp;\n";
264                 }
265         if ($access{'restore'}) {
266                 print &ui_submit($text{'dbase_rstr'}, 'restoredb');
267                 print "&nbsp;\n";
268                 }
269         }
270
271 # Execute SQL form
272 print &ui_submit($text{'dbase_exec'}, 'exec');
273 print "&nbsp;\n";
274
275 print &ui_form_end();
276 $form++;
277 }
278