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  ?>