use HTML::TreeBuilder;
use strict;
# --- Things to do, before the HTML-form will be generated
use File::Basename;
my %hPgTypesGL = ();
sub PreDoAction ()
{
my $plSelect = $oDbSessionGL->SqlSelect
("SELECT oid, typname
FROM pg_type");
foreach (@$plSelect)
{
$hPgTypesGL{$_->[0]} = $_->[1];
}
}
# --- Things to do, before the HTML-form will be generated
sub PreCreateForm()
{
my @lCategories;
my $cResult;
my @lProArgTypes = ();
# ensure, that non admins get no access
if(!$oSessionGL->getState("ActualLogin") ||
!$oSessionGL->getState("IsAdmin"))
{
&OkForm("ERROR",
sprintf(i18n("Sorry, please %s first as WWWdb-admin!"),
"" .
i18n("login") .
""),
"BtnExit");
&MyExit();
}
# select all user-procedures
{
my @lProcedures = ();
# get all user procedures, but not that one,
# used in trggers (they return OPAQUE)
my $plSelect = $oDbSessionGL->SqlSelect
("SELECT
oid, proname, prolang, proargtypes, prorettype
FROM
pg_proc
WHERE
prolang > 100 AND
prorettype > 0
ORDER BY
proname");
foreach (@$plSelect)
{
my @lProArgTypes = ();
foreach (split /\s+/, $_->[3])
{
push (@lProArgTypes, &GetType($_));
}
push @lProcedures, sprintf("%s,%s\\,%s(%s) -> %s",
$_->[0],
$_->[1],
$_->[1],
(join ", ", @lProArgTypes),
&GetType($_->[4]));
}
&MySetVal("Layout Field procedure",
"Values", join "\n", @lProcedures);
}
}
sub MyBtnDoTest()
{
my $cResult = "";
my $cSqlCmd = sprintf("SELECT %s(%s)",
((split /,/, &GetField("procedure"))[1]),
&GetField("proargs"));
my $lRecord = &SqlExecute($cSqlCmd);
# generate them
foreach (@$lRecord)
{
my @lFields;
@lFields = @{$_};
$cResult .= "
";
foreach (@lFields)
{
$cResult .= td($_? $_: "NULL");
}
$cResult .= "
";
}
&MyParam("WWWdbState", "Work");
&OkForm("",
b(i18n("Here is the result of your function-call:")) . p() .
($cSqlCmd) . p() .
hr() .
($cResult) . p() .
hr() .
br() x 2,
"");
&MyExit();
return;
}
sub SqlExecute($)
{
my $lRecord = eval
{
my $cSqlCmdPI = shift;
my $cResult;
my $bResult = 0;
if($cSqlCmdPI =~ /^select/i)
{
$bResult = 1;
}
my $pDbHdl = $oDbSessionGL->{"DbHandle"};
my $pStmtHdl;
local $SIG{'__DIE__'};
local $SIG{'__WARN__'};
$pStmtHdl = $pDbHdl->prepare($cSqlCmdPI) or
die(sprintf(i18n("Prepare: [%s] %s"),
$pDbHdl->state(),
$pDbHdl->errstr()));
print STDERR "SSSSS 1.0\n$cSqlCmdPI\n" . $pDbHdl->errstr();
unless ($cResult)
{
$pStmtHdl->execute();
print STDERR "SSSSS 2.0\n" . $DBI::errstr;
if ($bResult)
{
$cResult = $pStmtHdl->fetchall_arrayref()
unless ($DBI::errstr);
print STDERR "SSSSS 2.1\n" . $DBI::errstr;
}
}
if ($DBI::errstr)
{
&Error(b(i18n("Invalid SQL-statement, please re-enter.")) . p() .
($DBI::errstr?
(b(i18n("The SQL-error was: ")) . p() .
sprintf(i18n("[%s] %s"),
$DBI::state,
i($DBI::errstr)) . p()):
""));
&MyExit();
}
$cResult;
};
return $lRecord;
}
sub GetType(;)
{
my $iOidOfType = shift;
my $cResult = $hPgTypesGL{$iOidOfType};
print STDERR "GetType: $iOidOfType -> $cResult\n";
return $cResult || "OPAQUE";
}
sub QryConv_proargtypes($%)
{
my $cProArgTypePI = shift;
my %hRecordPI = @_;
my $cResult = "";
my @lProArgTypes = ();
foreach (split /\s+/, $cProArgTypePI)
{
push (@lProArgTypes, &GetType($_));
}
$cResult = join ", ", @lProArgTypes;
return $cResult;
}
1;