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;
}