Subversion Repositories personal-webbase

Rev

Rev 9 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. if (!defined('WBLEGAL')) die('Kann nicht ohne Personal WebBase ausgef&uuml;hrt werden.');
  4.  
  5. // Auslesen der Datenbanktabellen und deren Felder
  6.  
  7. $datenbanktabellen = array();
  8. $qs = db_query('SHOW TABLES');
  9. while ($qr = db_fetch($qs))
  10. {
  11.   $qs2 = db_query("SHOW FIELDS FROM `".db_escape($qr[0])."`");
  12.   while ($qr2 = db_fetch($qs2))
  13.   {
  14.     $datenbanktabellen[$qr[0]][$qr2[0]] = $qr2[1].'/'.$qr2[2].'/'.$qr2[3].'/'.$qr2[4].'/'.$qr2[5];
  15.   }
  16. }
  17.  
  18. // Important, must exist
  19.  
  20. if (!array_key_exists($mysql_zugangsdaten['praefix'].'module', $datenbanktabellen)) {
  21.         $tabellen = array();
  22.         ib_newdatabasetable('module', 'admin_module', 'modul', "varchar(255) NOT NULL default ''",
  23.                                                                            'table', "varchar(255) NOT NULL default ''");
  24. }
  25.  
  26. if (function_exists('set_searchable')) set_searchable($m2, 'module', 0);
  27.  
  28. my_add_key($mysql_zugangsdaten['praefix'].'module', 'table', true, 'table');
  29.  
  30. // Array $tabellen erstellen und dabei ungültige Einträge der Modultabelle entfernen...
  31.  
  32. $tabellen = array();
  33. $res = db_query("SELECT `table` FROM `".$mysql_zugangsdaten['praefix']."module` ORDER BY `id`");
  34. while ($row = db_fetch($res))
  35. {
  36.   if (!isset($datenbanktabellen[$mysql_zugangsdaten['praefix'].$row['table']]))
  37.   {
  38.         db_query("DELETE FROM `".$mysql_zugangsdaten['praefix']."module` WHERE `table` = '".$row['table']."'");
  39.         if (db_affected_rows() > 0)
  40.           db_query("OPTIMIZE TABLE `".$mysql_zugangsdaten['praefix']."module`");
  41.   }
  42.   else
  43.   {
  44.         $tabellen[] = $row['table'];
  45.   }
  46. }
  47.  
  48. // Diese Funktion erstellt eine Datebanktabelle und fügt ggf. neue Felder hinzu
  49. // Parameter: name (ohne Präfix), modul, Feld_1 Name, Feld_1 Eigenschaften, Feld_2 ...
  50. function ib_newdatabasetable($name, $modul)
  51. {
  52.   global $datenbanktabellen, $mysql_zugangsdaten, $tabellen;
  53.  
  54.   if (!isset($datenbanktabellen[$mysql_zugangsdaten['praefix'].$name]))
  55.     db_query("CREATE TABLE `".$mysql_zugangsdaten['praefix'].db_escape($name)."` (
  56.   `id` bigint(21) NOT NULL auto_increment,
  57.   PRIMARY KEY (`id`)
  58. )");
  59.  
  60.   for ($i=1; $i<@func_num_args()-2; $i++)
  61.   {
  62.     if ($i%2)
  63.     {
  64.       if (isset($datenbanktabellen[$mysql_zugangsdaten['praefix'].$name][@func_get_arg($i+1)]))
  65.       {
  66.         // Wenn der Feldtyp bei einem Versionstyp gewechselt hat, dann normalisieren
  67.         // Achtung: Es wird nur der FELDTYP kontrolliert!
  68.         $x = $datenbanktabellen[$mysql_zugangsdaten['praefix'].$name][@func_get_arg($i+1)]; // Workaround für "Can't be used as a function parameter"
  69.         $art = explode('/', $x);
  70.         $y = @func_get_arg($i+2); // Workaround für "Can't be used as a function parameter"
  71.         $arm = explode(' ', $y);
  72.         if (strtolower($art[0]) <> strtolower($arm[0]))
  73.         {
  74.           db_query("ALTER TABLE `".$mysql_zugangsdaten['praefix'].$name."` CHANGE `".@func_get_arg($i+1)."` `".@func_get_arg($i+1)."` ".@func_get_arg($i+2));
  75.         }
  76.       }
  77.       else
  78.       {
  79.         db_query("ALTER TABLE `".$mysql_zugangsdaten['praefix'].db_escape($name)."` ADD `".@func_get_arg($i+1)."` ".@func_get_arg($i+2));
  80.       }
  81.     }
  82.   }
  83.  
  84.   $nellebat = array_flip($tabellen);
  85.   if (!isset($nellebat[$name]))
  86.   {
  87.     db_query("INSERT INTO `".$mysql_zugangsdaten['praefix']."module` (`modul`, `table`) VALUES ('".db_escape($modul)."', '".db_escape($name)."')");
  88.     $tabellen[] = $name;
  89.   }
  90. }
  91.  
  92. // Sorgt dafür, dass keine Duplicate-Fehler entstehen, wenn Indexe erstellt werden
  93. // Index werden nur einmalig erstellt oder ggf aktualisiert
  94. function my_add_key($table, $name, $unique, $column)
  95. {
  96.   // Funktioniert nicht für PRIMARY KEY
  97.  
  98.   if ($unique)
  99.     $erwarte_non_unique = '0';
  100.   else
  101.     $erwarte_non_unique = '1';
  102.  
  103.   //$breaki = false;
  104.   $rs = db_query("SHOW INDEX FROM `$table`");
  105.   while ($rw = db_fetch($rs))
  106.   {
  107.     for ($i=0; $i<@func_num_args()-3; $i++)
  108.     {
  109.       if (($rw['Column_name'] == @func_get_arg($i+3)) && ($rw['Key_name'] != $name))
  110.       {
  111.         db_query("ALTER TABLE `$table` DROP INDEX `".$rw['Key_name']."`");
  112.         //$breaki = true;
  113.         //break;
  114.       }
  115.     }
  116.     //if ($breaki) break;
  117.   }
  118.  
  119.   $breaki = false;
  120.   $rs = db_query("SHOW INDEX FROM `$table`");
  121.   while ($rw = db_fetch($rs))
  122.   {
  123.     if ($rw['Key_name'] == $name)
  124.     {
  125.       for ($i=0; $i<@func_num_args()-3; $i++)
  126.       {
  127.         if ($rw['Column_name'] == @func_get_arg($i+3))
  128.         {
  129.           if ($rw['Non_unique'] == $erwarte_non_unique)
  130.           {
  131.             ${'vorgekommen_'.@func_get_arg($i+3)} = true;
  132.           }
  133.           else
  134.           {
  135.             db_query("ALTER TABLE `$table` DROP INDEX `$name`");
  136.             $breaki = true;
  137.             break;
  138.           }
  139.         }
  140.       }
  141.     }
  142.     if ($breaki) break;
  143.   }
  144.  
  145.   $alles_vorgekommen = true;
  146.  
  147.   for ($i=0; $i<@func_num_args()-3; $i++)
  148.   {
  149.     if ((!isset(${'vorgekommen_'.@func_get_arg($i+3)})) || (!${'vorgekommen_'.@func_get_arg($i+3)}))
  150.     {
  151.       $alles_vorgekommen = false;
  152.     }
  153.   }
  154.  
  155.   if (!$alles_vorgekommen)
  156.   {
  157.     $colo = '';
  158.  
  159.     for ($i=0; $i<@func_num_args()-3; $i++)
  160.     {
  161.       $colo .= '`'.@func_get_arg($i+3).'`, ';
  162.     }
  163.  
  164.     $colo = substr($colo, 0, strlen($colo)-2);
  165.  
  166.     if ($unique)
  167.       db_query("ALTER TABLE `$table` ADD UNIQUE `$name` ($colo)");
  168.     else
  169.       db_query("ALTER TABLE `$table` ADD KEY `$name` ($colo)");
  170.   }
  171. }
  172.  
  173. ?>
  174.