Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

create_schema_files.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 61.04 KiB


0001  <?php
0002  /**
0003  *
0004  * @package phpBB3
0005  * @version $Id$
0006  * @copyright (c) 2006 phpBB Group
0007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
0008  *
0009  * This file creates new schema files for every database.
0010  * The filenames will be prefixed with an underscore to not overwrite the current schema files.
0011  *
0012  * If you overwrite the original schema files please make sure you save the file with UNIX linefeeds.
0013  */
0014   
0015  die("Please read the first lines of this script for instructions on how to enable it");
0016   
0017  @set_time_limit(0);
0018   
0019  $schema_path = './../install/schemas/';
0020   
0021  if (!is_writable($schema_path))
0022  {
0023      die('Schema path not writable');
0024  }
0025   
0026  $schema_data = get_schema_struct();
0027  $dbms_type_map = array(
0028      'mysql_41'    => array(
0029          'INT:'        => 'int(%d)',
0030          'BINT'        => 'bigint(20)',
0031          'UINT'        => 'mediumint(8) UNSIGNED',
0032          'UINT:'        => 'int(%d) UNSIGNED',
0033          'TINT:'        => 'tinyint(%d)',
0034          'USINT'        => 'smallint(4) UNSIGNED',
0035          'BOOL'        => 'tinyint(1) UNSIGNED',
0036          'VCHAR'        => 'varchar(255)',
0037          'VCHAR:'    => 'varchar(%d)',
0038          'CHAR:'        => 'char(%d)',
0039          'XSTEXT'    => 'text',
0040          'XSTEXT_UNI'=> 'varchar(100)',
0041          'STEXT'        => 'text',
0042          'STEXT_UNI'    => 'varchar(255)',
0043          'TEXT'        => 'text',
0044          'TEXT_UNI'    => 'text',
0045          'MTEXT'        => 'mediumtext',
0046          'MTEXT_UNI'    => 'mediumtext',
0047          'TIMESTAMP'    => 'int(11) UNSIGNED',
0048          'DECIMAL'    => 'decimal(5,2)',
0049          'DECIMAL:'    => 'decimal(%d,2)',
0050          'PDECIMAL'    => 'decimal(6,3)',
0051          'PDECIMAL:'    => 'decimal(%d,3)',
0052          'VCHAR_UNI'    => 'varchar(255)',
0053          'VCHAR_UNI:'=> 'varchar(%d)',
0054          'VCHAR_CI'    => 'varchar(255)',
0055          'VARBINARY'    => 'varbinary(255)',
0056      ),
0057   
0058      'mysql_40'    => array(
0059          'INT:'        => 'int(%d)',
0060          'BINT'        => 'bigint(20)',
0061          'UINT'        => 'mediumint(8) UNSIGNED',
0062          'UINT:'        => 'int(%d) UNSIGNED',
0063          'TINT:'        => 'tinyint(%d)',
0064          'USINT'        => 'smallint(4) UNSIGNED',
0065          'BOOL'        => 'tinyint(1) UNSIGNED',
0066          'VCHAR'        => 'varbinary(255)',
0067          'VCHAR:'    => 'varbinary(%d)',
0068          'CHAR:'        => 'binary(%d)',
0069          'XSTEXT'    => 'blob',
0070          'XSTEXT_UNI'=> 'blob',
0071          'STEXT'        => 'blob',
0072          'STEXT_UNI'    => 'blob',
0073          'TEXT'        => 'blob',
0074          'TEXT_UNI'    => 'blob',
0075          'MTEXT'        => 'mediumblob',
0076          'MTEXT_UNI'    => 'mediumblob',
0077          'TIMESTAMP'    => 'int(11) UNSIGNED',
0078          'DECIMAL'    => 'decimal(5,2)',
0079          'DECIMAL:'    => 'decimal(%d,2)',
0080          'PDECIMAL'    => 'decimal(6,3)',
0081          'PDECIMAL:'    => 'decimal(%d,3)',
0082          'VCHAR_UNI'    => 'blob',
0083          'VCHAR_UNI:'=> array('varbinary(%d)', 'limit' => array('mult', 3, 255, 'blob')),
0084          'VCHAR_CI'    => 'blob',
0085          'VARBINARY'    => 'varbinary(255)',
0086      ),
0087   
0088      'firebird'    => array(
0089          'INT:'        => 'INTEGER',
0090          'BINT'        => 'DOUBLE PRECISION',
0091          'UINT'        => 'INTEGER',
0092          'UINT:'        => 'INTEGER',
0093          'TINT:'        => 'INTEGER',
0094          'USINT'        => 'INTEGER',
0095          'BOOL'        => 'INTEGER',
0096          'VCHAR'        => 'VARCHAR(255) CHARACTER SET NONE',
0097          'VCHAR:'    => 'VARCHAR(%d) CHARACTER SET NONE',
0098          'CHAR:'        => 'CHAR(%d) CHARACTER SET NONE',
0099          'XSTEXT'    => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
0100          'STEXT'        => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
0101          'TEXT'        => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
0102          'MTEXT'        => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
0103          'XSTEXT_UNI'=> 'VARCHAR(100) CHARACTER SET UTF8',
0104          'STEXT_UNI'    => 'VARCHAR(255) CHARACTER SET UTF8',
0105          'TEXT_UNI'    => 'BLOB SUB_TYPE TEXT CHARACTER SET UTF8',
0106          'MTEXT_UNI'    => 'BLOB SUB_TYPE TEXT CHARACTER SET UTF8',
0107          'TIMESTAMP'    => 'INTEGER',
0108          'DECIMAL'    => 'DOUBLE PRECISION',
0109          'DECIMAL:'    => 'DOUBLE PRECISION',
0110          'PDECIMAL'    => 'DOUBLE PRECISION',
0111          'PDECIMAL:'    => 'DOUBLE PRECISION',
0112          'VCHAR_UNI'    => 'VARCHAR(255) CHARACTER SET UTF8',
0113          'VCHAR_UNI:'=> 'VARCHAR(%d) CHARACTER SET UTF8',
0114          'VCHAR_CI'    => 'VARCHAR(255) CHARACTER SET UTF8',
0115          'VARBINARY'    => 'CHAR(255) CHARACTER SET NONE',
0116      ),
0117   
0118      'mssql'        => array(
0119          'INT:'        => '[int]',
0120          'BINT'        => '[float]',
0121          'UINT'        => '[int]',
0122          'UINT:'        => '[int]',
0123          'TINT:'        => '[int]',
0124          'USINT'        => '[int]',
0125          'BOOL'        => '[int]',
0126          'VCHAR'        => '[varchar] (255)',
0127          'VCHAR:'    => '[varchar] (%d)',
0128          'CHAR:'        => '[char] (%d)',
0129          'XSTEXT'    => '[varchar] (1000)',
0130          'STEXT'        => '[varchar] (3000)',
0131          'TEXT'        => '[varchar] (8000)',
0132          'MTEXT'        => '[text]',
0133          'XSTEXT_UNI'=> '[varchar] (100)',
0134          'STEXT_UNI'    => '[varchar] (255)',
0135          'TEXT_UNI'    => '[varchar] (4000)',
0136          'MTEXT_UNI'    => '[text]',
0137          'TIMESTAMP'    => '[int]',
0138          'DECIMAL'    => '[float]',
0139          'DECIMAL:'    => '[float]',
0140          'PDECIMAL'    => '[float]',
0141          'PDECIMAL:'    => '[float]',
0142          'VCHAR_UNI'    => '[varchar] (255)',
0143          'VCHAR_UNI:'=> '[varchar] (%d)',
0144          'VCHAR_CI'    => '[varchar] (255)',
0145          'VARBINARY'    => '[varchar] (255)',
0146      ),
0147   
0148      'oracle'    => array(
0149          'INT:'        => 'number(%d)',
0150          'BINT'        => 'number(20)',
0151          'UINT'        => 'number(8)',
0152          'UINT:'        => 'number(%d)',
0153          'TINT:'        => 'number(%d)',
0154          'USINT'        => 'number(4)',
0155          'BOOL'        => 'number(1)',
0156          'VCHAR'        => 'varchar2(255)',
0157          'VCHAR:'    => 'varchar2(%d)',
0158          'CHAR:'        => 'char(%d)',
0159          'XSTEXT'    => 'varchar2(1000)',
0160          'STEXT'        => 'varchar2(3000)',
0161          'TEXT'        => 'clob',
0162          'MTEXT'        => 'clob',
0163          'XSTEXT_UNI'=> 'varchar2(300)',
0164          'STEXT_UNI'    => 'varchar2(765)',
0165          'TEXT_UNI'    => 'clob',
0166          'MTEXT_UNI'    => 'clob',
0167          'TIMESTAMP'    => 'number(11)',
0168          'DECIMAL'    => 'number(5, 2)',
0169          'DECIMAL:'    => 'number(%d, 2)',
0170          'PDECIMAL'    => 'number(6, 3)',
0171          'PDECIMAL:'    => 'number(%d, 3)',
0172          'VCHAR_UNI'    => 'varchar2(765)',
0173          'VCHAR_UNI:'=> array('varchar2(%d)', 'limit' => array('mult', 3, 765, 'clob')),
0174          'VCHAR_CI'    => 'varchar2(255)',
0175          'VARBINARY'    => 'raw(255)',
0176      ),
0177   
0178      'sqlite'    => array(
0179          'INT:'        => 'int(%d)',
0180          'BINT'        => 'bigint(20)',
0181          'UINT'        => 'INTEGER UNSIGNED', //'mediumint(8) UNSIGNED',
0182          'UINT:'        => 'INTEGER UNSIGNED', // 'int(%d) UNSIGNED',
0183          'TINT:'        => 'tinyint(%d)',
0184          'USINT'        => 'INTEGER UNSIGNED', //'mediumint(4) UNSIGNED',
0185          'BOOL'        => 'INTEGER UNSIGNED', //'tinyint(1) UNSIGNED',
0186          'VCHAR'        => 'varchar(255)',
0187          'VCHAR:'    => 'varchar(%d)',
0188          'CHAR:'        => 'char(%d)',
0189          'XSTEXT'    => 'text(65535)',
0190          'STEXT'        => 'text(65535)',
0191          'TEXT'        => 'text(65535)',
0192          'MTEXT'        => 'mediumtext(16777215)',
0193          'XSTEXT_UNI'=> 'text(65535)',
0194          'STEXT_UNI'    => 'text(65535)',
0195          'TEXT_UNI'    => 'text(65535)',
0196          'MTEXT_UNI'    => 'mediumtext(16777215)',
0197          'TIMESTAMP'    => 'INTEGER UNSIGNED', //'int(11) UNSIGNED',
0198          'DECIMAL'    => 'decimal(5,2)',
0199          'DECIMAL:'    => 'decimal(%d,2)',
0200          'PDECIMAL'    => 'decimal(6,3)',
0201          'PDECIMAL:'    => 'decimal(%d,3)',
0202          'VCHAR_UNI'    => 'varchar(255)',
0203          'VCHAR_UNI:'=> 'varchar(%d)',
0204          'VCHAR_CI'    => 'varchar(255)',
0205          'VARBINARY'    => 'blob',
0206      ),
0207   
0208      'postgres'    => array(
0209          'INT:'        => 'INT4',
0210          'BINT'        => 'INT8',
0211          'UINT'        => 'INT4', // unsigned
0212          'UINT:'        => 'INT4', // unsigned
0213          'USINT'        => 'INT2', // unsigned
0214          'BOOL'        => 'INT2', // unsigned
0215          'TINT:'        => 'INT2',
0216          'VCHAR'        => 'varchar(255)',
0217          'VCHAR:'    => 'varchar(%d)',
0218          'CHAR:'        => 'char(%d)',
0219          'XSTEXT'    => 'varchar(1000)',
0220          'STEXT'        => 'varchar(3000)',
0221          'TEXT'        => 'varchar(8000)',
0222          'MTEXT'        => 'TEXT',
0223          'XSTEXT_UNI'=> 'varchar(100)',
0224          'STEXT_UNI'    => 'varchar(255)',
0225          'TEXT_UNI'    => 'varchar(4000)',
0226          'MTEXT_UNI'    => 'TEXT',
0227          'TIMESTAMP'    => 'INT4', // unsigned
0228          'DECIMAL'    => 'decimal(5,2)',
0229          'DECIMAL:'    => 'decimal(%d,2)',
0230          'PDECIMAL'    => 'decimal(6,3)',
0231          'PDECIMAL:'    => 'decimal(%d,3)',
0232          'VCHAR_UNI'    => 'varchar(255)',
0233          'VCHAR_UNI:'=> 'varchar(%d)',
0234          'VCHAR_CI'    => 'varchar_ci',
0235          'VARBINARY'    => 'bytea',
0236      ),
0237  );
0238   
0239  // A list of types being unsigned for better reference in some db's
0240  $unsigned_types = array('UINT', 'UINT:', 'USINT', 'BOOL', 'TIMESTAMP');
0241  $supported_dbms = array('firebird', 'mssql', 'mysql_40', 'mysql_41', 'oracle', 'postgres', 'sqlite');
0242   
0243  foreach ($supported_dbms as $dbms)
0244  {
0245      $fp = fopen($schema_path . '_' . $dbms . '_schema.sql', 'wt');
0246   
0247      $line = '';
0248   
0249      // Write Header
0250      switch ($dbms)
0251      {
0252          case 'mysql_40':
0253          case 'mysql_41':
0254              $line = "#\n# \$I" . "d: $\n#\n\n";
0255          break;
0256   
0257          case 'firebird':
0258              $line = "#\n# \$I" . "d: $\n#\n\n";
0259              $line .= custom_data('firebird') . "\n";
0260          break;
0261   
0262          case 'sqlite':
0263              $line = "#\n# \$I" . "d: $\n#\n\n";
0264              $line .= "BEGIN TRANSACTION;\n\n";
0265          break;
0266   
0267          case 'mssql':
0268              $line = "/*\n\n \$I" . "d: $\n\n*/\n\n";
0269              $line .= "BEGIN TRANSACTION\nGO\n\n";
0270          break;
0271   
0272          case 'oracle':
0273              $line = "/*\n\n \$I" . "d: $\n\n*/\n\n";
0274              $line .= custom_data('oracle') . "\n";
0275          break;
0276   
0277          case 'postgres':
0278              $line = "/*\n\n \$I" . "d: $\n\n*/\n\n";
0279              $line .= "BEGIN;\n\n";
0280              $line .= custom_data('postgres') . "\n";
0281          break;
0282      }
0283   
0284      fwrite($fp, $line);
0285   
0286      foreach ($schema_data as $table_name => $table_data)
0287      {
0288          // Write comment about table
0289          switch ($dbms)
0290          {
0291              case 'mysql_40':
0292              case 'mysql_41':
0293              case 'firebird':
0294              case 'sqlite':
0295                  fwrite($fp, "# Table: '{$table_name}'\n");
0296              break;
0297   
0298              case 'mssql':
0299              case 'oracle':
0300              case 'postgres':
0301                  fwrite($fp, "/*\n\tTable: '{$table_name}'\n*/\n");
0302              break;
0303          }
0304   
0305          // Create Table statement
0306          $generator = $textimage = false;
0307          $line = '';
0308   
0309          switch ($dbms)
0310          {
0311              case 'mysql_40':
0312              case 'mysql_41':
0313              case 'firebird':
0314              case 'oracle':
0315              case 'sqlite':
0316              case 'postgres':
0317                  $line = "CREATE TABLE {$table_name} (\n";
0318              break;
0319   
0320              case 'mssql':
0321                  $line = "CREATE TABLE [{$table_name}] (\n";
0322              break;
0323          }
0324   
0325          // Table specific so we don't get overlap
0326          $modded_array = array();
0327   
0328          // Write columns one by one...
0329          foreach ($table_data['COLUMNS'] as $column_name => $column_data)
0330          {
0331              // Get type
0332              if (strpos($column_data[0], ':') !== false)
0333              {
0334                  list($orig_column_type, $column_length) = explode(':', $column_data[0]);
0335                  if (!is_array($dbms_type_map[$dbms][$orig_column_type . ':']))
0336                  {
0337                      $column_type = sprintf($dbms_type_map[$dbms][$orig_column_type . ':'], $column_length);
0338                  }
0339                  else
0340                  {
0341                      if (isset($dbms_type_map[$dbms][$orig_column_type . ':']['rule']))
0342                      {
0343                          switch ($dbms_type_map[$dbms][$orig_column_type . ':']['rule'][0])
0344                          {
0345                              case 'div':
0346                                  $column_length /= $dbms_type_map[$dbms][$orig_column_type . ':']['rule'][1];
0347                                  $column_length = ceil($column_length);
0348                                  $column_type = sprintf($dbms_type_map[$dbms][$orig_column_type . ':'][0], $column_length);
0349                              break;
0350                          }
0351                      }
0352   
0353                      if (isset($dbms_type_map[$dbms][$orig_column_type . ':']['limit']))
0354                      {
0355                          switch ($dbms_type_map[$dbms][$orig_column_type . ':']['limit'][0])
0356                          {
0357                              case 'mult':
0358                                  $column_length *= $dbms_type_map[$dbms][$orig_column_type . ':']['limit'][1];
0359                                  if ($column_length > $dbms_type_map[$dbms][$orig_column_type . ':']['limit'][2])
0360                                  {
0361                                      $column_type = $dbms_type_map[$dbms][$orig_column_type . ':']['limit'][3];
0362                                      $modded_array[$column_name] = $column_type;
0363                                  }
0364                                  else
0365                                  {
0366                                      $column_type = sprintf($dbms_type_map[$dbms][$orig_column_type . ':'][0], $column_length);
0367                                  }
0368                              break;
0369                          }
0370                      }
0371                  }
0372                  $orig_column_type .= ':';
0373              }
0374              else
0375              {
0376                  $orig_column_type = $column_data[0];
0377                  $column_type = $dbms_type_map[$dbms][$column_data[0]];
0378                  if ($column_type == 'text' || $column_type == 'blob')
0379                  {
0380                      $modded_array[$column_name] = $column_type;
0381                  }
0382              }
0383   
0384              // Adjust default value if db-dependant specified
0385              if (is_array($column_data[1]))
0386              {
0387                  $column_data[1] = (isset($column_data[1][$dbms])) ? $column_data[1][$dbms] : $column_data[1]['default'];
0388              }
0389   
0390              switch ($dbms)
0391              {
0392                  case 'mysql_40':
0393                  case 'mysql_41':
0394                      $line .= "\t{$column_name} {$column_type} ";
0395   
0396                      // For hexadecimal values do not use single quotes
0397                      if (!is_null($column_data[1]) && substr($column_type, -4) !== 'text' && substr($column_type, -4) !== 'blob')
0398                      {
0399                          $line .= (strpos($column_data[1], '0x') === 0) ? "DEFAULT {$column_data[1]} " : "DEFAULT '{$column_data[1]}";
0400                      }
0401                      $line .= 'NOT NULL';
0402   
0403                      if (isset($column_data[2]))
0404                      {
0405                          if ($column_data[2] == 'auto_increment')
0406                          {
0407                              $line .= ' auto_increment';
0408                          }
0409                          else if ($dbms === 'mysql_41' && $column_data[2] == 'true_sort')
0410                          {
0411                              $line .= ' COLLATE utf8_unicode_ci';
0412                          }
0413                      }
0414   
0415                      $line .= ",\n";
0416                  break;
0417   
0418                  case 'sqlite':
0419                      if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
0420                      {
0421                          $line .= "\t{$column_name} INTEGER PRIMARY KEY ";
0422                          $generator = $column_name;
0423                      }
0424                      else
0425                      {
0426                          $line .= "\t{$column_name} {$column_type} ";
0427                      }
0428   
0429                      $line .= 'NOT NULL ';
0430                      $line .= (!is_null($column_data[1])) ? "DEFAULT '{$column_data[1]}'" : '';
0431                      $line .= ",\n";
0432                  break;
0433   
0434                  case 'firebird':
0435                      $line .= "\t{$column_name} {$column_type} ";
0436   
0437                      if (!is_null($column_data[1]))
0438                      {
0439                          $line .= 'DEFAULT ' . ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ' ';
0440                      }
0441   
0442                      $line .= 'NOT NULL';
0443   
0444                      // This is a UNICODE column and thus should be given it's fair share
0445                      if (preg_match('/^X?STEXT_UNI|VCHAR_(CI|UNI:?)/', $column_data[0]))
0446                      {
0447                          $line .= ' COLLATE UNICODE';
0448                      }
0449   
0450                      $line .= ",\n";
0451   
0452                      if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
0453                      {
0454                          $generator = $column_name;
0455                      }
0456                  break;
0457   
0458                  case 'mssql':
0459                      if ($column_type == '[text]')
0460                      {
0461                          $textimage = true;
0462                      }
0463   
0464                      $line .= "\t[{$column_name}{$column_type} ";
0465   
0466                      if (!is_null($column_data[1]))
0467                      {
0468                          // For hexadecimal values do not use single quotes
0469                          if (strpos($column_data[1], '0x') === 0)
0470                          {
0471                              $line .= 'DEFAULT (' . $column_data[1] . ') ';
0472                          }
0473                          else
0474                          {
0475                              $line .= 'DEFAULT (' . ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ') ';
0476                          }
0477                      }
0478   
0479                      if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
0480                      {
0481                          $line .= 'IDENTITY (1, 1) ';
0482                      }
0483   
0484                      $line .= 'NOT NULL';
0485                      $line .= " ,\n";
0486                  break;
0487   
0488                  case 'oracle':
0489                      $line .= "\t{$column_name} {$column_type} ";
0490                      $line .= (!is_null($column_data[1])) ? "DEFAULT '{$column_data[1]}" : '';
0491   
0492                      // In Oracle empty strings ('') are treated as NULL.
0493                      // Therefore in oracle we allow NULL's for all DEFAULT '' entries
0494                      $line .= ($column_data[1] === '') ? ",\n" : "NOT NULL,\n";
0495   
0496                      if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
0497                      {
0498                          $generator = $column_name;
0499                      }
0500                  break;
0501   
0502                  case 'postgres':
0503                      $line .= "\t{$column_name} {$column_type} ";
0504   
0505                      if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
0506                      {
0507                          $line .= "DEFAULT nextval('{$table_name}_seq'),\n";
0508   
0509                          // Make sure the sequence will be created before creating the table
0510                          $line = "CREATE SEQUENCE {$table_name}_seq;\n\n" . $line;
0511                      }
0512                      else
0513                      {
0514                          $line .= (!is_null($column_data[1])) ? "DEFAULT '{$column_data[1]}" : '';
0515                          $line .= "NOT NULL";
0516   
0517                          // Unsigned? Then add a CHECK contraint
0518                          if (in_array($orig_column_type, $unsigned_types))
0519                          {
0520                              $line .= " CHECK ({$column_name} >= 0)";
0521                          }
0522   
0523                          $line .= ",\n";
0524                      }
0525                  break;
0526              }
0527          }
0528   
0529          switch ($dbms)
0530          {
0531              case 'firebird':
0532                  // Remove last line delimiter...
0533                  $line = substr($line, 0, -2);
0534                  $line .= "\n);;\n\n";
0535              break;
0536   
0537              case 'mssql':
0538                  $line = substr($line, 0, -2);
0539                  $line .= "\n) ON [PRIMARY]" . (($textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '') . "\n";
0540                  $line .= "GO\n\n";
0541              break;
0542          }
0543   
0544          // Write primary key
0545          if (isset($table_data['PRIMARY_KEY']))
0546          {
0547              if (!is_array($table_data['PRIMARY_KEY']))
0548              {
0549                  $table_data['PRIMARY_KEY'] = array($table_data['PRIMARY_KEY']);
0550              }
0551   
0552              switch ($dbms)
0553              {
0554                  case 'mysql_40':
0555                  case 'mysql_41':
0556                  case 'postgres':
0557                      $line .= "\tPRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . "),\n";
0558                  break;
0559   
0560                  case 'firebird':
0561                      $line .= "ALTER TABLE {$table_name} ADD PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ");;\n\n";
0562                  break;
0563   
0564                  case 'sqlite':
0565                      if ($generator === false || !in_array($generator, $table_data['PRIMARY_KEY']))
0566                      {
0567                          $line .= "\tPRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . "),\n";
0568                      }
0569                  break;
0570   
0571                  case 'mssql':
0572                      $line .= "ALTER TABLE [{$table_name}] WITH NOCHECK ADD \n";
0573                      $line .= "\tCONSTRAINT [PK_{$table_name}] PRIMARY KEY  CLUSTERED \n";
0574                      $line .= "\t(\n";
0575                      $line .= "\t\t[" . implode("],\n\t\t[", $table_data['PRIMARY_KEY']) . "]\n";
0576                      $line .= "\t)  ON [PRIMARY] \n";
0577                      $line .= "GO\n\n";
0578                  break;
0579   
0580                  case 'oracle':
0581                      $line .= "\tCONSTRAINT pk_{$table_name} PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . "),\n";
0582                  break;
0583              }
0584          }
0585   
0586          switch ($dbms)
0587          {
0588              case 'oracle':
0589                  // UNIQUE contrains to be added?
0590                  if (isset($table_data['KEYS']))
0591                  {
0592                      foreach ($table_data['KEYS'] as $key_name => $key_data)
0593                      {
0594                          if (!is_array($key_data[1]))
0595                          {
0596                              $key_data[1] = array($key_data[1]);
0597                          }
0598   
0599                          if ($key_data[0] == 'UNIQUE')
0600                          {
0601                              $line .= "\tCONSTRAINT u_phpbb_{$key_name} UNIQUE (" . implode(', ', $key_data[1]) . "),\n";
0602                          }
0603                      }
0604                  }
0605   
0606                  // Remove last line delimiter...
0607                  $line = substr($line, 0, -2);
0608                  $line .= "\n)\n/\n\n";
0609              break;
0610   
0611              case 'postgres':
0612                  // Remove last line delimiter...
0613                  $line = substr($line, 0, -2);
0614                  $line .= "\n);\n\n";
0615              break;
0616   
0617              case 'sqlite':
0618                  // Remove last line delimiter...
0619                  $line = substr($line, 0, -2);
0620                  $line .= "\n);\n\n";
0621              break;
0622          }
0623   
0624          // Write Keys
0625          if (isset($table_data['KEYS']))
0626          {
0627              foreach ($table_data['KEYS'] as $key_name => $key_data)
0628              {
0629                  if (!is_array($key_data[1]))
0630                  {
0631                      $key_data[1] = array($key_data[1]);
0632                  }
0633   
0634                  switch ($dbms)
0635                  {
0636                      case 'mysql_40':
0637                      case 'mysql_41':
0638                          $line .= ($key_data[0] == 'INDEX') ? "\tKEY" : '';
0639                          $line .= ($key_data[0] == 'UNIQUE') ? "\tUNIQUE" : '';
0640                          foreach ($key_data[1] as $key => $col_name)
0641                          {
0642                              if (isset($modded_array[$col_name]))
0643                              {
0644                                  switch ($modded_array[$col_name])
0645                                  {
0646                                      case 'text':
0647                                      case 'blob':
0648                                          $key_data[1][$key] = $col_name . '(255)';
0649                                      break;
0650                                  }
0651                              }
0652                          }
0653                          $line .= ' ' . $key_name . ' (' . implode(', ', $key_data[1]) . "),\n";
0654                      break;
0655   
0656                      case 'firebird':
0657                          $line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
0658                          $line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
0659   
0660                          $line .= ' ' . $table_name . '_' . $key_name . ' ON ' . $table_name . '(' . implode(', ', $key_data[1]) . ");;\n";
0661                      break;
0662   
0663                      case 'mssql':
0664                          $line .= ($key_data[0] == 'INDEX') ? 'CREATE  INDEX' : '';
0665                          $line .= ($key_data[0] == 'UNIQUE') ? 'CREATE  UNIQUE  INDEX' : '';
0666                          $line .= " [{$key_name}] ON [{$table_name}]([" . implode('], [', $key_data[1]) . "]) ON [PRIMARY]\n";
0667                          $line .= "GO\n\n";
0668                      break;
0669   
0670                      case 'oracle':
0671                          if ($key_data[0] == 'UNIQUE')
0672                          {
0673                              continue;
0674                          }
0675   
0676                          $line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
0677                          
0678                          $line .= " {$table_name}_{$key_name} ON {$table_name} (" . implode(', ', $key_data[1]) . ")\n";
0679                          $line .= "/\n";
0680                      break;
0681   
0682                      case 'sqlite':
0683                          $line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
0684                          $line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
0685   
0686                          $line .= " {$table_name}_{$key_name} ON {$table_name} (" . implode(', ', $key_data[1]) . ");\n";
0687                      break;
0688   
0689                      case 'postgres':
0690                          $line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
0691                          $line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
0692   
0693                          $line .= " {$table_name}_{$key_name} ON {$table_name} (" . implode(', ', $key_data[1]) . ");\n";
0694                      break;
0695                  }
0696              }
0697          }
0698   
0699          switch ($dbms)
0700          {
0701              case 'mysql_40':
0702                  // Remove last line delimiter...
0703                  $line = substr($line, 0, -2);
0704                  $line .= "\n);\n\n";
0705              break;
0706   
0707              case 'mysql_41':
0708                  // Remove last line delimiter...
0709                  $line = substr($line, 0, -2);
0710                  $line .= "\n) CHARACTER SET `utf8` COLLATE `utf8_bin`;\n\n";
0711              break;
0712   
0713              // Create Generator
0714              case 'firebird':
0715                  if ($generator !== false)
0716                  {
0717                      $line .= "\nCREATE GENERATOR {$table_name}_gen;;\n";
0718                      $line .= 'SET GENERATOR ' . $table_name . "_gen TO 0;;\n\n";
0719   
0720                      $line .= 'CREATE TRIGGER t_' . $table_name . ' FOR ' . $table_name . "\n";
0721                      $line .= "BEFORE INSERT\nAS\nBEGIN\n";
0722                      $line .= "\tNEW.{$generator} = GEN_ID({$table_name}_gen, 1);\nEND;;\n\n";
0723                  }
0724              break;
0725   
0726              case 'oracle':
0727                  if ($generator !== false)
0728                  {
0729                      $line .= "\nCREATE SEQUENCE {$table_name}_seq\n/\n\n";
0730   
0731                      $line .= "CREATE OR REPLACE TRIGGER t_{$table_name}\n";
0732                      $line .= "BEFORE INSERT ON {$table_name}\n";
0733                      $line .= "FOR EACH ROW WHEN (\n";
0734                      $line .= "\tnew.{$generator} IS NULL OR new.{$generator} = 0\n";
0735                      $line .= ")\nBEGIN\n";
0736                      $line .= "\tSELECT {$table_name}_seq.nextval\n";
0737                      $line .= "\tINTO :new.{$generator}\n";
0738                      $line .= "\tFROM dual;\nEND;\n/\n\n";
0739                  }
0740              break;
0741          }
0742   
0743          fwrite($fp, $line . "\n");
0744      }
0745   
0746      $line = '';
0747   
0748      // Write custom function at the end for some db's
0749      switch ($dbms)
0750      {
0751          case 'mssql':
0752              $line = "\nCOMMIT\nGO\n\n";
0753          break;
0754   
0755          case 'sqlite':
0756              $line = "\nCOMMIT;";
0757          break;
0758   
0759          case 'postgres':
0760              $line = "\nCOMMIT;";
0761          break;
0762      }
0763   
0764      fwrite($fp, $line);
0765      fclose($fp);
0766  }
0767   
0768   
0769  /**
0770  * Define the basic structure
0771  * The format:
0772  *        array('{TABLE_NAME}' => {TABLE_DATA})
0773  *        {TABLE_DATA}:
0774  *            COLUMNS = array({column_name} = array({column_type}, {default}, {auto_increment}))
0775  *            PRIMARY_KEY = {column_name(s)}
0776  *            KEYS = array({key_name} = array({key_type}, {column_name(s)})),
0777  *
0778  *    Column Types:
0779  *    INT:x        => SIGNED int(x)
0780  *    BINT        => BIGINT
0781  *    UINT        => mediumint(8) UNSIGNED
0782  *    UINT:x        => int(x) UNSIGNED
0783  *    TINT:x        => tinyint(x)
0784  *    USINT        => smallint(4) UNSIGNED (for _order columns)
0785  *    BOOL        => tinyint(1) UNSIGNED
0786  *    VCHAR        => varchar(255)
0787  *    CHAR:x        => char(x)
0788  *    XSTEXT_UNI    => text for storing 100 characters (topic_title for example)
0789  *    STEXT_UNI    => text for storing 255 characters (normal input field with a max of 255 single-byte chars) - same as VCHAR_UNI
0790  *    TEXT_UNI    => text for storing 3000 characters (short text, descriptions, comments, etc.)
0791  *    MTEXT_UNI    => mediumtext (post text, large text)
0792  *    VCHAR:x        => varchar(x)
0793  *    TIMESTAMP    => int(11) UNSIGNED
0794  *    DECIMAL        => decimal number (5,2)
0795  *    DECIMAL:    => decimal number (x,2)
0796  *    PDECIMAL    => precision decimal number (6,3)
0797  *    PDECIMAL:    => precision decimal number (x,3)
0798  *    VCHAR_UNI    => varchar(255) BINARY
0799  *    VCHAR_CI    => varchar_ci for postgresql, others VCHAR
0800  */
0801  function get_schema_struct()
0802  {
0803      $schema_data = array();
0804   
0805      $schema_data['phpbb_attachments'] = array(
0806          'COLUMNS'        => array(
0807              'attach_id'            => array('UINT', NULL, 'auto_increment'),
0808              'post_msg_id'        => array('UINT', 0),
0809              'topic_id'            => array('UINT', 0),
0810              'in_message'        => array('BOOL', 0),
0811              'poster_id'            => array('UINT', 0),
0812              'is_orphan'            => array('BOOL', 1),
0813              'physical_filename'    => array('VCHAR', ''),
0814              'real_filename'        => array('VCHAR', ''),
0815              'download_count'    => array('UINT', 0),
0816              'attach_comment'    => array('TEXT_UNI', ''),
0817              'extension'            => array('VCHAR:100', ''),
0818              'mimetype'            => array('VCHAR:100', ''),
0819              'filesize'            => array('UINT:20', 0),
0820              'filetime'            => array('TIMESTAMP', 0),
0821              'thumbnail'            => array('BOOL', 0),
0822          ),
0823          'PRIMARY_KEY'    => 'attach_id',
0824          'KEYS'            => array(
0825              'filetime'            => array('INDEX', 'filetime'),
0826              'post_msg_id'        => array('INDEX', 'post_msg_id'),
0827              'topic_id'            => array('INDEX', 'topic_id'),
0828              'poster_id'            => array('INDEX', 'poster_id'),
0829              'is_orphan'            => array('INDEX', 'is_orphan'),
0830          ),
0831      );
0832   
0833      $schema_data['phpbb_acl_groups'] = array(
0834          'COLUMNS'        => array(
0835              'group_id'            => array('UINT', 0),
0836              'forum_id'            => array('UINT', 0),
0837              'auth_option_id'    => array('UINT', 0),
0838              'auth_role_id'        => array('UINT', 0),
0839              'auth_setting'        => array('TINT:2', 0),
0840          ),
0841          'KEYS'            => array(
0842              'group_id'        => array('INDEX', 'group_id'),
0843              'auth_opt_id'    => array('INDEX', 'auth_option_id'),
0844              'auth_role_id'    => array('INDEX', 'auth_role_id'),
0845          ),
0846      );
0847   
0848      $schema_data['phpbb_acl_options'] = array(
0849          'COLUMNS'        => array(
0850              'auth_option_id'    => array('UINT', NULL, 'auto_increment'),
0851              'auth_option'        => array('VCHAR:50', ''),
0852              'is_global'            => array('BOOL', 0),
0853              'is_local'            => array('BOOL', 0),
0854              'founder_only'        => array('BOOL', 0),
0855          ),
0856          'PRIMARY_KEY'    => 'auth_option_id',
0857          'KEYS'            => array(
0858              'auth_option'        => array('INDEX', 'auth_option'),
0859          ),
0860      );
0861   
0862      $schema_data['phpbb_acl_roles'] = array(
0863          'COLUMNS'        => array(
0864              'role_id'            => array('UINT', NULL, 'auto_increment'),
0865              'role_name'            => array('VCHAR_UNI', ''),
0866              'role_description'    => array('TEXT_UNI', ''),
0867              'role_type'            => array('VCHAR:10', ''),
0868              'role_order'        => array('USINT', 0),
0869          ),
0870          'PRIMARY_KEY'    => 'role_id',
0871          'KEYS'            => array(
0872              'role_type'            => array('INDEX', 'role_type'),
0873              'role_order'        => array('INDEX', 'role_order'),
0874          ),
0875      );
0876   
0877      $schema_data['phpbb_acl_roles_data'] = array(
0878          'COLUMNS'        => array(
0879              'role_id'            => array('UINT', 0),
0880              'auth_option_id'    => array('UINT', 0),
0881              'auth_setting'        => array('TINT:2', 0),
0882          ),
0883          'PRIMARY_KEY'    => array('role_id', 'auth_option_id'),
0884          'KEYS'            => array(
0885              'ath_op_id'            => array('INDEX', 'auth_option_id'),
0886          ),
0887      );
0888   
0889      $schema_data['phpbb_acl_users'] = array(
0890          'COLUMNS'        => array(
0891              'user_id'            => array('UINT', 0),
0892              'forum_id'            => array('UINT', 0),
0893              'auth_option_id'    => array('UINT', 0),
0894              'auth_role_id'        => array('UINT', 0),
0895              'auth_setting'        => array('TINT:2', 0),
0896          ),
0897          'KEYS'            => array(
0898              'user_id'            => array('INDEX', 'user_id'),
0899              'auth_option_id'    => array('INDEX', 'auth_option_id'),
0900              'auth_role_id'        => array('INDEX', 'auth_role_id'),
0901          ),
0902      );
0903   
0904      $schema_data['phpbb_banlist'] = array(
0905          'COLUMNS'        => array(
0906              'ban_id'            => array('UINT', NULL, 'auto_increment'),
0907              'ban_userid'        => array('UINT', 0),
0908              'ban_ip'            => array('VCHAR:40', ''),
0909              'ban_email'            => array('VCHAR_UNI:100', ''),
0910              'ban_start'            => array('TIMESTAMP', 0),
0911              'ban_end'            => array('TIMESTAMP', 0),
0912              'ban_exclude'        => array('BOOL', 0),
0913              'ban_reason'        => array('VCHAR_UNI', ''),
0914              'ban_give_reason'    => array('VCHAR_UNI', ''),
0915          ),
0916          'PRIMARY_KEY'            => 'ban_id',
0917          'KEYS'            => array(
0918              'ban_end'            => array('INDEX', 'ban_end'),
0919              'ban_user'            => array('INDEX', array('ban_userid', 'ban_exclude')),
0920              'ban_email'            => array('INDEX', array('ban_email', 'ban_exclude')),
0921              'ban_ip'            => array('INDEX', array('ban_ip', 'ban_exclude')),
0922          ),
0923      );
0924   
0925      $schema_data['phpbb_bbcodes'] = array(
0926          'COLUMNS'        => array(
0927              'bbcode_id'                => array('TINT:3', 0),
0928              'bbcode_tag'            => array('VCHAR:16', ''),
0929              'bbcode_helpline'        => array('VCHAR_UNI', ''),
0930              'display_on_posting'    => array('BOOL', 0),
0931              'bbcode_match'            => array('TEXT_UNI', ''),
0932              'bbcode_tpl'            => array('MTEXT_UNI', ''),
0933              'first_pass_match'        => array('MTEXT_UNI', ''),
0934              'first_pass_replace'    => array('MTEXT_UNI', ''),
0935              'second_pass_match'        => array('MTEXT_UNI', ''),
0936              'second_pass_replace'    => array('MTEXT_UNI', ''),
0937          ),
0938          'PRIMARY_KEY'    => 'bbcode_id',
0939          'KEYS'            => array(
0940              'display_on_post'        => array('INDEX', 'display_on_posting'),
0941          ),
0942      );
0943   
0944      $schema_data['phpbb_bookmarks'] = array(
0945          'COLUMNS'        => array(
0946              'topic_id'            => array('UINT', 0),
0947              'user_id'            => array('UINT', 0),
0948          ),
0949          'PRIMARY_KEY'            => array('topic_id', 'user_id'),
0950      );
0951   
0952      $schema_data['phpbb_bots'] = array(
0953          'COLUMNS'        => array(
0954              'bot_id'            => array('UINT', NULL, 'auto_increment'),
0955              'bot_active'        => array('BOOL', 1),
0956              'bot_name'            => array('STEXT_UNI', ''),
0957              'user_id'            => array('UINT', 0),
0958              'bot_agent'            => array('VCHAR', ''),
0959              'bot_ip'            => array('VCHAR', ''),
0960          ),
0961          'PRIMARY_KEY'    => 'bot_id',
0962          'KEYS'            => array(
0963              'bot_active'        => array('INDEX', 'bot_active'),
0964          ),
0965      );
0966   
0967      $schema_data['phpbb_config'] = array(
0968          'COLUMNS'        => array(
0969              'config_name'        => array('VCHAR', ''),
0970              'config_value'        => array('VCHAR_UNI', ''),
0971              'is_dynamic'        => array('BOOL', 0),
0972          ),
0973          'PRIMARY_KEY'    => 'config_name',
0974          'KEYS'            => array(
0975              'is_dynamic'        => array('INDEX', 'is_dynamic'),
0976          ),
0977      );
0978   
0979      $schema_data['phpbb_confirm'] = array(
0980          'COLUMNS'        => array(
0981              'confirm_id'        => array('CHAR:32', ''),
0982              'session_id'        => array('CHAR:32', ''),
0983              'confirm_type'        => array('TINT:3', 0),
0984              'code'                => array('VCHAR:8', ''),
0985              'seed'                => array('UINT:10', 0),
0986          ),
0987          'PRIMARY_KEY'    => array('session_id', 'confirm_id'),
0988          'KEYS'            => array(
0989              'confirm_type'        => array('INDEX', 'confirm_type'),
0990          ),
0991      );
0992   
0993      $schema_data['phpbb_disallow'] = array(
0994          'COLUMNS'        => array(
0995              'disallow_id'        => array('UINT', NULL, 'auto_increment'),
0996              'disallow_username'    => array('VCHAR_UNI:255', ''),
0997          ),
0998          'PRIMARY_KEY'    => 'disallow_id',
0999      );
1000   
1001      $schema_data['phpbb_drafts'] = array(
1002          'COLUMNS'        => array(
1003              'draft_id'            => array('UINT', NULL, 'auto_increment'),
1004              'user_id'            => array('UINT', 0),
1005              'topic_id'            => array('UINT', 0),
1006              'forum_id'            => array('UINT', 0),
1007              'save_time'            => array('TIMESTAMP', 0),
1008              'draft_subject'        => array('XSTEXT_UNI', ''),
1009              'draft_message'        => array('MTEXT_UNI', ''),
1010          ),
1011          'PRIMARY_KEY'    => 'draft_id',
1012          'KEYS'            => array(
1013              'save_time'            => array('INDEX', 'save_time'),
1014          ),
1015      );
1016   
1017      $schema_data['phpbb_extensions'] = array(
1018          'COLUMNS'        => array(
1019              'extension_id'        => array('UINT', NULL, 'auto_increment'),
1020              'group_id'            => array('UINT', 0),
1021              'extension'            => array('VCHAR:100', ''),
1022          ),
1023          'PRIMARY_KEY'    => 'extension_id',
1024      );
1025   
1026      $schema_data['phpbb_extension_groups'] = array(
1027          'COLUMNS'        => array(
1028              'group_id'            => array('UINT', NULL, 'auto_increment'),
1029              'group_name'        => array('VCHAR_UNI', ''),
1030              'cat_id'            => array('TINT:2', 0),
1031              'allow_group'        => array('BOOL', 0),
1032              'download_mode'        => array('BOOL', 1),
1033              'upload_icon'        => array('VCHAR', ''),
1034              'max_filesize'        => array('UINT:20', 0),
1035              'allowed_forums'    => array('TEXT', ''),
1036              'allow_in_pm'        => array('BOOL', 0),
1037          ),
1038          'PRIMARY_KEY'    => 'group_id',
1039      );
1040   
1041      $schema_data['phpbb_forums'] = array(
1042          'COLUMNS'        => array(
1043              'forum_id'                => array('UINT', NULL, 'auto_increment'),
1044              'parent_id'                => array('UINT', 0),
1045              'left_id'                => array('UINT', 0),
1046              'right_id'                => array('UINT', 0),
1047              'forum_parents'            => array('MTEXT', ''),
1048              'forum_name'            => array('STEXT_UNI', ''),
1049              'forum_desc'            => array('TEXT_UNI', ''),
1050              'forum_desc_bitfield'    => array('VCHAR:255', ''),
1051              'forum_desc_options'    => array('UINT:11', 7),
1052              'forum_desc_uid'        => array('VCHAR:8', ''),
1053              'forum_link'            => array('VCHAR_UNI', ''),
1054              'forum_password'        => array('VCHAR_UNI:40', ''),
1055              'forum_style'            => array('USINT', 0),
1056              'forum_image'            => array('VCHAR', ''),
1057              'forum_rules'            => array('TEXT_UNI', ''),
1058              'forum_rules_link'        => array('VCHAR_UNI', ''),
1059              'forum_rules_bitfield'    => array('VCHAR:255', ''),
1060              'forum_rules_options'    => array('UINT:11', 7),
1061              'forum_rules_uid'        => array('VCHAR:8', ''),
1062              'forum_topics_per_page'    => array('TINT:4', 0),
1063              'forum_type'            => array('TINT:4', 0),
1064              'forum_status'            => array('TINT:4', 0),
1065              'forum_posts'            => array('UINT', 0),
1066              'forum_topics'            => array('UINT', 0),
1067              'forum_topics_real'        => array('UINT', 0),
1068              'forum_last_post_id'    => array('UINT', 0),
1069              'forum_last_poster_id'    => array('UINT', 0),
1070              'forum_last_post_subject' => array('XSTEXT_UNI', ''),
1071              'forum_last_post_time'    => array('TIMESTAMP', 0),
1072              'forum_last_poster_name'=> array('VCHAR_UNI', ''),
1073              'forum_last_poster_colour'=> array('VCHAR:6', ''),
1074              'forum_flags'            => array('TINT:4', 32),
1075              'display_on_index'        => array('BOOL', 1),
1076              'enable_indexing'        => array('BOOL', 1),
1077              'enable_icons'            => array('BOOL', 1),
1078              'enable_prune'            => array('BOOL', 0),
1079              'prune_next'            => array('TIMESTAMP', 0),
1080              'prune_days'            => array('UINT', 0),
1081              'prune_viewed'            => array('UINT', 0),
1082              'prune_freq'            => array('UINT', 0),
1083          ),
1084          'PRIMARY_KEY'    => 'forum_id',
1085          'KEYS'            => array(
1086              'left_right_id'            => array('INDEX', array('left_id', 'right_id')),
1087              'forum_lastpost_id'        => array('INDEX', 'forum_last_post_id'),
1088          ),
1089      );
1090   
1091      $schema_data['phpbb_forums_access'] = array(
1092          'COLUMNS'        => array(
1093              'forum_id'                => array('UINT', 0),
1094              'user_id'                => array('UINT', 0),
1095              'session_id'            => array('CHAR:32', ''),
1096          ),
1097          'PRIMARY_KEY'    => array('forum_id', 'user_id', 'session_id'),
1098      );
1099   
1100      $schema_data['phpbb_forums_track'] = array(
1101          'COLUMNS'        => array(
1102              'user_id'                => array('UINT', 0),
1103              'forum_id'                => array('UINT', 0),
1104              'mark_time'                => array('TIMESTAMP', 0),
1105          ),
1106          'PRIMARY_KEY'    => array('user_id', 'forum_id'),
1107      );
1108   
1109      $schema_data['phpbb_forums_watch'] = array(
1110          'COLUMNS'        => array(
1111              'forum_id'                => array('UINT', 0),
1112              'user_id'                => array('UINT', 0),
1113              'notify_status'            => array('BOOL', 0),
1114          ),
1115          'KEYS'            => array(
1116              'forum_id'                => array('INDEX', 'forum_id'),
1117              'user_id'                => array('INDEX', 'user_id'),
1118              'notify_stat'            => array('INDEX', 'notify_status'),
1119          ),
1120      );
1121   
1122      $schema_data['phpbb_groups'] = array(
1123          'COLUMNS'        => array(
1124              'group_id'                => array('UINT', NULL, 'auto_increment'),
1125              'group_type'            => array('TINT:4', 1),
1126              'group_founder_manage'    => array('BOOL', 0),
1127              'group_name'            => array('VCHAR_CI', ''),
1128              'group_desc'            => array('TEXT_UNI', ''),
1129              'group_desc_bitfield'    => array('VCHAR:255', ''),
1130              'group_desc_options'    => array('UINT:11', 7),
1131              'group_desc_uid'        => array('VCHAR:8', ''),
1132              'group_display'            => array('BOOL', 0),
1133              'group_avatar'            => array('VCHAR', ''),
1134              'group_avatar_type'        => array('TINT:2', 0),
1135              'group_avatar_width'    => array('USINT', 0),
1136              'group_avatar_height'    => array('USINT', 0),
1137              'group_rank'            => array('UINT', 0),
1138              'group_colour'            => array('VCHAR:6', ''),
1139              'group_sig_chars'        => array('UINT', 0),
1140              'group_receive_pm'        => array('BOOL', 0),
1141              'group_message_limit'    => array('UINT', 0),
1142              'group_legend'            => array('BOOL', 1),
1143          ),
1144          'PRIMARY_KEY'    => 'group_id',
1145          'KEYS'            => array(
1146              'group_legend'            => array('INDEX', 'group_legend'),
1147          ),
1148      );
1149   
1150      $schema_data['phpbb_icons'] = array(
1151          'COLUMNS'        => array(
1152              'icons_id'                => array('UINT', NULL, 'auto_increment'),
1153              'icons_url'                => array('VCHAR', ''),
1154              'icons_width'            => array('TINT:4', 0),
1155              'icons_height'            => array('TINT:4', 0),
1156              'icons_order'            => array('UINT', 0),
1157              'display_on_posting'    => array('BOOL', 1),
1158          ),
1159          'PRIMARY_KEY'    => 'icons_id',
1160          'KEYS'            => array(
1161              'display_on_posting'    => array('INDEX', 'display_on_posting'),
1162          ),
1163      );
1164   
1165      $schema_data['phpbb_lang'] = array(
1166          'COLUMNS'        => array(
1167              'lang_id'                => array('TINT:4', NULL, 'auto_increment'),
1168              'lang_iso'                => array('VCHAR:30', ''),
1169              'lang_dir'                => array('VCHAR:30', ''),
1170              'lang_english_name'        => array('VCHAR_UNI:100', ''),
1171              'lang_local_name'        => array('VCHAR_UNI:255', ''),
1172              'lang_author'            => array('VCHAR_UNI:255', ''),
1173          ),
1174          'PRIMARY_KEY'    => 'lang_id',
1175          'KEYS'            => array(
1176              'lang_iso'                => array('INDEX', 'lang_iso'),
1177          ),
1178      );
1179   
1180      $schema_data['phpbb_log'] = array(
1181          'COLUMNS'        => array(
1182              'log_id'                => array('UINT', NULL, 'auto_increment'),
1183              'log_type'                => array('TINT:4', 0),
1184              'user_id'                => array('UINT', 0),
1185              'forum_id'                => array('UINT', 0),
1186              'topic_id'                => array('UINT', 0),
1187              'reportee_id'            => array('UINT', 0),
1188              'log_ip'                => array('VCHAR:40', ''),
1189              'log_time'                => array('TIMESTAMP', 0),
1190              'log_operation'            => array('TEXT_UNI', ''),
1191              'log_data'                => array('MTEXT_UNI', ''),
1192          ),
1193          'PRIMARY_KEY'    => 'log_id',
1194          'KEYS'            => array(
1195              'log_type'                => array('INDEX', 'log_type'),
1196              'forum_id'                => array('INDEX', 'forum_id'),
1197              'topic_id'                => array('INDEX', 'topic_id'),
1198              'reportee_id'            => array('INDEX', 'reportee_id'),
1199              'user_id'                => array('INDEX', 'user_id'),
1200          ),
1201      );
1202   
1203      $schema_data['phpbb_moderator_cache'] = array(
1204          'COLUMNS'        => array(
1205              'forum_id'                => array('UINT', 0),
1206              'user_id'                => array('UINT', 0),
1207              'username'                => array('VCHAR_UNI:255', ''),
1208              'group_id'                => array('UINT', 0),
1209              'group_name'            => array('VCHAR_UNI', ''),
1210              'display_on_index'        => array('BOOL', 1),
1211          ),
1212          'KEYS'            => array(
1213              'disp_idx'                => array('INDEX', 'display_on_index'),
1214              'forum_id'                => array('INDEX', 'forum_id'),
1215          ),
1216      );
1217   
1218      $schema_data['phpbb_modules'] = array(
1219          'COLUMNS'        => array(
1220              'module_id'                => array('UINT', NULL, 'auto_increment'),
1221              'module_enabled'        => array('BOOL', 1),
1222              'module_display'        => array('BOOL', 1),
1223              'module_basename'        => array('VCHAR', ''),
1224              'module_class'            => array('VCHAR:10', ''),
1225              'parent_id'                => array('UINT', 0),
1226              'left_id'                => array('UINT', 0),
1227              'right_id'                => array('UINT', 0),
1228              'module_langname'        => array('VCHAR', ''),
1229              'module_mode'            => array('VCHAR', ''),
1230              'module_auth'            => array('VCHAR', ''),
1231          ),
1232          'PRIMARY_KEY'    => 'module_id',
1233          'KEYS'            => array(
1234              'left_right_id'            => array('INDEX', array('left_id', 'right_id')),
1235              'module_enabled'        => array('INDEX', 'module_enabled'),
1236              'class_left_id'            => array('INDEX', array('module_class', 'left_id')),
1237          ),
1238      );
1239   
1240      $schema_data['phpbb_poll_options'] = array(
1241          'COLUMNS'        => array(
1242              'poll_option_id'        => array('TINT:4', 0),
1243              'topic_id'                => array('UINT', 0),
1244              'poll_option_text'        => array('TEXT_UNI', ''),
1245              'poll_option_total'        => array('UINT', 0),
1246          ),
1247          'KEYS'            => array(
1248              'poll_opt_id'            => array('INDEX', 'poll_option_id'),
1249              'topic_id'                => array('INDEX', 'topic_id'),
1250          ),
1251      );
1252   
1253      $schema_data['phpbb_poll_votes'] = array(
1254          'COLUMNS'        => array(
1255              'topic_id'                => array('UINT', 0),
1256              'poll_option_id'        => array('TINT:4', 0),
1257              'vote_user_id'            => array('UINT', 0),
1258              'vote_user_ip'            => array('VCHAR:40', ''),
1259          ),
1260          'KEYS'            => array(
1261              'topic_id'                => array('INDEX', 'topic_id'),
1262              'vote_user_id'            => array('INDEX', 'vote_user_id'),
1263              'vote_user_ip'            => array('INDEX', 'vote_user_ip'),
1264          ),
1265      );
1266   
1267      $schema_data['phpbb_posts'] = array(
1268          'COLUMNS'        => array(
1269              'post_id'                => array('UINT', NULL, 'auto_increment'),
1270              'topic_id'                => array('UINT', 0),
1271              'forum_id'                => array('UINT', 0),
1272              'poster_id'                => array('UINT', 0),
1273              'icon_id'                => array('UINT', 0),
1274              'poster_ip'                => array('VCHAR:40', ''),
1275              'post_time'                => array('TIMESTAMP', 0),
1276              'post_approved'            => array('BOOL', 1),
1277              'post_reported'            => array('BOOL', 0),
1278              'enable_bbcode'            => array('BOOL', 1),
1279              'enable_smilies'        => array('BOOL', 1),
1280              'enable_magic_url'        => array('BOOL', 1),
1281              'enable_sig'            => array('BOOL', 1),
1282              'post_username'            => array('VCHAR_UNI:255', ''),
1283              'post_subject'            => array('XSTEXT_UNI', '', 'true_sort'),
1284              'post_text'                => array('MTEXT_UNI', ''),
1285              'post_checksum'            => array('VCHAR:32', ''),
1286              'post_attachment'        => array('BOOL', 0),
1287              'bbcode_bitfield'        => array('VCHAR:255', ''),
1288              'bbcode_uid'            => array('VCHAR:8', ''),
1289              'post_postcount'        => array('BOOL', 1),
1290              'post_edit_time'        => array('TIMESTAMP', 0),
1291              'post_edit_reason'        => array('STEXT_UNI', ''),
1292              'post_edit_user'        => array('UINT', 0),
1293              'post_edit_count'        => array('USINT', 0),
1294              'post_edit_locked'        => array('BOOL', 0),
1295          ),
1296          'PRIMARY_KEY'    => 'post_id',
1297          'KEYS'            => array(
1298              'forum_id'                => array('INDEX', 'forum_id'),
1299              'topic_id'                => array('INDEX', 'topic_id'),
1300              'poster_ip'                => array('INDEX', 'poster_ip'),
1301              'poster_id'                => array('INDEX', 'poster_id'),
1302              'post_approved'            => array('INDEX', 'post_approved'),
1303              'tid_post_time'            => array('INDEX', array('topic_id', 'post_time')),
1304          ),
1305      );
1306   
1307      $schema_data['phpbb_privmsgs'] = array(
1308          'COLUMNS'        => array(
1309              'msg_id'                => array('UINT', NULL, 'auto_increment'),
1310              'root_level'            => array('UINT', 0),
1311              'author_id'                => array('UINT', 0),
1312              'icon_id'                => array('UINT', 0),
1313              'author_ip'                => array('VCHAR:40', ''),
1314              'message_time'            => array('TIMESTAMP', 0),
1315              'enable_bbcode'            => array('BOOL', 1),
1316              'enable_smilies'        => array('BOOL', 1),
1317              'enable_magic_url'        => array('BOOL', 1),
1318              'enable_sig'            => array('BOOL', 1),
1319              'message_subject'        => array('XSTEXT_UNI', ''),
1320              'message_text'            => array('MTEXT_UNI', ''),
1321              'message_edit_reason'    => array('STEXT_UNI', ''),
1322              'message_edit_user'        => array('UINT', 0),
1323              'message_attachment'    => array('BOOL', 0),
1324              'bbcode_bitfield'        => array('VCHAR:255', ''),
1325              'bbcode_uid'            => array('VCHAR:8', ''),
1326              'message_edit_time'        => array('TIMESTAMP', 0),
1327              'message_edit_count'    => array('USINT', 0),
1328              'to_address'            => array('TEXT_UNI', ''),
1329              'bcc_address'            => array('TEXT_UNI', ''),
1330          ),
1331          'PRIMARY_KEY'    => 'msg_id',
1332          'KEYS'            => array(
1333              'author_ip'                => array('INDEX', 'author_ip'),
1334              'message_time'            => array('INDEX', 'message_time'),
1335              'author_id'                => array('INDEX', 'author_id'),
1336              'root_level'            => array('INDEX', 'root_level'),
1337          ),
1338      );
1339   
1340      $schema_data['phpbb_privmsgs_folder'] = array(
1341          'COLUMNS'        => array(
1342              'folder_id'                => array('UINT', NULL, 'auto_increment'),
1343              'user_id'                => array('UINT', 0),
1344              'folder_name'            => array('VCHAR_UNI', ''),
1345              'pm_count'                => array('UINT', 0),
1346          ),
1347          'PRIMARY_KEY'    => 'folder_id',
1348          'KEYS'            => array(
1349              'user_id'                => array('INDEX', 'user_id'),
1350          ),
1351      );
1352   
1353      $schema_data['phpbb_privmsgs_rules'] = array(
1354          'COLUMNS'        => array(
1355              'rule_id'                => array('UINT', NULL, 'auto_increment'),
1356              'user_id'                => array('UINT', 0),
1357              'rule_check'            => array('UINT', 0),
1358              'rule_connection'        => array('UINT', 0),
1359              'rule_string'            => array('VCHAR_UNI', ''),
1360              'rule_user_id'            => array('UINT', 0),
1361              'rule_group_id'            => array('UINT', 0),
1362              'rule_action'            => array('UINT', 0),
1363              'rule_folder_id'        => array('INT:11', 0),
1364          ),
1365          'PRIMARY_KEY'    => 'rule_id',
1366          'KEYS'            => array(
1367              'user_id'                => array('INDEX', 'user_id'),
1368          ),
1369      );
1370   
1371      $schema_data['phpbb_privmsgs_to'] = array(
1372          'COLUMNS'        => array(
1373              'msg_id'                => array('UINT', 0),
1374              'user_id'                => array('UINT', 0),
1375              'author_id'                => array('UINT', 0),
1376              'pm_deleted'            => array('BOOL', 0),
1377              'pm_new'                => array('BOOL', 1),
1378              'pm_unread'                => array('BOOL', 1),
1379              'pm_replied'            => array('BOOL', 0),
1380              'pm_marked'                => array('BOOL', 0),
1381              'pm_forwarded'            => array('BOOL', 0),
1382              'folder_id'                => array('INT:11', 0),
1383          ),
1384          'KEYS'            => array(
1385              'msg_id'                => array('INDEX', 'msg_id'),
1386              'author_id'                => array('INDEX', 'author_id'),
1387              'usr_flder_id'            => array('INDEX', array('user_id', 'folder_id')),
1388          ),
1389      );
1390   
1391      $schema_data['phpbb_profile_fields'] = array(
1392          'COLUMNS'        => array(
1393              'field_id'                => array('UINT', NULL, 'auto_increment'),
1394              'field_name'            => array('VCHAR_UNI', ''),
1395              'field_type'            => array('TINT:4', 0),
1396              'field_ident'            => array('VCHAR:20', ''),
1397              'field_length'            => array('VCHAR:20', ''),
1398              'field_minlen'            => array('VCHAR', ''),
1399              'field_maxlen'            => array('VCHAR', ''),
1400              'field_novalue'            => array('VCHAR_UNI', ''),
1401              'field_default_value'    => array('VCHAR_UNI', ''),
1402              'field_validation'        => array('VCHAR_UNI:20', ''),
1403              'field_required'        => array('BOOL', 0),
1404              'field_show_on_reg'        => array('BOOL', 0),
1405              'field_hide'            => array('BOOL', 0),
1406              'field_no_view'            => array('BOOL', 0),
1407              'field_active'            => array('BOOL', 0),
1408              'field_order'            => array('UINT', 0),
1409          ),
1410          'PRIMARY_KEY'    => 'field_id',
1411          'KEYS'            => array(
1412              'fld_type'            => array('INDEX', 'field_type'),
1413              'fld_ordr'            => array('INDEX', 'field_order'),
1414          ),
1415      );
1416   
1417      $schema_data['phpbb_profile_fields_data'] = array(
1418          'COLUMNS'        => array(
1419              'user_id'                => array('UINT', 0),
1420          ),
1421          'PRIMARY_KEY'    => 'user_id',
1422      );
1423   
1424      $schema_data['phpbb_profile_fields_lang'] = array(
1425          'COLUMNS'        => array(
1426              'field_id'                => array('UINT', 0),
1427              'lang_id'                => array('UINT', 0),
1428              'option_id'                => array('UINT', 0),
1429              'field_type'            => array('TINT:4', 0),
1430              'lang_value'            => array('VCHAR_UNI', ''),
1431          ),
1432          'PRIMARY_KEY'    => array('field_id', 'lang_id', 'option_id'),
1433      );
1434   
1435      $schema_data['phpbb_profile_lang'] = array(
1436          'COLUMNS'        => array(
1437              'field_id'                => array('UINT', 0),
1438              'lang_id'                => array('UINT', 0),
1439              'lang_name'                => array('VCHAR_UNI', ''),
1440              'lang_explain'            => array('TEXT_UNI', ''),
1441              'lang_default_value'    => array('VCHAR_UNI', ''),
1442          ),
1443          'PRIMARY_KEY'    => array('field_id', 'lang_id'),
1444      );
1445   
1446      $schema_data['phpbb_ranks'] = array(
1447          'COLUMNS'        => array(
1448              'rank_id'                => array('UINT', NULL, 'auto_increment'),
1449              'rank_title'            => array('VCHAR_UNI', ''),
1450              'rank_min'                => array('UINT', 0),
1451              'rank_special'            => array('BOOL', 0),
1452              'rank_image'            => array('VCHAR', ''),
1453          ),
1454          'PRIMARY_KEY'    => 'rank_id',
1455      );
1456   
1457      $schema_data['phpbb_reports'] = array(
1458          'COLUMNS'        => array(
1459              'report_id'                => array('UINT', NULL, 'auto_increment'),
1460              'reason_id'                => array('USINT', 0),
1461              'post_id'                => array('UINT', 0),
1462              'user_id'                => array('UINT', 0),
1463              'user_notify'            => array('BOOL', 0),
1464              'report_closed'            => array('BOOL', 0),
1465              'report_time'            => array('TIMESTAMP', 0),
1466              'report_text'            => array('MTEXT_UNI', ''),
1467          ),
1468          'PRIMARY_KEY'    => 'report_id',
1469      );
1470   
1471      $schema_data['phpbb_reports_reasons'] = array(
1472          'COLUMNS'        => array(
1473              'reason_id'                => array('USINT', NULL, 'auto_increment'),
1474              'reason_title'            => array('VCHAR_UNI', ''),
1475              'reason_description'    => array('MTEXT_UNI', ''),
1476              'reason_order'            => array('USINT', 0),
1477          ),
1478          'PRIMARY_KEY'    => 'reason_id',
1479      );
1480   
1481      $schema_data['phpbb_search_results'] = array(
1482          'COLUMNS'        => array(
1483              'search_key'            => array('VCHAR:32', ''),
1484              'search_time'            => array('TIMESTAMP', 0),
1485              'search_keywords'        => array('MTEXT_UNI', ''),
1486              'search_authors'        => array('MTEXT', ''),
1487          ),
1488          'PRIMARY_KEY'    => 'search_key',
1489      );
1490   
1491      $schema_data['phpbb_search_wordlist'] = array(
1492          'COLUMNS'        => array(
1493              'word_id'            => array('UINT', NULL, 'auto_increment'),
1494              'word_text'            => array('VCHAR_UNI', ''),
1495              'word_common'        => array('BOOL', 0),
1496              'word_count'        => array('UINT', 0),
1497          ),
1498          'PRIMARY_KEY'    => 'word_id',
1499          'KEYS'            => array(
1500              'wrd_txt'            => array('UNIQUE', 'word_text'),
1501              'wrd_cnt'            => array('INDEX', 'word_count'),
1502          ),
1503      );
1504   
1505      $schema_data['phpbb_search_wordmatch'] = array(
1506          'COLUMNS'        => array(
1507              'post_id'            => array('UINT', 0),
1508              'word_id'            => array('UINT', 0),
1509              'title_match'        => array('BOOL', 0),
1510          ),
1511          'KEYS'            => array(
1512              'unq_mtch'            => array('UNIQUE', array('word_id', 'post_id', 'title_match')),
1513              'word_id'            => array('INDEX', 'word_id'),
1514              'post_id'            => array('INDEX', 'post_id'),
1515          ),
1516      );
1517   
1518      $schema_data['phpbb_sessions'] = array(
1519          'COLUMNS'        => array(
1520              'session_id'            => array('CHAR:32', ''),
1521              'session_user_id'        => array('UINT', 0),
1522              'session_last_visit'    => array('TIMESTAMP', 0),
1523              'session_start'            => array('TIMESTAMP', 0),
1524              'session_time'            => array('TIMESTAMP', 0),
1525              'session_ip'            => array('VCHAR:40', ''),
1526              'session_browser'        => array('VCHAR:150', ''),
1527              'session_forwarded_for'    => array('VCHAR:255', ''),
1528              'session_page'            => array('VCHAR_UNI', ''),
1529              'session_viewonline'    => array('BOOL', 1),
1530              'session_autologin'        => array('BOOL', 0),
1531              'session_admin'            => array('BOOL', 0),
1532          ),
1533          'PRIMARY_KEY'    => 'session_id',
1534          'KEYS'            => array(
1535              'session_time'        => array('INDEX', 'session_time'),
1536              'session_user_id'    => array('INDEX', 'session_user_id'),
1537          ),
1538      );
1539   
1540      $schema_data['phpbb_sessions_keys'] = array(
1541          'COLUMNS'        => array(
1542              'key_id'            => array('CHAR:32', ''),
1543              'user_id'            => array('UINT', 0),
1544              'last_ip'            => array('VCHAR:40', ''),
1545              'last_login'        => array('TIMESTAMP', 0),
1546          ),
1547          'PRIMARY_KEY'    => array('key_id', 'user_id'),
1548          'KEYS'            => array(
1549              'last_login'        => array('INDEX', 'last_login'),
1550          ),
1551      );
1552   
1553      $schema_data['phpbb_sitelist'] = array(
1554          'COLUMNS'        => array(
1555              'site_id'        => array('UINT', NULL, 'auto_increment'),
1556              'site_ip'        => array('VCHAR:40', ''),
1557              'site_hostname'    => array('VCHAR', ''),
1558              'ip_exclude'    => array('BOOL', 0),
1559          ),
1560          'PRIMARY_KEY'        => 'site_id',
1561      );
1562   
1563      $schema_data['phpbb_smilies'] = array(
1564          'COLUMNS'        => array(
1565              'smiley_id'            => array('UINT', NULL, 'auto_increment'),
1566              // We may want to set 'code' to VCHAR:50 or check if unicode support is possible... at the moment only ASCII characters are allowed.
1567              'code'                => array('VCHAR_UNI:50', ''),
1568              'emotion'            => array('VCHAR_UNI:50', ''),
1569              'smiley_url'        => array('VCHAR:50', ''),
1570              'smiley_width'        => array('USINT', 0),
1571              'smiley_height'        => array('USINT', 0),
1572              'smiley_order'        => array('UINT', 0),
1573              'display_on_posting'=> array('BOOL', 1),
1574          ),
1575          'PRIMARY_KEY'    => 'smiley_id',
1576          'KEYS'            => array(
1577              'display_on_post'        => array('INDEX', 'display_on_posting'),
1578          ),
1579      );
1580   
1581      $schema_data['phpbb_styles'] = array(
1582          'COLUMNS'        => array(
1583              'style_id'                => array('USINT', NULL, 'auto_increment'),
1584              'style_name'            => array('VCHAR_UNI:255', ''),
1585              'style_copyright'        => array('VCHAR_UNI', ''),
1586              'style_active'            => array('BOOL', 1),
1587              'template_id'            => array('USINT', 0),
1588              'theme_id'                => array('USINT', 0),
1589              'imageset_id'            => array('USINT', 0),
1590          ),
1591          'PRIMARY_KEY'    => 'style_id',
1592          'KEYS'            => array(
1593              'style_name'        => array('UNIQUE', 'style_name'),
1594              'template_id'        => array('INDEX', 'template_id'),
1595              'theme_id'            => array('INDEX', 'theme_id'),
1596              'imageset_id'        => array('INDEX', 'imageset_id'),
1597          ),
1598      );
1599   
1600      $schema_data['phpbb_styles_template'] = array(
1601          'COLUMNS'        => array(
1602              'template_id'            => array('USINT', NULL, 'auto_increment'),
1603              'template_name'            => array('VCHAR_UNI:255', ''),
1604              'template_copyright'    => array('VCHAR_UNI', ''),
1605              'template_path'            => array('VCHAR:100', ''),
1606              'bbcode_bitfield'        => array('VCHAR:255', 'kNg='),
1607              'template_storedb'        => array('BOOL', 0),
1608          ),
1609          'PRIMARY_KEY'    => 'template_id',
1610          'KEYS'            => array(
1611              'tmplte_nm'                => array('UNIQUE', 'template_name'),
1612          ),
1613      );
1614   
1615      $schema_data['phpbb_styles_template_data'] = array(
1616          'COLUMNS'        => array(
1617              'template_id'            => array('USINT', 0),
1618              'template_filename'        => array('VCHAR:100', ''),
1619              'template_included'        => array('TEXT', ''),
1620              'template_mtime'        => array('TIMESTAMP', 0),
1621              'template_data'            => array('MTEXT_UNI', ''),
1622          ),
1623          'KEYS'            => array(
1624              'tid'                    => array('INDEX', 'template_id'),
1625              'tfn'                    => array('INDEX', 'template_filename'),
1626          ),
1627      );
1628   
1629      $schema_data['phpbb_styles_theme'] = array(
1630          'COLUMNS'        => array(
1631              'theme_id'                => array('USINT', NULL, 'auto_increment'),
1632              'theme_name'            => array('VCHAR_UNI:255', ''),
1633              'theme_copyright'        => array('VCHAR_UNI', ''),
1634              'theme_path'            => array('VCHAR:100', ''),
1635              'theme_storedb'            => array('BOOL', 0),
1636              'theme_mtime'            => array('TIMESTAMP', 0),
1637              'theme_data'            => array('MTEXT_UNI', ''),
1638          ),
1639          'PRIMARY_KEY'    => 'theme_id',
1640          'KEYS'            => array(
1641              'theme_name'        => array('UNIQUE', 'theme_name'),
1642          ),
1643      );
1644   
1645      $schema_data['phpbb_styles_imageset'] = array(
1646          'COLUMNS'        => array(
1647              'imageset_id'                => array('USINT', NULL, 'auto_increment'),
1648              'imageset_name'                => array('VCHAR_UNI:255', ''),
1649              'imageset_copyright'        => array('VCHAR_UNI', ''),
1650              'imageset_path'                => array('VCHAR:100', ''),
1651          ),
1652          'PRIMARY_KEY'        => 'imageset_id',
1653          'KEYS'                => array(
1654              'imgset_nm'            => array('UNIQUE', 'imageset_name'),
1655          ),
1656      );
1657   
1658      $schema_data['phpbb_styles_imageset_data'] = array(
1659          'COLUMNS'        => array(
1660              'image_id'                => array('USINT', NULL, 'auto_increment'),
1661              'image_name'            => array('VCHAR:200', ''),
1662              'image_filename'        => array('VCHAR:200', ''),
1663              'image_lang'            => array('VCHAR:30', ''),
1664              'image_height'            => array('USINT', 0),
1665              'image_width'            => array('USINT', 0),
1666              'imageset_id'            => array('USINT', 0),
1667          ),
1668          'PRIMARY_KEY'        => 'image_id',
1669          'KEYS'                => array(
1670              'i_d'            => array('INDEX', 'imageset_id'),
1671          ),
1672      );
1673   
1674      $schema_data['phpbb_topics'] = array(
1675          'COLUMNS'        => array(
1676              'topic_id'                    => array('UINT', NULL, 'auto_increment'),
1677              'forum_id'                    => array('UINT', 0),
1678              'icon_id'                    => array('UINT', 0),
1679              'topic_attachment'            => array('BOOL', 0),
1680              'topic_approved'            => array('BOOL', 1),
1681              'topic_reported'            => array('BOOL', 0),
1682              'topic_title'                => array('XSTEXT_UNI', '', 'true_sort'),
1683              'topic_poster'                => array('UINT', 0),
1684              'topic_time'                => array('TIMESTAMP', 0),
1685              'topic_time_limit'            => array('TIMESTAMP', 0),
1686              'topic_views'                => array('UINT', 0),
1687              'topic_replies'                => array('UINT', 0),
1688              'topic_replies_real'        => array('UINT', 0),
1689              'topic_status'                => array('TINT:3', 0),
1690              'topic_type'                => array('TINT:3', 0),
1691              'topic_first_post_id'        => array('UINT', 0),
1692              'topic_first_poster_name'    => array('VCHAR_UNI', ''),
1693              'topic_first_poster_colour'    => array('VCHAR:6', ''),
1694              'topic_last_post_id'        => array('UINT', 0),
1695              'topic_last_poster_id'        => array('UINT', 0),
1696              'topic_last_poster_name'    => array('VCHAR_UNI', ''),
1697              'topic_last_poster_colour'    => array('VCHAR:6', ''),
1698              'topic_last_post_subject'    => array('XSTEXT_UNI', ''),
1699              'topic_last_post_time'        => array('TIMESTAMP', 0),
1700              'topic_last_view_time'        => array('TIMESTAMP', 0),
1701              'topic_moved_id'            => array('UINT', 0),
1702              'topic_bumped'                => array('BOOL', 0),
1703              'topic_bumper'                => array('UINT', 0),
1704              'poll_title'                => array('STEXT_UNI', ''),
1705              'poll_start'                => array('TIMESTAMP', 0),
1706              'poll_length'                => array('TIMESTAMP', 0),
1707              'poll_max_options'            => array('TINT:4', 1),
1708              'poll_last_vote'            => array('TIMESTAMP', 0),
1709              'poll_vote_change'            => array('BOOL', 0),
1710          ),
1711          'PRIMARY_KEY'    => 'topic_id',
1712          'KEYS'            => array(
1713              'forum_id'            => array('INDEX', 'forum_id'),
1714              'forum_id_type'        => array('INDEX', array('forum_id', 'topic_type')),
1715              'last_post_time'    => array('INDEX', 'topic_last_post_time'),
1716              'topic_approved'    => array('INDEX', 'topic_approved'),
1717              'forum_appr_last'    => array('INDEX', array('forum_id', 'topic_approved', 'topic_last_post_id')),
1718              'fid_time_moved'    => array('INDEX', array('forum_id', 'topic_last_post_time', 'topic_moved_id')),
1719          ),
1720      );
1721   
1722      $schema_data['phpbb_topics_track'] = array(
1723          'COLUMNS'        => array(
1724              'user_id'            => array('UINT', 0),
1725              'topic_id'            => array('UINT', 0),
1726              'forum_id'            => array('UINT', 0),
1727              'mark_time'            => array('TIMESTAMP', 0),
1728          ),
1729          'PRIMARY_KEY'    => array('user_id', 'topic_id'),
1730          'KEYS'            => array(
1731              'forum_id'            => array('INDEX', 'forum_id'),
1732          ),
1733      );
1734   
1735      $schema_data['phpbb_topics_posted'] = array(
1736          'COLUMNS'        => array(
1737              'user_id'            => array('UINT', 0),
1738              'topic_id'            => array('UINT', 0),
1739              'topic_posted'        => array('BOOL', 0),
1740          ),
1741          'PRIMARY_KEY'    => array('user_id', 'topic_id'),
1742      );
1743   
1744      $schema_data['phpbb_topics_watch'] = array(
1745          'COLUMNS'        => array(
1746              'topic_id'            => array('UINT', 0),
1747              'user_id'            => array('UINT', 0),
1748              'notify_status'        => array('BOOL', 0),
1749          ),
1750          'KEYS'            => array(
1751              'topic_id'            => array('INDEX', 'topic_id'),
1752              'user_id'            => array('INDEX', 'user_id'),
1753              'notify_stat'        => array('INDEX', 'notify_status'),
1754          ),
1755      );
1756   
1757      $schema_data['phpbb_user_group'] = array(
1758          'COLUMNS'        => array(
1759              'group_id'            => array('UINT', 0),
1760              'user_id'            => array('UINT', 0),
1761              'group_leader'        => array('BOOL', 0),
1762              'user_pending'        => array('BOOL', 1),
1763          ),
1764          'KEYS'            => array(
1765              'group_id'            => array('INDEX', 'group_id'),
1766              'user_id'            => array('INDEX', 'user_id'),
1767              'group_leader'        => array('INDEX', 'group_leader'),
1768          ),
1769      );
1770   
1771      $schema_data['phpbb_users'] = array(
1772          'COLUMNS'        => array(
1773              'user_id'                    => array('UINT', NULL, 'auto_increment'),
1774              'user_type'                    => array('TINT:2', 0),
1775              'group_id'                    => array('UINT', 3),
1776              'user_permissions'            => array('MTEXT', ''),
1777              'user_perm_from'            => array('UINT', 0),
1778              'user_ip'                    => array('VCHAR:40', ''),
1779              'user_regdate'                => array('TIMESTAMP', 0),
1780              'username'                    => array('VCHAR_CI', ''),
1781              'username_clean'            => array('VCHAR_CI', ''),
1782              'user_password'                => array('VCHAR_UNI:40', ''),
1783              'user_passchg'                => array('TIMESTAMP', 0),
1784              'user_pass_convert'            => array('BOOL', 0),
1785              'user_email'                => array('VCHAR_UNI:100', ''),
1786              'user_email_hash'            => array('BINT', 0),
1787              'user_birthday'                => array('VCHAR:10', ''),
1788              'user_lastvisit'            => array('TIMESTAMP', 0),
1789              'user_lastmark'                => array('TIMESTAMP', 0),
1790              'user_lastpost_time'        => array('TIMESTAMP', 0),
1791              'user_lastpage'                => array('VCHAR_UNI:200', ''),
1792              'user_last_confirm_key'        => array('VCHAR:10', ''),
1793              'user_last_search'            => array('TIMESTAMP', 0),
1794              'user_warnings'                => array('TINT:4', 0),
1795              'user_last_warning'            => array('TIMESTAMP', 0),
1796              'user_login_attempts'        => array('TINT:4', 0),
1797              'user_inactive_reason'        => array('TINT:2', 0),
1798              'user_inactive_time'        => array('TIMESTAMP', 0),
1799              'user_posts'                => array('UINT', 0),
1800              'user_lang'                    => array('VCHAR:30', ''),
1801              'user_timezone'                => array('DECIMAL', 0),
1802              'user_dst'                    => array('BOOL', 0),
1803              'user_dateformat'            => array('VCHAR_UNI:30', 'd M Y H:i'),
1804              'user_style'                => array('USINT', 0),
1805              'user_rank'                    => array('UINT', 0),
1806              'user_colour'                => array('VCHAR:6', ''),
1807              'user_new_privmsg'            => array('INT:4', 0),
1808              'user_unread_privmsg'        => array('INT:4', 0),
1809              'user_last_privmsg'            => array('TIMESTAMP', 0),
1810              'user_message_rules'        => array('BOOL', 0),
1811              'user_full_folder'            => array('INT:11', -3),
1812              'user_emailtime'            => array('TIMESTAMP', 0),
1813              'user_topic_show_days'        => array('USINT', 0),
1814              'user_topic_sortby_type'    => array('VCHAR:1', 't'),
1815              'user_topic_sortby_dir'        => array('VCHAR:1', 'd'),
1816              'user_post_show_days'        => array('USINT', 0),
1817              'user_post_sortby_type'        => array('VCHAR:1', 't'),
1818              'user_post_sortby_dir'        => array('VCHAR:1', 'a'),
1819              'user_notify'                => array('BOOL', 0),
1820              'user_notify_pm'            => array('BOOL', 1),
1821              'user_notify_type'            => array('TINT:4', 0),
1822              'user_allow_pm'                => array('BOOL', 1),
1823              'user_allow_viewonline'        => array('BOOL', 1),
1824              'user_allow_viewemail'        => array('BOOL', 1),
1825              'user_allow_massemail'        => array('BOOL', 1),
1826              'user_options'                => array('UINT:11', 895),
1827              'user_avatar'                => array('VCHAR', ''),
1828              'user_avatar_type'            => array('TINT:2', 0),
1829              'user_avatar_width'            => array('USINT', 0),
1830              'user_avatar_height'        => array('USINT', 0),
1831              'user_sig'                    => array('MTEXT_UNI', ''),
1832              'user_sig_bbcode_uid'        => array('VCHAR:8', ''),
1833              'user_sig_bbcode_bitfield'    => array('VCHAR:255', ''),
1834              'user_from'                    => array('VCHAR_UNI:100', ''),
1835              'user_icq'                    => array('VCHAR:15', ''),
1836              'user_aim'                    => array('VCHAR_UNI', ''),
1837              'user_yim'                    => array('VCHAR_UNI', ''),
1838              'user_msnm'                    => array('VCHAR_UNI', ''),
1839              'user_jabber'                => array('VCHAR_UNI', ''),
1840              'user_website'                => array('VCHAR_UNI:200', ''),
1841              'user_occ'                    => array('TEXT_UNI', ''),
1842              'user_interests'            => array('TEXT_UNI', ''),
1843              'user_actkey'                => array('VCHAR:32', ''),
1844              'user_newpasswd'            => array('VCHAR_UNI:40', ''),
1845              'user_form_salt'            => array('VCHAR_UNI:32', ''),
1846   
1847          ),
1848          'PRIMARY_KEY'    => 'user_id',
1849          'KEYS'            => array(
1850              'user_birthday'                => array('INDEX', 'user_birthday'),
1851              'user_email_hash'            => array('INDEX', 'user_email_hash'),
1852              'user_type'                    => array('INDEX', 'user_type'),
1853              'username_clean'            => array('UNIQUE', 'username_clean'),
1854          ),
1855      );
1856   
1857      $schema_data['phpbb_warnings'] = array(
1858          'COLUMNS'        => array(
1859              'warning_id'            => array('UINT', NULL, 'auto_increment'),
1860              'user_id'                => array('UINT', 0),
1861              'post_id'                => array('UINT', 0),
1862              'log_id'                => array('UINT', 0),
1863              'warning_time'            => array('TIMESTAMP', 0),
1864          ),
1865          'PRIMARY_KEY'    => 'warning_id',
1866      );
1867   
1868      $schema_data['phpbb_words'] = array(
1869          'COLUMNS'        => array(
1870              'word_id'                => array('UINT', NULL, 'auto_increment'),
1871              'word'                    => array('VCHAR_UNI', ''),
1872              'replacement'            => array('VCHAR_UNI', ''),
1873          ),
1874          'PRIMARY_KEY'    => 'word_id',
1875      );
1876   
1877      $schema_data['phpbb_zebra'] = array(
1878          'COLUMNS'        => array(
1879              'user_id'                => array('UINT', 0),
1880              'zebra_id'                => array('UINT', 0),
1881              'friend'                => array('BOOL', 0),
1882              'foe'                    => array('BOOL', 0),
1883          ),
1884          'PRIMARY_KEY'    => array('user_id', 'zebra_id'),
1885      );
1886   
1887      return $schema_data;
1888  }
1889   
1890   
1891  /**
1892  * Data put into the header for various dbms
1893  */
1894  function custom_data($dbms)
1895  {
1896      switch ($dbms)
1897      {
1898          case 'oracle':
1899              return <<<EOF
1900  /*
1901    This first section is optional, however its probably the best method
1902    of running phpBB on Oracle. If you already have a tablespace and user created
1903    for phpBB you can leave this section commented out!
1904   
1905    The first set of statements create a phpBB tablespace and a phpBB user,
1906    make sure you change the password of the phpBB user before you run this script!!
1907  */
1908   
1909  /*
1910  CREATE TABLESPACE "PHPBB"
1911      LOGGING
1912      DATAFILE 'E:\ORACLE\ORADATA\LOCAL\PHPBB.ora'
1913      SIZE 10M
1914      AUTOEXTEND ON NEXT 10M
1915      MAXSIZE 100M;
1916   
1917  CREATE USER "PHPBB"
1918      PROFILE "DEFAULT"
1919      IDENTIFIED BY "phpbb_password"
1920      DEFAULT TABLESPACE "PHPBB"
1921      QUOTA UNLIMITED ON "PHPBB"
1922      ACCOUNT UNLOCK;
1923   
1924  GRANT ANALYZE ANY TO "PHPBB";
1925  GRANT CREATE SEQUENCE TO "PHPBB";
1926  GRANT CREATE SESSION TO "PHPBB";
1927  GRANT CREATE TABLE TO "PHPBB";
1928  GRANT CREATE TRIGGER TO "PHPBB";
1929  GRANT CREATE VIEW TO "PHPBB";
1930  GRANT "CONNECT" TO "PHPBB";
1931   
1932  COMMIT;
1933  DISCONNECT;
1934   
1935  CONNECT phpbb/phpbb_password;
1936  */
1937  EOF;
1938   
1939   
1940          break;
1941   
1942          case 'postgres':
1943              return <<<EOF
1944  /*
1945      Domain definition
1946  */
1947  CREATE DOMAIN varchar_ci AS varchar(255) NOT NULL DEFAULT ''::character varying;
1948   
1949  /*
1950      Operation Functions
1951  */
1952  CREATE FUNCTION _varchar_ci_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) = LOWER($2)' LANGUAGE SQL STRICT;
1953  CREATE FUNCTION _varchar_ci_not_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) != LOWER($2)' LANGUAGE SQL STRICT;
1954  CREATE FUNCTION _varchar_ci_less_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) < LOWER($2)' LANGUAGE SQL STRICT;
1955  CREATE FUNCTION _varchar_ci_less_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) <= LOWER($2)' LANGUAGE SQL STRICT;
1956  CREATE FUNCTION _varchar_ci_greater_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) > LOWER($2)' LANGUAGE SQL STRICT;
1957  CREATE FUNCTION _varchar_ci_greater_equals(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) >= LOWER($2)' LANGUAGE SQL STRICT;
1958   
1959  /*
1960      Operators
1961  */
1962  CREATE OPERATOR <(
1963    PROCEDURE = _varchar_ci_less_than,
1964    LEFTARG = varchar_ci,
1965    RIGHTARG = varchar_ci,
1966    COMMUTATOR = >,
1967    NEGATOR = >=,
1968    RESTRICT = scalarltsel,
1969    JOIN = scalarltjoinsel);
1970   
1971  CREATE OPERATOR <=(
1972    PROCEDURE = _varchar_ci_less_equal,
1973    LEFTARG = varchar_ci,
1974    RIGHTARG = varchar_ci,
1975    COMMUTATOR = >=,
1976    NEGATOR = >,
1977    RESTRICT = scalarltsel,
1978    JOIN = scalarltjoinsel);
1979   
1980  CREATE OPERATOR >(
1981    PROCEDURE = _varchar_ci_greater_than,
1982    LEFTARG = varchar_ci,
1983    RIGHTARG = varchar_ci,
1984    COMMUTATOR = <,
1985    NEGATOR = <=,
1986    RESTRICT = scalargtsel,
1987    JOIN = scalargtjoinsel);
1988   
1989  CREATE OPERATOR >=(
1990    PROCEDURE = _varchar_ci_greater_equals,
1991    LEFTARG = varchar_ci,
1992    RIGHTARG = varchar_ci,
1993    COMMUTATOR = <=,
1994    NEGATOR = <,
1995    RESTRICT = scalargtsel,
1996    JOIN = scalargtjoinsel);
1997   
1998  CREATE OPERATOR <>(
1999    PROCEDURE = _varchar_ci_not_equal,
2000    LEFTARG = varchar_ci,
2001    RIGHTARG = varchar_ci,
2002    COMMUTATOR = <>,
2003    NEGATOR = =,
2004    RESTRICT = neqsel,
2005    JOIN = neqjoinsel);
2006   
2007  CREATE OPERATOR =(
2008    PROCEDURE = _varchar_ci_equal,
2009    LEFTARG = varchar_ci,
2010    RIGHTARG = varchar_ci,
2011    COMMUTATOR = =,
2012    NEGATOR = <>,
2013    RESTRICT = eqsel,
2014    JOIN = eqjoinsel,
2015    HASHES,
2016    MERGES,
2017    SORT1= <);
2018   
2019  EOF;
2020   
2021          break;
2022      }
2023   
2024      return '';
2025  }
2026   
2027  echo 'done';
2028   
2029  ?>