#!/usr/local/bin/perl # view_table.cgi # Display all data in some table if (-r 'mysql-lib.pl') { require './mysql-lib.pl'; } else { require './postgresql-lib.pl'; } require './view-lib.pl'; if ($config{'charset'}) { $main::force_charset = $config{'charset'}; } if ($ENV{'CONTENT_TYPE'} !~ /boundary=/) { &ReadParse(); } else { &ReadParseMime(); } &can_edit_db($in{'db'}) || &error($text{'dbase_ecannot'}); @str = &table_structure($in{'db'}, $in{'table'}); foreach $s (@str) { $keyed++ if ($s->{'key'} eq 'PRI'); } if (!$keyed && $module_name eq "postgresql") { # Can use oid as key eval { $main::error_must_die = 1; $d = &execute_sql($in{'db'}, "select oid from ". "e_table($in{'table'}). " where 0 = 1"); }; if (!$@) { # Has an OID, so use it $use_oids = 1; $keyed = 1; } } # Get search SQL ($search, $searchhids, $searchargs, $advcount) = &get_search_args(\%in); # Work out start position $d = &execute_sql_safe($in{'db'}, "select count(*) from "."e_table($in{'table'})." ".$search); $total = int($d->{'data'}->[0]->[0]); if ($in{'jump'} > 0) { $in{'start'} = int($in{'jump'} / $displayconfig{'perpage'}) * $displayconfig{'perpage'}; if ($in{'start'} >= $total) { $in{'start'} = $total - $displayconfig{'perpage'}; $in{'start'} = int(($in{'start'} / $displayconfig{'perpage'}) + 1) * $displayconfig{'perpage'}; } } else { $in{'start'} = int($in{'start'}); } if ($in{'new'} && $total > $displayconfig{'perpage'}) { # go to the last screen for adding a row $in{'start'} = $total - $displayconfig{'perpage'}; $in{'start'} = int(($in{'start'} / $displayconfig{'perpage'}) + 1) * $displayconfig{'perpage'}; } # Get limiting and sorting SQL $limitsql = &get_search_limit(\%in); ($sortsql, $sorthids, $sortargs) = &get_search_sort(\%in); # Work out where clause for rows we are operating on $where_select = "select ".($use_oids ? "oid" : "*"). " from "."e_table($in{'table'})." $search $sortsql $limitsql"; if ($in{'delete'}) { # Deleting selected rows $d = &execute_sql($in{'db'}, $where_select); @t = map { $_->{'field'} } @str; $count = 0; foreach $r (split(/\0/, $in{'row'})) { local @where; local @r = @{$d->{'data'}->[$r]}; if ($use_oids) { # Where clause just uses OID push(@where, "oid = $r[0]"); } else { # Where clause uses keys for($i=0; $i<@t; $i++) { if ($str[$i]->{'key'} eq 'PRI') { if ($r[$i] eq 'NULL') { push(@where, "estr($t[$i]). " is null"); } else { $r[$i] =~ s/'/''/g; push(@where, "estr($t[$i]). " = '$r[$i]'"); } } } } &execute_sql_logged($in{'db'}, "delete from "."e_table($in{'table'}). " where ".join(" and ", @where)); $count++; } &webmin_log("delete", "data", $count, \%in); &redirect("view_table.cgi?db=$in{'db'}&". "table=".&urlize($in{'table'})."&start=$in{'start'}". $searchargs.$sortargs); } elsif ($in{'save'}) { # Update edited rows $d = &execute_sql($in{'db'}, $where_select); @t = map { $_->{'field'} } @str; $count = 0; for($j=0; $j<$displayconfig{'perpage'}; $j++) { next if (!defined($in{"${j}_$t[0]"})); local (@where, @set); local @r = @{$d->{'data'}->[$j]}; local @params; if ($use_oids) { # Where clause just uses OID push(@where, "oid = $r[0]"); } for($i=0; $i<@t; $i++) { if (!$use_oids) { # Where clause uses keys if ($str[$i]->{'key'} eq 'PRI') { if ($r[$i] eq 'NULL') { push(@where, "estr($t[$i]). " is null"); } else { $r[$i] =~ s/'/''/g; push(@where, "estr($t[$i]). " = '$r[$i]'"); } } } local $ij = $in{"${j}_$t[$i]"}; local $ijdef = $in{"${j}_$t[$i]_def"}; next if ($ijdef || !defined($ij)); if (!$displayconfig{'blob_mode'} || !&is_blob($str[$i])) { $ij =~ s/\r//g; } push(@set, "estr($t[$i])." = ?"); push(@params, $ij eq '' ? undef : $ij); } &execute_sql_logged($in{'db'}, "update "."e_table($in{'table'})." set ". join(" , ", @set)." where ". join(" and ", @where), @params); $count++; } &webmin_log("modify", "data", $count, \%in); &redirect("view_table.cgi?db=$in{'db'}&". "table=".&urlize($in{'table'})."&start=$in{'start'}". $searchargs.$sortargs); } elsif ($in{'savenew'}) { # Adding a new row for($j=0; $j<@str; $j++) { if (!$displayconfig{'blob_mode'} || !&is_blob($str[$j])) { $in{$j} =~ s/\r//g; } push(@set, $in{$j} eq '' ? undef : $in{$j}); } &execute_sql_logged($in{'db'}, "insert into "."e_table($in{'table'}). " values (".join(" , ", map { "?" } @set).")", @set); &redirect("view_table.cgi?db=$in{'db'}&". "table=".&urlize($in{'table'})."&start=$in{'start'}". $searchargs.$sortargs); &webmin_log("create", "data", undef, \%in); } elsif ($in{'cancel'} || $in{'new'}) { undef($in{'row'}); } $desc = &text('table_header', "$in{'table'}", "$in{'db'}"); &ui_print_header($desc, $text{'view_title'}, ""); if ($in{'start'} || $total > $displayconfig{'perpage'}) { print "
",&text('view_searchhead', "$in{'for'}", "$in{'field'}")," | \n"; print "$text{'view_searchreset'} |
",&text('view_searchhead2', $advcount)," | \n"; print "$text{'view_searchreset'} |
",&text($in{'sortdir'} ? 'view_sorthead2' : 'view_sorthead1', "$in{'sortfield'}")," | \n"; print "$text{'view_sortreset'} |
$text{'view_field'} | ". "$text{'view_data'} |
$str[$j]->{'field'} | \n"; if ($displayconfig{'blob_mode'} && &is_blob($str[$j]) && $d[$j]) { # Show as keep/upload inputs $et .= &ui_radio($nm."_def", 1, [ [ 1, $text{'view_keep'} ], [ 0, $text{'view_set'} ] ])." ". &ui_upload($nm); } elsif ($displayconfig{'blob_mode'} && &is_blob($str[$j])) { # Show upload input $et .= &ui_upload($nm); } elsif ($str[$j]->{'type'} =~ /^enum\((.*)\)$/) { # Show as enum list $et .= &ui_select($nm, $d[$j], [ [ "", " " ], map { [ $_ ] } &split_enum($1) ], 1, 0, 1); } elsif ($str[$j]->{'type'} =~ /\((\d+)\)/) { # Show as known-size text if ($1 > 255) { # Too big, use text area $et .= &ui_textarea( $nm, $d[$j], 5, 70); } else { # Text box local $nw = $1 > 70 ? 70 : $1; $et .= &ui_textbox( $nm, $d[$j], $nw); } } elsif (&is_blob($str[$j])) { # Show as multiline text $et .= &ui_textarea($nm, $d[$j], 5, 70); } else { # Show as fixed-size text $et .= &ui_textbox($nm, $d[$j], 30); } $et .= " |
\n"; } # Show buttons to edit / delete rows if (!$keyed) { print "$text{'view_nokey'}
\n"; print &ui_form_end(); } elsif (!$check) { if ($in{'new'}) { print &ui_form_end([ [ "savenew", $text{'save'} ], [ "cancel", $text{'cancel'} ] ]); } else { print &ui_form_end([ [ "save", $text{'save'} ], [ "cancel", $text{'cancel'} ] ]); } } elsif ($total) { print &ui_form_end([ [ "edit", $text{'view_edit'} ], [ "new", $text{'view_new'} ], [ "delete", $text{'view_delete'} ] ]); } else { print &ui_form_end([ [ "new", $text{'view_new'} ] ]); } if (!$in{'field'} && $total > $displayconfig{'perpage'}) { # Show search and jump buttons print &ui_hr(); print "