--- /dev/null
+#!/usr/local/bin/perl
+# Drop several fields from a table
+
+require './postgresql-lib.pl';
+&ReadParse();
+&error_setup($text{'fdrop_err'});
+&can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'});
+
+# Validate inputs
+@d = split(/\0/, $in{'d'});
+@d || &error($text{'fdrop_enone'});
+@desc = &table_structure($in{'db'}, $in{'table'});
+@d < @desc || &error($text{'fdrop_eall'});
+
+# Do the deed
+foreach $d (@d) {
+ &execute_sql_logged($in{'db'},
+ "alter table "."e_table($in{'table'})." drop column \"$d\"");
+ }
+&webmin_log("delete", "fields", scalar(@d), \%in);
+&redirect("edit_table.cgi?db=$in{'db'}&table=".&urlize($in{'table'}));
+
+++ /dev/null
-#!/usr/local/bin/perl
-# drop_field.cgi
-# Drop a field from some table
-
-sub mytext($);
-
-require './postgresql-lib.pl';
-&ReadParse();
-&can_edit_db($in{'db'}) || &error(mytext('dbase_ecannot'));
-
-$desc = &text('table_header', "<tt>$in{'table'}</tt>", "<tt>$in{'db'}</tt>");
-&ui_print_header($desc, mytext('fdrop_title'), "", "field_drop");
-
-@desc = &table_structure($in{'db'}, $in{'table'});
-
-local $table_shuffle;
-# If a field drop has been specified using this script
-if ( $in{'dropfld'} && $in{'dropfldok'} ) {
-
- # Drop the field by copying the other fields through a temp table
- &error_setup(mytext('fdrop_err'));
-
- local $i;
- local $fld_list = "";
-
- if( @desc > 1 ) {
- for($i=0; $i<scalar(@desc); $i++) {
- local $r = $desc[$i];
- if( $in{'dropfld'} ne &html_escape($r->{'field'}) ) {
- # Note PostgreSQL requires quotes for uppercase
- if( $fld_list eq "" ) {
- $fld_list = '"'.$r->{'field'}.'"';
- } else {
- $fld_list = $fld_list . ', "' .$r->{'field'}.'"';
- }
- }
- }
- }
-
- if( $fld_list ne "" ) {
- local $tmp_tbl = "webmin_tmp_table".$PROCESS_ID;
- local $qt = "e_table($in{'table'});
- $table_shuffle = join '',
- "LOCK TABLE $qt;",
- "CREATE TABLE $tmp_tbl AS SELECT $fld_list FROM $qt;",
- "DROP TABLE $qt;",
- "ALTER TABLE $tmp_tbl RENAME TO $qt;";
-
- &execute_sql_logged($in{'db'}, $table_shuffle);
-
- &webmin_log("delete", "table+field", $in{'table'}."+".$in{'dropfld'}, \%in);
- }
-
- @desc = &table_structure($in{'db'}, $in{'table'});
-
-} # if a field drop has been specified
-
-# Display field selection screen
-
-$mid = int((@desc / 2)+0.5);
-print "<form action=drop_field.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-print "<table border=0 width=100%> <tr><td valign=top width=50%>\n";
-&type_table(0, $mid);
-print "</td><td valign=top width=50%>\n";
-&type_table($mid, scalar(@desc)) if (@desc > 1);
-print "</td></tr> </table>\n";
-
-print "<table width=100%><tr>\n";
-
-print "<td>\n";
-print "<input type=checkbox name=dropfldok",
- " value=dropit>",
- &html_escape(mytext('fdrop_lose_data')),
- "</option>",
- "</td>\n";
-print "<td align=right width=33%>\n";
-print '<input type=submit name="drop_a_fld" value="',
- mytext('fdrop_perform').'"></td>'."\n";
-
-print "</tr></table>\n";
-print "</form>\n";
-
-&ui_print_footer("edit_table.cgi?db=$in{'db'}&table=$in{'table'}",mytext('table_return'),
- "edit_dbase.cgi?db=$in{'db'}", mytext('dbase_return'),
- "", mytext('index_return'));
-
-sub type_table
-{
-print "<table border width=100%>\n";
-print "<tr $tb> <td><b>".mytext('table_field')."</b></td> ",
- "<td><b>".mytext('table_type')."</b></td> ",
- "<td><b>".mytext('table_arr')."</b></td> ",
- "<td><b>".mytext('fdrop_header')."</b></td> </tr>\n";
-local $i;
-for($i=$_[0]; $i<$_[1]; $i++) {
- local $r = $desc[$i];
- print "<tr $cb>\n";
- print "<td><a href='edit_field.cgi?db=$in{'db'}&table=$in{'table'}&",
- "idx=$i'>",&html_escape($r->{'field'}),"</a></td>\n";
- print "<td>",&html_escape($r->{'type'}),"</td>\n";
- print "<td>",$r->{'arr'} eq 'YES' ? mytext('yes')
- : mytext('no'),"</td>\n";
- print "<td>","<input type=radio name=dropfld value='",
- &html_escape($r->{'field'}),"' ></td>\n";
- print "</tr>\n";
- }
-print "</table>\n";
-}
-
-sub mytext($)
-{
- my ($x) = @_;
- my $rv = $text{"$x"};
- if( ! $rv ) {
- $rv = "$x"; # if unknown text, use the label
- }
- return $rv;
-}
$type = $f->{'type'};
}
-print "<form action=save_field.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-print "<input type=hidden name=new value='$in{'type'}'>\n";
-print "<table border>\n";
-print "<tr $tb> <td><b>$text{'field_header'}</b></td> </tr>\n";
-print "<tr $cb> <td><table>\n";
+# Start of form block
+print &ui_form_start("save_field.cgi", "post");
+print &ui_hidden("db", $in{'db'});
+print &ui_hidden("table", $in{'table'});
+print &ui_hidden("new", $in{'type'});
+print &ui_table_start($text{'field_header'}, undef, 2);
-print "<tr> <td><b>$text{'field_name'}</b></td>\n";
-print "<td><input name=field size=20 value='$f->{'field'}'></td> </tr>\n";
-print "<input type=hidden name=old value='$f->{'field'}'>\n" if (!$in{'type'});
+# Field name
+print &ui_table_row($text{'field_name'},
+ &ui_textbox("field", $f->{'field'}, 40));
+print &ui_hidden("old", $f->{'field'}) if (!$in{'type'});
+# Field type
if ($type =~ /^(\S+)\((.*)\)/) {
$type = $1;
$size = $2;
}
-print "<input type=hidden name=type value='$type'>\n";
-print "<tr> <td><b>$text{'field_type'}</b></td>\n";
-print "<td>$type</td> </tr>\n";
+print &ui_table_row($text{'field_type'}, $type);
+print &ui_hidden("type", $type);
if ($type eq 'char' || $type eq 'varchar' || $type eq 'numeric' ||
$type eq 'bit') {
if ($in{'type'}) {
# Type has a size
- print "<tr> <td><b>$text{'field_size'}</b></td>\n";
- print "<td><input name=size size=10 value='$size'></td></tr>\n";
+ print &ui_table_row($text{'field_size'},
+ &ui_textbox("size", $size, 15));
}
else {
# Type cannot be edited
- print "<tr> <td><b>$text{'field_size'}</b></td>\n";
- print "<td>$size</td> </tr>\n";
+ print &ui_table_row($text{'field_size'}, $size);
}
}
-print "<tr> <td><b>$text{'field_arr'}</b></td> <td>\n";
if ($in{'type'}) {
# Ask if this is an array
- print "<input name=arr type=radio value=1> $text{'yes'}\n";
- print "<input name=arr type=radio value=0 checked> $text{'no'}\n";
+ print &ui_table_row($text{'field_arr'},
+ &ui_yesno_radio("arr", 0));
}
else {
# Display if array or not
- print $f->{'arr'} eq 'YES' ? $text{'yes'} : $text{'no'};
+ print &ui_table_row($text{'field_arr'},
+ $f->{'arr'} eq 'YES' ? $text{'yes'} : $text{'no'});
}
-print "</td> </tr>\n";
if (!$in{'type'}) {
# Display nulls
- print "<tr> <td><b>$text{'field_null'}</b></td>\n";
- print "<td>",$f->{'null'} eq 'YES' ? $text{'yes'}
- : $text{'no'},"</td> </tr>\n";
+ print &ui_table_row($text{'field_null'},
+ $f->{'null'} eq 'YES' ? $text{'yes'} : $text{'no'});
}
-print "</table></td></tr></table>\n";
+print &ui_table_end();
if ($in{'type'}) {
- print "<input type=submit value='$text{'create'}'>\n";
+ print &ui_form_end([ [ undef, $text{'create'} ] ]);
}
else {
- print "<input type=submit value='$text{'save'}'>\n";
- if (&can_drop_fields() && @desc > 1) {
- print "<input type=submit name=delete value='$text{'delete'}'>\n";
- }
+ print &ui_form_end([ [ undef, $text{'save'} ],
+ &can_drop_fields() && @desc > 1 ?
+ ( [ 'delete', $text{'delete'} ] ) : ( ) ]);
}
-print "</form>\n";
-&ui_print_footer("edit_table.cgi?db=$in{'db'}&table=$in{'table'}",$text{'table_return'},
- "edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
- "", $text{'index_return'});
+&ui_print_footer("edit_table.cgi?db=$in{'db'}&table=$in{'table'}",
+ $text{'table_return'},
+ "edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
+ "", $text{'index_return'});
$desc = &text('table_header', "<tt>$in{'table'}</tt>", "<tt>$in{'db'}</tt>");
&ui_print_header($desc, $text{'table_title'}, "", "edit_table");
+# Table of fields
+print &ui_form_start("delete_fields.cgi", "post");
+print &ui_hidden("db", $in{'db'}),"\n";
+print &ui_hidden("table", $in{'table'}),"\n";
@desc = &table_structure($in{'db'}, $in{'table'});
-print "<form action=edit_field.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-
-$mid = int((@desc / 2)+0.5);
-print "<table border=0 width=100%> <tr><td valign=top width=50%>\n";
-&type_table(0, $mid);
-print "</td><td valign=top width=50%>\n";
-&type_table($mid, scalar(@desc)) if (@desc > 1);
-print "</td></tr> </table>\n";
-
-print "<table width=100%><tr>\n";
-print "<td width=33% nowrap><input type=submit value='$text{'table_add'}'>\n";
-print "<select name=type>\n";
-foreach $t (&list_types()) {
- print "<option>$t\n";
+$candrop = &can_drop_fields() && @desc > 1;
+@tds = $candrop ? ( "width=5" ) : ( );
+@rowlinks = ( &select_all_link("d"), &select_invert_link("d") );
+print &ui_links_row(\@rowlinks);
+print &ui_columns_start([ $candrop ? ( "" ) : ( ),
+ $text{'table_field'},
+ $text{'table_type'},
+ $text{'table_arr'},
+ $text{'table_null'} ], 100, 0, \@tds);
+$i = 0;
+foreach $r (@desc) {
+ @cols = ( "<a href='edit_field.cgi?db=$in{'db'}&table=$in{'table'}&".
+ "idx=$i'>".&html_escape($r->{'field'})."</a>",
+ &html_escape($r->{'type'}),
+ $r->{'arr'} eq 'YES' ? $text{'yes'} : $text{'no'},
+ $r->{'null'} eq 'YES' ? $text{'yes'} : $text{'no'},
+ );
+ if ($candrop) {
+ print &ui_checked_columns_row(\@cols, \@tds, "d",$r->{'field'});
+ }
+ else {
+ print &ui_columns_row(\@cols, \@tds);
+ }
+ $i++;
}
-print "</select></td></form>\n";
+print &ui_columns_end();
+print &ui_links_row(\@rowlinks);
+print &ui_form_end($candrop ? [ [ "delete", $text{'table_delete'} ] ] : [ ]);
-print "<form action=view_table.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-print "<td align=middle width=22%>\n";
-print "<input type=submit value='$text{'table_data'}'></td>\n";
-print "</form>\n";
+$hiddens = &ui_hidden("db", $in{'db'}).&ui_hidden("table", $in{'table'});
+print "<table><tr>\n";
-print "<form action=csv_form.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-print "<td align=middle width=22%>\n";
-print "<input type=submit value='$text{'table_csv'}'></td>\n";
-print "</form>\n";
+# Add a field
+print &ui_form_start("edit_field.cgi");
+print $hiddens;
+print "<td nowrap>",&ui_submit($text{'table_add'});
+print &ui_select("type", undef, [ &list_types() ]);
+print "</td>",&ui_form_end();
-if (!&can_drop_fields()) {
- print "<form action=drop_field.cgi>\n";
- print "<input type=hidden name=db value='$in{'db'}'>\n";
- print "<input type=hidden name=table value='$in{'table'}'>\n";
- print "<td align=right width=22%>\n";
- print "<input type=submit name=drop_a_fld value='$text{'table_fielddrop'}'></td>\n";
- print "</form>\n";
- }
+# View and edit data button
+print &ui_form_start("view_table.cgi", "form-data");
+print $hiddens;
+print "<td>",&ui_submit($text{'table_data'});
+print "</td>",&ui_form_end();
+
+# CSV export button
+print &ui_form_start("csv_form.cgi");
+print $hiddens;
+print "<td>",&ui_submit($text{'table_csv'});
+print "</td>",&ui_form_end();
# Create index button
if (&supports_indexes() && $access{'indexes'}) {
- print "<form action=edit_index.cgi>\n";
- print "<input type=hidden name=db value='$in{'db'}'>\n";
- print "<input type=hidden name=table value='$in{'table'}'>\n";
- print "<td align=center width=25%>\n";
- print "<input type=submit value='$text{'table_index'}'></td>\n";
- print "</form>\n";
+ print &ui_form_start("edit_index.cgi");
+ print $hiddens;
+ print "<td>",&ui_submit($text{'table_index'});
+ print "</td>",&ui_form_end();
}
-print "<form action=drop_table.cgi>\n";
-print "<input type=hidden name=db value='$in{'db'}'>\n";
-print "<input type=hidden name=table value='$in{'table'}'>\n";
-print "<td align=right width=22%>\n";
-print "<input type=submit value='$text{'table_drop'}'></td>\n";
-print "</form>\n";
+# Drop table button
+print &ui_form_start("drop_table.cgi");
+print $hiddens;
+print "<td>",&ui_submit($text{'table_drop'});
+print "</td>",&ui_form_end();
print "</tr></table>\n";
&ui_print_footer("edit_dbase.cgi?db=$in{'db'}", $text{'dbase_return'},
"", $text{'index_return'});
-sub type_table
-{
-print "<table border width=100%>\n";
-print "<tr $tb> <td><b>$text{'table_field'}</b></td> ",
- "<td><b>$text{'table_type'}</b></td> ",
- "<td><b>$text{'table_arr'}</b></td> ",
- "<td><b>$text{'table_null'}</b></td> </tr>\n";
-local $i;
-for($i=$_[0]; $i<$_[1]; $i++) {
- local $r = $desc[$i];
- print "<tr $cb>\n";
- print "<td><a href='edit_field.cgi?db=$in{'db'}&table=$in{'table'}&",
- "idx=$i'>",&html_escape($r->{'field'}),"</a></td>\n";
- print "<td>",&html_escape($r->{'type'}),"</td>\n";
- print "<td>",$r->{'arr'} eq 'YES' ? $text{'yes'}
- : $text{'no'},"</td>\n";
- print "<td>",$r->{'null'} eq 'YES' ? $text{'yes'}
- : $text{'no'},"</td>\n";
- print "</tr>\n";
- }
-print "</table>\n";
-}
-
table_eblob=No size is needed for BLOB field $1
table_csv=Export as CSV
table_index=Create Index
+table_delete=Delete Selected Fields
field_title1=Add Field
field_title2=Modify Field
log_field_create=Added field $1 $4 to $2 in database $3
log_field_modify=Modified field $1 $4 in $2 in database $3
log_field_delete=Deleted field $1 from $2 in database $3
+log_fields_delete=Deleted $1 fields from $1 in database $2
log_data_create=Added row to table $2 in database $3
log_data_modify=Modified $1 rows in table $2 in database $3
log_data_delete=Deleted $1 rows from table $2 in database $3
acl_indexes=Can view and manage indexes?
acl_seqs=Can view and manage sequences?
-fdrop_err=Error during field drop
-fdrop_header=Drop This One
-fdrop_lose_data=Select box to confirm that you understand that definitions, such as indexes and default values, on all fields may be lost.
-fdrop_perform=Drop Field
-fdrop_title=Drop Field
+fdrop_err=Failed to delete fields
+fdrop_enone=None selected
+fdrop_eall=You cannot delete all fields from a table!
setup_err=Failed to initialize database
setup_ecannot=You are not allowed to initialize the database
+++ /dev/null
-#!/usr/local/bin/perl
-# list_locals.cgi
-# Display local access records
-
-require './postgresql-lib.pl';
-$access{'users'} || &error($text{'local_ecannot'});
-&ui_print_header(undef, $text{'local_title'}, "");
-
-@locals = grep { $_->{'type'} eq 'local' } &get_hba_config();
-print "<table border width=100%>\n";
-print "<tr $tb> <td><b>$text{'host_db'}</b></td> ",
- "<td><b>$text{'host_auth'}</b></td> </tr>\n";
-foreach $l (@locals) {
- print "<tr $cb>\n";
- print "<td>",$l->{'db'} eq 'all' ? $text{'host_all'} :
- $l->{'db'} eq 'sameuser' ? $text{'host_same'} :
- $l->{'db'},"</td>\n";
- print "<td>",$text{"host_$l->{'auth'}"},"</td>\n";
- print "</tr>\n";
- }
-print "</table>\n";
-print "<a href='edit_local.cgi?new=1'>$text{'local_add'}</a><p>\n";
-
-&ui_print_footer("", $text{'index'});
-
"<tt>$p->{'table'}</tt>", "<tt>$p->{'db'}</tt>",
"<tt>$p->{'type'}$p->{'size'}</tt>");
}
+elsif ($type eq 'fields') {
+ return &text("log_${type}_${action}", $object,
+ "<tt>$p->{'table'}</tt>", "<tt>$p->{'db'}</tt>");
+ }
elsif ($type eq 'data') {
return &text("log_${type}_${action}", "<tt>$object</tt>",
"<tt>$p->{'table'}</tt>", "<tt>$p->{'db'}</tt>");