Subversion Repositories personal-webbase

Rev

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