Eigene Erweiterung entwerfen/OraSql
Zur Navigation springen
Zur Suche springen
<?php
$extension_TAG = "orasql";
$extension_HOOK = "hookSql";
$extension_NAME = "OraSql";
$wgExtensionFunctions[] = "wfOraSqlSetup";
$wgExtensionCredits['parserhook'][] = array(
'name' => 'OraSql',
'url' => "$wgServer$wgScriptPath/index.php/Extension:OraSql",
'author' => $extension_AUTH,
'version' => '0.9',
'description' => 'Zugriff auf eine Oracle-Datenbank, nur SELECT erlaubt',
);
function wfOraSqlSetup()
/*/
Die Stelle, an der das Programm in das Wiki "eingehängt" wird
Der [[Hilfe:Tags|Text des Tags]] wird hier festgelegt
der Aufruf der Erweiterung erfolgt mit <orasql>...</orasql>
/*/
{
global $wgParser;
$wgParser->setHook( "orasql", "wfOraSql" );
}
function wfOraSql( $input, $argv, $parser )
/*/
Eintragungen in der LocalSettings.php
/*/
{
global $oraDBUser, $oraDBPass, $oraDBDatabase, $wgParser;
$dbID = 'Standard-Oracle-Instanz';
$class = $view = $onlycode = $table = $code = $header = $spaltentitel = $entiti = $offen = '';
#return '';
/*/
Abfrage von zusätzlichen parametern
das sind jene, die innerhalb der spitzen Klammern stehen
/*/
foreach ($argv as $key => $val)
{
$$key = $val; # die Variablen erhalten den Namen der Parameter
if ($key == 'dbid')
$dbID = $val;
else if ($key == 'spaltentitel')
$spaltentitel = preg_split("/[\?\t\r\n\f\x0B]/", $val);
else if (($key == 'onlycode') or ($key == 'codeonly'))
$onlycode = $val;
}
$input = $input;
if (!empty ($onlycode)) # nur Code darstellen
{
$coco = $wgParser->recursiveTagParse("{{coco|lang=sql|border=none|kla=|code=" . $input . "}}");
return $coco;
}
$page = str_replace('"', "\"", $input); // doppelte Anführungszeichen escapieren
// wenn zu Beginn kein select steht, wird eines dazu gefügt
$sel = strtolower(substr($page,0,6));
if ($sel != "select" and substr($sel,0,2) != "--")
$page .= 'SELECT ' . $page;
$wiki = ($table != 'wiki');
// Zugangsdaten für die Oracle-Datenbank
// es können verschiedene UserIDs bzw. Datenbankserver in der LocalSettings.php festgelegt werden
$db_server = $oraDBDatabase[$dbID];
$db_username = $oraDBUser[$dbID];
$db_password = $oraDBPass[$dbID];
// öffnen der Verbindung
$conn = oci_connect($db_username, $db_password, $db_server, 'AL32UTF8');
if (!$conn)
{
// Verbindung hat nicht geklappt, Rückgabe einer Fehlermeldung
$m = oci_error();
$output = $m['message'] . "\n";
}
else
{
$zz = true;
//$output = "Connected to Oracle!";
// Verbindung hat geklappt
$tablinks = '';
$stid = oci_parse($conn, $page);
$result = oci_execute($stid);
if (!$result)
return "SQL Fehler : " . $wgParser->recursiveTagParse("{{coco|lang=sql|border=none|kla=|code=" . $page . "}}");
$ncols = oci_num_fields($stid);
$nrows = oci_num_rows ($stid);
#var_dump($view );
$crlf = chr(13) . chr(10);
if ($view == 'single' and $nrows <= 1) # Einzelansicht nur wenn eine Zeile zurückgeliefert wurde
{
$output = "<div class='mono single $class' ><table>\n";
$row = oci_fetch_array($stid, OCI_NUM+OCI_RETURN_NULLS);
#var_dump($row );
for ($i = 1; $i <= $ncols; $i++)
{
$column_name = empty($spaltentitel[$i-1]) ? oci_field_name($stid, $i) : $spaltentitel[$i-1];
$val = ($row[$i-1] !== null ? htmlentities($row[$i-1], ENT_QUOTES) : " ");
$output .= "<tr><th>$column_name:</th><td>$val</td></tr>";
}
}
else
{
if ($view == 'zahl')
{
# es wird ein einziger Wert ohne Formatierung als Ergebnis zurück geliefert
$row = oci_fetch_array($stid, OCI_NUM+OCI_RETURN_NULLS);
if ($row == false) return "---";
$mywert = $row[0];
return $mywert;
}
$oclass = empty($offen) ? "" : " rechtsoffen";
$output = $wiki ? "<div class='mono oratable plainlinks tablink neu $oclass' ><table class='$class'>\n"
: "{| class='wikitable sortable mono plainlinks tablink neu $class'" . $crlf; # . "\n|-" . $crlf;
$output .= $wiki ? "<tr>" : $crlf . "\n!";
$snrcol = ''; $tablinks = array();
for ($i = 1; $i <= $ncols; $i++)
{
$feldname = strtolower (oci_field_name($stid, $i));
if ($feldname == "snr" or $feldname == "sondennummer" or strpos(strtolower ($feldname), 's#') !== False)
{
$snrcol=$i; # Spalte mit Sondennummer eruieren
$tablinks[] = $i-1;
}
else if (strpos( $feldname, 'name') !== False or strpos($feldname, 'sond') !== False)
$tablinks[] = $i-1;
$column_name = empty($spaltentitel[$i-1]) ? oci_field_name($stid, $i) : $spaltentitel[$i-1];
$output .= $wiki ? "<th>$column_name</th>" : "$column_name !!";
}
#return $feldname . strpos( $feldname, 'name') . " sonde " . strpos($feldname, 'sonde') . "<pre>" . print_r($tablinks) . "</pre>";
$output = rtrim($output,' !');
$output .= $wiki ? "</tr>" : $crlf . "\n|-";
if (!empty($auswertung))
{
$mylink ="[{{fullurl:Auswertung}}?vorlage=$auswertung&name=";
#return $mylink;
}
while ($row = oci_fetch_row($stid))
// alle gefundenen Sätze abarbeiten
{
$zz = false;
$output .= $wiki ? "<tr>" : $crlf . "\n\r|class='$class'|"; // Tabellenzeile
for ($i = 0; $i < $ncols; $i++)
{
$item = $row[$i];
#$item = htmlentities($row[$i], ENT_QUOTES);
if (!empty($snrcol)) # eine Spalte mit Sondennummer ist vorhanden
{
$snr = $row[$snrcol-1];
if (in_array($i, $tablinks) and is_numeric($snr)) # eine referenzierbare Spalte liegt vor, aber nur wenn die Sondennumer nicht leer ist
{
$item = '[{{fullurl:Snr}}?snr=' . $snr . " " . $item . "]";
}
}
else
if (!empty($auswertung) and ($i==0)) # die Spalten sollen mit Auswertung verlinkt werden, in der 1. Spalte muss das Kriterium stehen
{
#$item = '[{{fullurl:Snr}}?snr=234 ' . $item . "]";
#$item = $row[$i] . "$i";
#return $item . " *** " . htmlentities($row[$i], ENT_NOQUOTES);
$item = $mylink . urlencode($row[0]) . " " . $item . "]";
}
else
{
if (!empty($entiti)) $item = '<span style="white-space: pre">' . htmlentities($row[$i], ENT_NOQUOTES) . '</span>';
}
$val = $item !== null ? $item : " ";
$output .= $wiki ? "<td class='$oclass'>$val</td>\n" : "$val ||";
}
$output = rtrim($output,' |');
$output .= $wiki ? "</tr>\n" : $crlf . "\n|-";
}
if ($zz and (!empty($header))) return "";
}
$output .= $wiki ? "</table></div>" : $crlf . "\n|}";
$output = $wgParser->recursiveTagParse($output);
#$output .= "<pre>" . print_r($tablinks) . "</pre>" . count($tablinks);
// Close the Oracle connection
oci_close($conn);
if (!empty($code))
{
if (!isset($titel) or (empty($titel)))
$titel="";
else
$titel = "<div style='font-weight: bold; font-size: larger; margin: 0.75em 0 -0.5em 0; '>$titel</div>";
$coco = $titel . $wgParser->recursiveTagParse("{{coco|lang=sql|border=none|kla=|code=" . $input . "}}");
$output .= "$coco";
}
}
return $output;
}