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) { print STDERR "{$_->[0]} = $_->[1]\n"; $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(); } foreach (split /\s+/, &GetField("proargtypes")) { push (@lProArgTypes, &GetType($_)); } &SetField("proargtypes_resolv", join ",", @lProArgTypes); if (&GetField("oid")) { &ExportFile(); &MySetVal("Layout Field proargtypes_resolv", "Type", "Label"); } } sub PreBtnQry() { if(!&GetField("prolang")) { &SetField("prolang", "> 100"); } } sub PreBtnSelect() { if(&GetField("oid")) { &MyParam('!Serial', "oid"); } } sub MyBtnNew () { my $cResult; if (!&GetAttr("RecordOk")) { &GenPage(); } else { &SqlExecute(&GenCreateProc()); print &Redirect(&GetAttr("SessionId"), sprintf("Db:PostgreSQL:Functions;id=%s", &GetMyOid())); } } sub MyBtnUpd() { my $cResult; if (!&GetAttr("RecordOk")) { &GenPage(); } else { &SqlExecute(&GenDropProc()); &SqlExecute(&GenCreateProc()); print &Redirect(&GetAttr("SessionId"), sprintf("Db:PostgreSQL:Functions;id=%s", &GetMyOid())); } } sub MyBtnDel() { &SqlExecute(&GenDropProc()); } sub MyBtnImpInit() { &ImportData(); &MyParam("WWWdbState", "Init"); &GenPage(); } sub MyBtnProto() { my $cPrototype = <PI AS \$1; Result <> DEFAULT <>; BEGIN ------------------------------------------------------------------------ -- Author : ..... -- Created : ..... -- Description: ..... ------------------------------------------------------------------------ Result := <>; RETURN Result; END; EOF &SetField("prosrc", $cPrototype); &MyParam("WWWdbState", "Init"); &GenPage(); } sub MyBtnDoTest() { my $cResult = ""; my $cSqlCmd = sprintf("SELECT %s(%s)", &GetField("proname"), &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 . i18n("Please use the back-button of your browser"), "-"); &MyExit(); return; } sub MyBtnImpWork() { &ImportData(); &MyParam("WWWdbState", "Work"); &GenPage(); } 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 ImportData() { # because this is a filehandle we must go this way ... my $cFileName = param("Fldimport_file"); my $cContentOfFile = ""; my $oBody; if($cFileName) { my $iSize; my $cData; my $iTotalSize; while ($iSize = read($cFileName, $cData, 1024)) { $cContentOfFile .= $cData; $iTotalSize += $iSize; } &SetField("prosrc", $cContentOfFile); } } sub MyBtnView() { my $cField = &GenCreateProc(); &OkForm("", (b(i18n("Preview of current entry")) . br() x 2 . table({-BORDER => 1, -CELLPADDING => 10}, TR(td(p({-ALIGN => "CENTER"}, big(b(&GetField("description")))) . hr({-NOSHADE => 1}) . p({-ALIGN => "LEFT"}, pre($cField))))) . br() x 2 . i18n("Please use the back-button of your browser")), "-"); &MyExit(); } sub ExportFile() { my $cExportFileName = &UnTaint(&GenExportFileName()); open HTML_EXP, ">$cExportFileName" or die sprintf(i18n("Can't open %s"), $cExportFileName); print HTML_EXP &GetField("prosrc"); close HTML_EXP; chmod 0666, $cExportFileName; &SetField("import_file", $cExportFileName); &SetField("export_file", "wwwdb://../../../" . &GetAttr("ScriptName") . "/tmp/" . basename("$cExportFileName")); &MySetVal("Layout Field export_file", "Value", basename("$cExportFileName")); &SetField("show_url", sprintf("wwwdb://WWWdb:Tools:ShowDoc;id=%d,%s", &GetField("id_doc"), &GetField("lang"))); } sub GenExportFileName () { my $cResult = ""; my $cBuffer = ""; $cBuffer = &GetField("proname"); $cBuffer =~ s/[^A-Za-z0-9_]//g; # $cBuffer =~ s/[aeiouAEIOU]//g; $cBuffer =~ s/_$//g; $cResult = (&GetAttr("BaseDir") . "/tmp/" . $cBuffer . ".sql"); return $cResult; } sub PostFirstColumn () { my $cResult = ""; return small($cResult); } sub QryConv_last_change() { return $oDbSessionGL->DateFromDb(shift); } sub GenDropProc() { my $cResult = ""; $cResult = sprintf("DROP FUNCTION %s (%s);\n", &GetField("proname"), &GetField("proargtypes_resolv")); return $cResult; } sub GenCreateProc() { my $cResult = ""; my $cRetType; my $cSrc = &GetField("prosrc"); my $cLanguage = $oDbSessionGL->SqlSelect ("SELECT lanname FROM pg_language WHERE oid = ?", &GetField("prolang"))->[0]->[0]; $cSrc =~ s/\'/\'\'/g; # $cResult .= sprintf("--------------------------------------------\n"); # $cResult .= sprintf("-- Function: %s\n", &GetField("proname")); # $cResult .= sprintf("-- Date : %s\n", # $oDbSessionGL->DateFromDb # ($oDbSessionGL->DateToDb(scalar localtime()))); # $cResult .= sprintf("--------------------------------------------\n"); $cResult .= sprintf("CREATE FUNCTION %s (%s) RETURNS %s AS '", &GetField("proname"), &GetField("proargtypes_resolv"), &GetType(&GetField("prorettype"))); $cResult .= $cSrc; $cResult .= sprintf ("\n' LANGUAGE '%s';", $cLanguage); $cResult =~s/\?/\\077/g; return $cResult; } sub GetType(;) { my $iOidOfType = shift; my $cResult = $hPgTypesGL{$iOidOfType}; print STDERR "GetType: $iOidOfType -> $cResult\n"; return $cResult || "OPAQUE"; } sub GetMyOid() { my $iOid = 0; # we must take this way, because proargtypes, prorettype # may are arrays, which I dont know to handle in another way my $plSelect = $oDbSessionGL->SqlSelect ("SELECT oid, prolang, proargtypes, prorettype FROM pg_proc WHERE proname = ?", &GetField("proname")); { foreach (@$plSelect) { if(($_->[1] eq &GetField("prolang")) && ($_->[2] eq &GetField("proargtypes")) && ($_->[3] eq &GetField("prorettype"))) { $iOid = $_->[0]; } } } return $iOid; } sub QryConv_prolang($%) { my $cProLangPI = shift; my %hRecordPI = @_; my $cResult = $oDbSessionGL->SqlSelect ("SELECT lanname FROM pg_language WHERE oid = ?", $cProLangPI)->[0]->[0]; return $cResult; } sub QryConv_prorettype($%) { my $cProRettypePI = shift; my %hRecordPI = @_; my $cResult = &GetType($cProRettypePI); return $cResult; } 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;