aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/db/mssql-odbc.php697
-rw-r--r--phpBB/includes/db/mysql.php8
-rw-r--r--phpBB/includes/db/mysql4.php15
-rw-r--r--phpBB/install/install.php4
-rw-r--r--phpBB/install/schemas/mssql_schema.sql2
-rw-r--r--phpBB/install/schemas/schema_data.sql54
6 files changed, 511 insertions, 269 deletions
diff --git a/phpBB/includes/db/mssql-odbc.php b/phpBB/includes/db/mssql-odbc.php
index 82352a1247..75ef7b1ac9 100644
--- a/phpBB/includes/db/mssql-odbc.php
+++ b/phpBB/includes/db/mssql-odbc.php
@@ -1,51 +1,43 @@
<?php
-/***************************************************************************
- * mssql-odbc.php
- * -------------------
- * begin : Saturday, Feb 13, 2001
- * copyright : (C) 2001 The phpBB Group
- * email : support@phpbb.com
- *
- * $Id$
- *
- ***************************************************************************/
-
-/***************************************************************************
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- ***************************************************************************/
-
-if(!defined("SQL_LAYER"))
+// -------------------------------------------------------------
+//
+// $Id$
+//
+// FILENAME : mssql-odbc.php
+// STARTED : Sat Feb 13, 2001
+// COPYRIGHT : © 2001, 2003 phpBB Group
+// WWW : http://www.phpbb.com/
+// LICENCE : GPL vs2.0 [ see /docs/COPYING ]
+//
+// -------------------------------------------------------------
+
+if (!defined('SQL_LAYER'))
{
-define("SQL_LAYER","mssql-odbc");
+define('SQL_LAYER', 'mssql-odbc');
class sql_db
{
-
var $db_connect_id;
- var $result;
-
- var $next_id;
+ var $query_result;
+ var $return_on_error = false;
+ var $transaction = false;
+ var $sql_time = 0;
+ var $num_queries = 0;
+ var $open_queries = array();
- var $num_rows = array();
- var $current_row = array();
+ var $result_rowset = array();
var $field_names = array();
var $field_types = array();
- var $result_rowset = array();
-
- var $num_queries = 0;
+ var $num_rows = array();
+ var $current_row = array();
- function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true)
+ function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false)
{
$this->persistency = $persistency;
- $this->server = $sqlserver;
$this->user = $sqluser;
$this->password = $sqlpassword;
+ $this->server = $sqlserver . (($port) ? ':' . $port : '');
$this->dbname = $database;
$this->db_connect_id = ($this->persistency) ? @odbc_pconnect($this->server, $this->user, $this->password) : @odbc_connect($this->server, $this->user, $this->password);
@@ -53,6 +45,41 @@ class sql_db
return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
}
+ //
+ // Other base methods
+ //
+ function sql_close()
+ {
+ if (!$this->db_connect_id)
+ {
+ return false;
+ }
+
+ if ($this->transaction)
+ {
+ @odbc_commit($this->db_connect_id);
+ }
+
+ if (sizeof($this->result_rowset))
+ {
+ unset($this->result_rowset);
+ unset($this->field_names);
+ unset($this->field_types);
+ unset($this->num_rows);
+ unset($this->current_row);
+ }
+
+ if (sizeof($this->open_queries))
+ {
+ foreach ($this->open_queries as $i_query_id => $query_id)
+ {
+ @odbc_free_result($query_id);
+ }
+ }
+
+ return @odbc_close($this->db_connect_id);
+ }
+
function sql_return_on_error($fail = false)
{
$this->return_on_error = $fail;
@@ -63,295 +90,318 @@ class sql_db
return $this->num_queries;
}
- //
- // Other base methods
- //
- function sql_close()
+ function sql_transaction($status = 'begin')
{
- if($this->db_connect_id)
- {
- if($this->in_transaction)
- {
- @odbc_commit($this->db_connect_id);
- }
-
- if(count($this->result_rowset))
- {
- unset($this->result_rowset);
- unset($this->field_names);
- unset($this->field_types);
- unset($this->num_rows);
- unset($this->current_row);
- }
-
- return @odbc_close($this->db_connect_id);
- }
- else
+ switch ($status)
{
- return false;
+ case 'begin':
+ $result = @odbc_autocommit($this->db_connect_id, false);
+ $this->transaction = true;
+ break;
+
+ case 'commit':
+ $result = @odbc_commit($this->db_connect_id);
+ @odbc_autocommit($this->db_connect_id, true);
+ $this->transaction = false;
+ break;
+
+ case 'rollback':
+ $result = @odbc_rollback($this->db_connect_id);
+ @odbc_autocommit($this->db_connect_id, true);
+ $this->transaction = false;
+ break;
+
+ default:
+ $result = true;
}
+
+ return $result;
}
- //
- // Query method
- //
- function sql_query($query = "", $transaction = FALSE)
+ // Base query method
+ function sql_query($query = '', $cache_ttl = 0)
{
- if($query != "")
+ if ($query != '')
{
- $this->num_queries++;
+ global $cache;
- if($transaction == BEGIN_TRANSACTION && !$this->in_transaction)
+ // EXPLAIN only in extra debug mode
+ if (defined('DEBUG_EXTRA'))
{
- if(!odbc_autocommit($this->db_connect_id, false))
- {
- return false;
- }
- $this->in_transaction = TRUE;
+ $this->sql_report('start', $query);
}
- if(preg_match("/^SELECT(.*?)(LIMIT ([0-9]+)[, ]*([0-9]+)*)?$/s", $query, $limits))
+ $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
+
+ if (!$this->query_result)
{
- $query = $limits[1];
+ $this->num_queries++;
- if(!empty($limits[2]))
+ if (($this->query_result = $this->_odbc_execute_query($query)) === false)
{
- $row_offset = ($limits[4]) ? $limits[3] : "";
- $num_rows = ($limits[4]) ? $limits[4] : $limits[3];
+ $this->sql_error($query);
+ }
- $query = "TOP " . ($row_offset + $num_rows) . $query;
+ if (defined('DEBUG_EXTRA'))
+ {
+ $this->sql_report('stop', $query);
}
- $this->result = odbc_exec($this->db_connect_id, "SELECT $query");
+ if ($cache_ttl && method_exists($cache, 'sql_save'))
+ {
+ $this->open_queries[(int) $this->query_result] = $this->query_result;
+ $cache->sql_save($query, $this->query_result, $cache_ttl);
+ // odbc_free_result called within sql_save()
+ }
+ else if (strpos($query, 'SELECT') !== false && $this->query_result)
+ {
+ $this->open_queries[(int) $this->query_result] = $this->query_result;
+ }
+ }
+ else if (defined('DEBUG_EXTRA'))
+ {
+ $this->sql_report('fromcache', $query);
+ }
+ }
+ else
+ {
+ return false;
+ }
- if($this->result)
+ return ($this->query_result) ? $this->query_result : false;
+ }
+
+ function _odbc_execute_query($query)
+ {
+ $result = false;
+
+ if (eregi("^SELECT ", $query))
+ {
+ $result = @odbc_exec($this->db_connect_id, $query);
+
+ if ($result)
+ {
+ if (empty($this->field_names[$result]))
{
- if(empty($this->field_names[$this->result]))
+ for ($i = 1, $j = @odbc_num_fields($result) + 1; $i < $j; $i++)
{
- for($i = 1; $i < odbc_num_fields($this->result) + 1; $i++)
- {
- $this->field_names[$this->result][] = odbc_field_name($this->result, $i);
- $this->field_types[$this->result][] = odbc_field_type($this->result, $i);
- }
+ $this->field_names[$result][] = @odbc_field_name($result, $i);
+ $this->field_types[$result][] = @odbc_field_type($result, $i);
}
+ }
- $this->current_row[$this->result] = 0;
- $this->result_rowset[$this->result] = array();
+ $this->current_row[$result] = 0;
+ $this->result_rowset[$result] = array();
- $row_outer = (isset($row_offset)) ? $row_offset + 1 : 1;
- $row_outer_max = (isset($num_rows)) ? $row_offset + $num_rows + 1 : 1E9;
- $row_inner = 0;
+ $row_outer = (isset($row_offset)) ? $row_offset + 1 : 1;
+ $row_outer_max = (isset($num_rows)) ? $row_offset + $num_rows + 1 : 1E9;
+ $row_inner = 0;
- while(odbc_fetch_row($this->result, $row_outer) && $row_outer < $row_outer_max)
+ while (@odbc_fetch_row($result, $row_outer) && $row_outer < $row_outer_max)
+ {
+ for ($i = 0, $j = sizeof($this->field_names[$result]); $i < $j; $i++)
{
- for($j = 0; $j < count($this->field_names[$this->result]); $j++)
- {
- $this->result_rowset[$this->result][$row_inner][$this->field_names[$this->result][$j]] = stripslashes(odbc_result($this->result, $j + 1));
- }
-
- $row_outer++;
- $row_inner++;
+ $this->result_rowset[$result][$row_inner][$this->field_names[$result][$i]] = stripslashes(@odbc_result($result, $i + 1));
}
- $this->num_rows[$this->result] = count($this->result_rowset[$this->result]);
+ $row_outer++;
+ $row_inner++;
}
+ $this->num_rows[$result] = sizeof($this->result_rowset[$result]);
}
- else if(eregi("^INSERT ", $query))
- {
- $this->result = odbc_exec($this->db_connect_id, $query);
+ }
+ else if (eregi("^INSERT ", $query))
+ {
+ $result = @odbc_exec($this->db_connect_id, $query);
- if($this->result)
+ if ($result)
+ {
+ $result_id = @odbc_exec($this->db_connect_id, 'SELECT @@IDENTITY');
+ if ($result_id)
{
- $result_id = odbc_exec($this->db_connect_id, "SELECT @@IDENTITY");
- if($result_id)
+ if (@odbc_fetch_row($result_id))
{
- if(odbc_fetch_row($result_id))
- {
- $this->next_id[$this->db_connect_id] = odbc_result($result_id, 1);
- $this->affected_rows[$this->db_connect_id] = odbc_num_rows($this->result);
- }
+ $this->next_id[$this->db_connect_id] = @odbc_result($result_id, 1);
+ $this->affected_rows[$this->db_connect_id] = @odbc_num_rows($result);
}
}
}
- else
- {
- $this->result = odbc_exec($this->db_connect_id, $query);
+ }
+ else
+ {
+ $result = @odbc_exec($this->db_connect_id, $query);
- if($this->result)
- {
- $this->affected_rows[$this->db_connect_id] = odbc_num_rows($this->result);
- }
+ if ($result)
+ {
+ $this->affected_rows[$this->db_connect_id] = @odbc_num_rows($result);
}
+ }
- if(!$this->result)
- {
- if($this->in_transaction)
- {
- odbc_rollback($this->db_connect_id);
- odbc_autocommit($this->db_connect_id, true);
- $this->in_transaction = FALSE;
- }
+ return $result;
+ }
+
+ function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
+ {
+ if ($query != '')
+ {
+ $this->query_result = false;
- return false;
+ // if $total is set to 0 we do not want to limit the number of rows
+ if ($total == 0)
+ {
+ $total = -1;
}
- if($transaction == END_TRANSACTION && $this->in_transaction)
+ $row_offset = ($total) ? $offset : '';
+ $num_rows = ($total) ? $total : $offset;
+
+ $query = 'SELECT TOP ' . ($row_offset + $num_rows) . ' ' . preg_replace('/^SELECT/', '', $query);
+
+ return $this->sql_query($query, $cache_ttl);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Idea for this from Ikonboard
+ function sql_build_array($query, $assoc_ary = false)
+ {
+ if (!is_array($assoc_ary))
+ {
+ return false;
+ }
+
+ $fields = array();
+ $values = array();
+ if ($query == 'INSERT')
+ {
+ foreach ($assoc_ary as $key => $var)
{
- $this->in_transaction = FALSE;
+ $fields[] = $key;
- if (!odbc_commit($this->db_connect_id))
+ if (is_null($var))
{
- odbc_rollback($this->db_connect_id);
- odbc_autocommit($this->db_connect_id, true);
- return false;
+ $values[] = 'NULL';
+ }
+ elseif (is_string($var))
+ {
+ $values[] = "'" . $this->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
}
- odbc_autocommit($this->db_connect_id, true);
}
- odbc_free_result($this->result);
-
- return $this->result;
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
}
- else
+ else if ($query == 'UPDATE' || $query == 'SELECT')
{
- if($transaction == END_TRANSACTION && $this->in_transaction)
+ $values = array();
+ foreach ($assoc_ary as $key => $var)
{
- $this->in_transaction = FALSE;
-
- if (!@odbc_commit($this->db_connect_id))
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ elseif (is_string($var))
+ {
+ $values[] = "$key = '" . $this->sql_escape($var) . "'";
+ }
+ else
{
- odbc_rollback($this->db_connect_id);
- odbc_autocommit($this->db_connect_id, true);
- return false;
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
}
- odbc_autocommit($this->db_connect_id, true);
}
-
- return true;
+ $query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values);
}
+
+ return $query;
}
- //
// Other query methods
//
- function sql_numrows($query_id = 0)
+ // NOTE :: Want to remove _ALL_ reliance on sql_numrows from core code ...
+ // don't want this here by a middle Milestone
+ function sql_numrows($query_id = false)
{
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- return ($query_id) ? $this->num_rows[$query_id] : false;
+ return ($query_id) ? @$this->num_rows($query_id) : false;
}
- function sql_numfields($query_id = 0)
+ function sql_affectedrows()
{
- if(!$query_id)
- {
- $query_id = $this->result;
- }
-
- return ($query_id) ? count($this->field_names[$query_id]) : false;
+ return ($this->affected_rows[$this->db_connect_id]) ? $this->affected_rows[$this->db_connect_id] : false;
}
- function sql_fieldname($offset, $query_id = 0)
+ function sql_fetchrow($query_id = false)
{
- if(!$query_id)
- {
- $query_id = $this->result;
- }
+ global $cache;
- return ($query_id) ? $this->field_names[$query_id][$offset] : false;
- }
-
- function sql_fieldtype($offset, $query_id = 0)
- {
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- return ($query_id) ? $this->field_types[$query_id][$offset] : false;
- }
-
- function sql_fetchrow($query_id = 0)
- {
- if(!$query_id)
+ if (isset($cache->sql_rowset[$query_id]))
{
- $query_id = $this->result;
+ return $cache->sql_fetchrow($query_id);
}
- if($query_id)
- {
- return ($this->num_rows[$query_id] && $this->current_row[$query_id] < $this->num_rows[$query_id]) ? $this->result_rowset[$query_id][$this->current_row[$query_id]++] : false;
- }
- else
- {
- return false;
- }
+ return ($this->num_rows[$query_id] && $this->current_row[$query_id] < $this->num_rows[$query_id]) ? $this->result_rowset[$query_id][$this->current_row[$query_id]++] : false;
}
- function sql_fetchrowset($query_id = 0)
+ function sql_fetchrowset($query_id = false)
{
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- if($query_id)
- {
- return ($this->num_rows[$query_id]) ? $this->result_rowset[$query_id] : false;
- }
- else
- {
- return false;
- }
+ return ($this->num_rows[$query_id]) ? $this->result_rowset[$query_id] : false;
}
- function sql_fetchfield($field, $row = -1, $query_id = 0)
+ function sql_fetchfield($field, $rownum = -1, $query_id = false)
{
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- if($query_id)
+ if ($query_id)
{
- if($row < $this->num_rows[$query_id])
+ if ($row < $this->num_rows[$query_id])
{
$getrow = ($row == -1) ? $this->current_row[$query_id] - 1 : $row;
return $this->result_rowset[$query_id][$getrow][$this->field_names[$query_id][$field]];
-
- }
- else
- {
- return false;
}
}
- else
- {
- return false;
- }
+
+ return false;
}
- function sql_rowseek($offset, $query_id = 0)
+ function sql_rowseek($rownum, $query_id = false)
{
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- if($query_id)
+ if (isset($this->current_row[$query_id]))
{
$this->current_row[$query_id] = $offset - 1;
return true;
}
- else
- {
- return false;
- }
+
+ return false;
}
function sql_nextid()
@@ -359,33 +409,69 @@ class sql_db
return ($this->next_id[$this->db_connect_id]) ? $this->next_id[$this->db_connect_id] : false;
}
- function sql_affectedrows()
+ function sql_numfields($query_id = false)
{
- return ($this->affected_rows[$this->db_connect_id]) ? $this->affected_rows[$this->db_connect_id] : false;
+ if (!$query_id)
+ {
+ $query_id = $this->query_result;
+ }
+
+ return ($query_id) ? sizeof($this->field_names[$query_id]) : false;
}
- function sql_freeresult($query_id = 0)
+ function sql_fieldname($offset, $query_id = false)
{
- if(!$query_id)
+ if (!$query_id)
{
- $query_id = $this->result;
+ $query_id = $this->query_result;
}
- unset($this->num_rows[$query_id]);
- unset($this->current_row[$query_id]);
- unset($this->result_rowset[$query_id]);
- unset($this->field_names[$query_id]);
- unset($this->field_types[$query_id]);
+ return ($query_id) ? $this->field_names[$query_id][$offset] : false;
+ }
- return true;
+ function sql_fieldtype($offset, $query_id = false)
+ {
+ if (!$query_id)
+ {
+ $query_id = $this->query_result;
+ }
+
+ return ($query_id) ? $this->field_types[$query_id][$offset] : false;
+ }
+
+ function sql_freeresult($query_id = false)
+ {
+ if (!$query_id)
+ {
+ $query_id = $this->query_result;
+ }
+
+ if (isset($this->open_queries[(int) $query_id]))
+ {
+ unset($this->open_queries[(int) $query_id]);
+ unset($this->num_rows[$query_id]);
+ unset($this->current_row[$query_id]);
+ unset($this->result_rowset[$query_id]);
+ unset($this->field_names[$query_id]);
+ unset($this->field_types[$query_id]);
+
+ return @odbc_free_result($query_id);
+ }
+
+ return false;
+ }
+
+ function sql_escape($msg)
+ {
+ return $msg;
}
function sql_error($sql = '')
{
if (!$this->return_on_error)
{
- $this_page = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : $_ENV['PHP_SELF'];
- $this_page .= '&' . ((!empty($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : $_ENV['QUERY_STRING']);
+ $this_page = (isset($_SERVER['PHP_SELF']) && !empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : $_ENV['PHP_SELF'];
+ $this_page .= '&' . ((isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : (isset($_ENV['QUERY_STRING']) ? $_ENV['QUERY_STRING'] : ''));
$message = '<u>SQL ERROR</u> [ ' . SQL_LAYER . ' ]<br /><br />' . @odbc_errormsg() . '<br /><br /><u>CALLING PAGE</u><br /><br />' . htmlspecialchars($this_page) . (($sql != '') ? '<br /><br /><u>SQL</u><br /><br />' . $sql : '') . '<br />';
@@ -393,7 +479,7 @@ class sql_db
{
$this->sql_transaction('rollback');
}
-
+
trigger_error($message, E_USER_ERROR);
}
@@ -405,6 +491,155 @@ class sql_db
return $result;
}
+ function sql_report($mode, $query = '')
+ {
+ if (empty($_GET['explain']))
+ {
+ return;
+ }
+
+ global $db, $cache, $starttime, $phpbb_root_path;
+ static $curtime, $query_hold, $html_hold;
+ static $sql_report = '';
+ static $cache_num_queries = 0;
+
+ if (!$query && !empty($query_hold))
+ {
+ $query = $query_hold;
+ }
+
+ switch ($mode)
+ {
+ case 'display':
+ if (!empty($cache))
+ {
+ $cache->unload();
+ }
+ $db->sql_close();
+
+ $mtime = explode(' ', microtime());
+ $totaltime = $mtime[0] + $mtime[1] - $starttime;
+
+ echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8869-1"><meta http-equiv="Content-Style-Type" content="text/css"><link rel="stylesheet" href="' . $phpbb_root_path . 'adm/subSilver.css" type="text/css"><style type="text/css">' . "\n";
+ echo 'th { background-image: url(\'' . $phpbb_root_path . 'adm/images/cellpic3.gif\') }' . "\n";
+ echo 'td.cat { background-image: url(\'' . $phpbb_root_path . 'adm/images/cellpic1.gif\') }' . "\n";
+ echo '</style><title>' . $msg_title . '</title></head><body>';
+ echo '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td><a href="' . htmlspecialchars(preg_replace('/&explain=([^&]*)/', '', $_SERVER['REQUEST_URI'])) . '"><img src="' . $phpbb_root_path . 'adm/images/header_left.jpg" width="200" height="60" alt="phpBB Logo" title="phpBB Logo" border="0"/></a></td><td width="100%" background="' . $phpbb_root_path . 'adm/images/header_bg.jpg" height="60" align="right" nowrap="nowrap"><span class="maintitle">SQL Report</span> &nbsp; &nbsp; &nbsp;</td></tr></table><br clear="all"/><table width="95%" cellspacing="1" cellpadding="4" border="0" align="center"><tr><td height="40" align="center" valign="middle"><b>Page generated in ' . round($totaltime, 4) . " seconds with {$this->num_queries} queries" . (($cache_num_queries) ? " + $cache_num_queries " . (($cache_num_queries == 1) ? 'query' : 'queries') . ' returning data from cache' : '') . '</b></td></tr><tr><td align="center" nowrap="nowrap">Time spent on MSSQL queries: <b>' . round($this->sql_time, 5) . 's</b> | Time spent on PHP: <b>' . round($totaltime - $this->sql_time, 5) . 's</b></td></tr></table><table width="95%" cellspacing="1" cellpadding="4" border="0" align="center"><tr><td>';
+ echo $sql_report;
+ echo '</td></tr></table><br /></body></html>';
+ exit;
+ break;
+
+ case 'start':
+ $query_hold = $query;
+ $html_hold = '';
+
+ $explain_query = $query;
+ if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
+ {
+ $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
+ }
+ elseif (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
+ {
+ $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
+ }
+
+ if (preg_match('/^SELECT/', $explain_query))
+ {
+ $html_table = FALSE;
+
+ @odbc_exec($this->db_connect_id, 'SET SHOWPLAN_ALL ON');
+
+ if ($result = $this->_odbc_execute_query($explain_query))
+ {
+ while ($row = $this->sql_fetchrow($result))
+ {
+ if (!$html_table && count($row))
+ {
+ $html_table = TRUE;
+ $html_hold .= '<table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0" align="center"><tr>';
+
+ foreach (array_keys($row) as $val)
+ {
+ $html_hold .= '<th nowrap="nowrap">' . (($val) ? ucwords(str_replace('_', ' ', $val)) : '&nbsp;') . '</th>';
+ }
+ $html_hold .= '</tr>';
+ }
+ $html_hold .= '<tr>';
+
+ $class = 'row1';
+ foreach (array_values($row) as $val)
+ {
+ $class = ($class == 'row1') ? 'row2' : 'row1';
+ $html_hold .= '<td class="' . $class . '">' . (($val) ? $val : '&nbsp;') . '</td>';
+ }
+ $html_hold .= '</tr>';
+ }
+ $this->sql_freeresult($result);
+ }
+
+ @odbc_exec($this->db_connect_id, 'SET SHOWPLAN_ALL OFF');
+
+ if ($html_table)
+ {
+ $html_hold .= '</table>';
+ }
+ }
+
+ $curtime = explode(' ', microtime());
+ $curtime = $curtime[0] + $curtime[1];
+ break;
+
+ case 'fromcache':
+ $endtime = explode(' ', microtime());
+ $endtime = $endtime[0] + $endtime[1];
+
+ $result = $this->_odbc_execute_query($query);
+ $splittime = explode(' ', microtime());
+ $splittime = $splittime[0] + $splittime[1];
+
+ $time_cache = $endtime - $curtime;
+ $time_db = $splittime - $endtime;
+ $color = ($time_db > $time_cache) ? 'green' : 'red';
+
+ $sql_report .= '<hr width="100%"/><br /><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0"><tr><th>Query results obtained from the cache</th></tr><tr><td class="row1"><textarea style="font-family:\'Courier New\',monospace;width:100%" rows="5">' . preg_replace('/\t(AND|OR)(\W)/', "\$1\$2", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n", $query))) . '</textarea></td></tr></table><p align="center">';
+
+ $sql_report .= 'Before: ' . sprintf('%.5f', $curtime - $starttime) . 's | After: ' . sprintf('%.5f', $endtime - $starttime) . 's | Elapsed [cache]: <b style="color: ' . $color . '">' . sprintf('%.5f', ($time_cache)) . 's</b> | Elapsed [db]: <b>' . sprintf('%.5f', $time_db) . 's</b></p>';
+
+ // Pad the start time to not interfere with page timing
+ $starttime += $time_db;
+
+ $this->sql_freeresult($result);
+ $cache_num_queries++;
+ break;
+
+ case 'stop':
+ $endtime = explode(' ', microtime());
+ $endtime = $endtime[0] + $endtime[1];
+
+ $sql_report .= '<hr width="100%"/><br /><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0"><tr><th>Query #' . $this->num_queries . '</th></tr><tr><td class="row1"><textarea style="font-family:\'Courier New\',monospace;width:100%" rows="5">' . preg_replace('/\t(AND|OR)(\W)/', "\$1\$2", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n", $query))) . '</textarea></td></tr></table> ' . $html_hold . '<p align="center">';
+
+ if ($this->query_result)
+ {
+ if (preg_match('/^(UPDATE|DELETE|REPLACE)/', $query))
+ {
+ $sql_report .= "Affected rows: <b>" . $this->sql_affectedrows($this->query_result) . '</b> | ';
+ }
+ $sql_report .= 'Before: ' . sprintf('%.5f', $curtime - $starttime) . 's | After: ' . sprintf('%.5f', $endtime - $starttime) . 's | Elapsed: <b>' . sprintf('%.5f', $endtime - $curtime) . 's</b>';
+ }
+ else
+ {
+ $error = $this->sql_error();
+ $sql_report .= '<b style="color: red">FAILED</b> - MSSQL Error ' . $error['code'] . ': ' . htmlspecialchars($error['message']);
+ }
+
+ $sql_report .= '</p>';
+
+ $this->sql_time += $endtime - $curtime;
+ break;
+ }
+ }
+
} // class sql_db
} // if ... define
diff --git a/phpBB/includes/db/mysql.php b/phpBB/includes/db/mysql.php
index 6cf0b07126..ec9f17bf27 100644
--- a/phpBB/includes/db/mysql.php
+++ b/phpBB/includes/db/mysql.php
@@ -254,7 +254,7 @@ class sql_db
return ($this->db_connect_id) ? @mysql_affected_rows($this->db_connect_id) : false;
}
- function sql_fetchrow($query_id = 0)
+ function sql_fetchrow($query_id = false)
{
global $cache;
@@ -273,7 +273,7 @@ class sql_db
return ($query_id) ? @mysql_fetch_assoc($query_id) : false;
}
- function sql_fetchrowset($query_id = 0)
+ function sql_fetchrowset($query_id = false)
{
if (!$query_id)
{
@@ -292,7 +292,7 @@ class sql_db
return false;
}
- function sql_fetchfield($field, $rownum = -1, $query_id = 0)
+ function sql_fetchfield($field, $rownum = -1, $query_id = false)
{
if (!$query_id)
{
@@ -330,7 +330,7 @@ class sql_db
return false;
}
- function sql_rowseek($rownum, $query_id = 0)
+ function sql_rowseek($rownum, $query_id = false)
{
if (!$query_id)
{
diff --git a/phpBB/includes/db/mysql4.php b/phpBB/includes/db/mysql4.php
index 92f70182be..85008673ef 100644
--- a/phpBB/includes/db/mysql4.php
+++ b/phpBB/includes/db/mysql4.php
@@ -57,6 +57,11 @@ class sql_db
return false;
}
+ if ($this->transaction)
+ {
+ @mysqli_commit($this->db_connect_id);
+ }
+
return @mysqli_close($this->db_connect_id);
}
@@ -81,11 +86,13 @@ class sql_db
case 'commit':
$result = @mysqli_commit($this->db_connect_id);
+ @mysqli_autocommit($this->db_connect_id, true);
$this->transaction = false;
break;
case 'rollback':
$result = @mysqli_rollback($this->db_connect_id);
+ @mysqli_autocommit($this->db_connect_id, true);
$this->transaction = false;
break;
@@ -244,7 +251,7 @@ class sql_db
return ($this->db_connect_id) ? @mysqli_affected_rows($this->db_connect_id) : false;
}
- function sql_fetchrow($query_id = 0)
+ function sql_fetchrow($query_id = false)
{
global $cache;
@@ -261,7 +268,7 @@ class sql_db
return ($query_id) ? @mysqli_fetch_assoc($query_id) : false;
}
- function sql_fetchrowset($query_id = 0)
+ function sql_fetchrowset($query_id = false)
{
if (!$query_id)
{
@@ -280,7 +287,7 @@ class sql_db
return false;
}
- function sql_fetchfield($field, $rownum = -1, $query_id = 0)
+ function sql_fetchfield($field, $rownum = -1, $query_id = false)
{
if (!$query_id)
{
@@ -320,7 +327,7 @@ class sql_db
return false;
}
- function sql_rowseek($rownum, $query_id = 0)
+ function sql_rowseek($rownum, $query_id = false)
{
if (!$query_id)
{
diff --git a/phpBB/install/install.php b/phpBB/install/install.php
index 7e0af23e9a..cf18d6f6bf 100644
--- a/phpBB/install/install.php
+++ b/phpBB/install/install.php
@@ -268,6 +268,10 @@ else if (isset($_POST['dldone']))
// simple task ... well ... uhm
if (filesize($phpbb_root_path . 'config.'.$phpEx) < 10)
{
+ $stage = 2;
+ }
+ else
+ {
$stage = 3;
}
}
diff --git a/phpBB/install/schemas/mssql_schema.sql b/phpBB/install/schemas/mssql_schema.sql
index 899a796ed5..7fd24a8de6 100644
--- a/phpBB/install/schemas/mssql_schema.sql
+++ b/phpBB/install/schemas/mssql_schema.sql
@@ -497,7 +497,7 @@ CREATE TABLE [phpbb_search_results] (
GO
CREATE TABLE [phpbb_search_wordlist] (
- [word_text] [varbinary] (50) NOT NULL ,
+ [word_text] [nvarchar] (50) NOT NULL ,
[word_id] [int] IDENTITY (1, 1) NOT NULL ,
[word_common] [int] NOT NULL
) ON [PRIMARY]
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index b5e935fe44..85b1f5b8b6 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -352,9 +352,9 @@ INSERT INTO phpbb_lang (lang_id, lang_iso, lang_dir, lang_english_name, lang_loc
# MSSQL IDENTITY phpbb_forums ON #
# -- Forums
-INSERT INTO phpbb_forums (forum_id, forum_name, forum_desc, left_id, right_id, parent_id, forum_type, forum_posts, forum_topics, forum_topics_real, forum_last_post_id, forum_last_poster_id, forum_last_poster_name, forum_last_post_time) VALUES (1, 'My first Category', '', 1, 4, 0, 0, 1, 1, 1, 1, 2, 'Admin', 972086460);
+INSERT INTO phpbb_forums (forum_id, forum_name, forum_desc, left_id, right_id, parent_id, forum_type, forum_posts, forum_topics, forum_topics_real, forum_last_post_id, forum_last_poster_id, forum_last_poster_name, forum_last_post_time, forum_link, forum_password, forum_image, forum_rules, forum_rules_link, forum_rules_bbcode_uid) VALUES (1, 'My first Category', '', 1, 4, 0, 0, 1, 1, 1, 1, 2, 'Admin', 972086460, '', '', '', '', '', '');
-INSERT INTO phpbb_forums (forum_id, forum_name, forum_desc, left_id, right_id, parent_id, forum_type, forum_posts, forum_topics, forum_topics_real, forum_last_post_id, forum_last_poster_id, forum_last_poster_name, forum_last_post_time) VALUES (2, 'Test Forum 1', 'This is just a test forum.', 2, 3, 1, 1, 1, 1, 1, 1, 2, 'Admin', 972086460);
+INSERT INTO phpbb_forums (forum_id, forum_name, forum_desc, left_id, right_id, parent_id, forum_type, forum_posts, forum_topics, forum_topics_real, forum_last_post_id, forum_last_poster_id, forum_last_poster_name, forum_last_post_time, forum_link, forum_password, forum_image, forum_rules, forum_rules_link, forum_rules_bbcode_uid) VALUES (2, 'Test Forum 1', 'This is just a test forum.', 2, 3, 1, 1, 1, 1, 1, 1, 2, 'Admin', 972086460, '', '', '', '', '', '');
# MSSQL IDENTITY phpbb_forums OFF #
@@ -362,16 +362,16 @@ INSERT INTO phpbb_forums (forum_id, forum_name, forum_desc, left_id, right_id, p
# MSSQL IDENTITY phpbb_users ON #
# -- Users
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_email, user_lang, user_style) VALUES (1, 2, 1, 'Anonymous', 0, '', '', 'en', 1);
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_email, user_lang, user_style, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_colour, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd) VALUES (1, 2, 1, 'Anonymous', 0, '', '', 'en', 1, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
# -- username: Admin password: admin (change this or remove it ON #ce everything is working!)
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_email, user_lang, user_style, user_rank, user_colour, user_posts) VALUES (2, 3, 7, 'Admin', 0, '21232f297a57a5a743894a0e4a801fc3', 'admin@yourdomain.com', 'en', 1, 1, 'AA0000', 1);
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_email, user_lang, user_style, user_rank, user_colour, user_posts, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd) VALUES (2, 3, 7, 'Admin', 0, '21232f297a57a5a743894a0e4a801fc3', 'admin@yourdomain.com', 'en', 1, 1, 'AA0000', 1, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
# -- bots
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour) VALUES (3, 2, 8, 'Googlebot', 0, '', 'en', 1, 1, '9E8DA7');
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour) VALUES (4, 2, 8, 'Fastcrawler', 0, '', 'en', 1, 1, '9E8DA7');
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour) VALUES (5, 2, 8, 'Alexa', 0, '', 'en', 1, 1, '9E8DA7');
-INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour) VALUES (6, 2, 8, 'Inktomi', 0, '', 'en', 1, 1, '9E8DA7');
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd, user_email) VALUES (3, 2, 8, 'Googlebot', 0, '', 'en', 1, 1, '9E8DA7', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd, user_email) VALUES (4, 2, 8, 'Fastcrawler', 0, '', 'en', 1, 1, '9E8DA7', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd, user_email) VALUES (5, 2, 8, 'Alexa', 0, '', 'en', 1, 1, '9E8DA7', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
+INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, user_password, user_lang, user_style, user_rank, user_colour, user_permissions, user_ip, user_birthday, user_lastpage, user_last_confirm_key, user_sortby_type, user_sortby_dir, user_avatar, user_sig, user_sig_bbcode_uid, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_actkey, user_newpasswd, user_email) VALUES (6, 2, 8, 'Inktomi', 0, '', 'en', 1, 1, '9E8DA7', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
# MSSQL IDENTITY phpbb_users OFF #
@@ -379,14 +379,14 @@ INSERT INTO phpbb_users (user_id, user_type, group_id, username, user_regdate, u
# MSSQL IDENTITY phpbb_groups ON #
# -- Groups
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_legend) VALUES (1, 'GUESTS', 3, 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_legend) VALUES (2, 'INACTIVE', 3, 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_legend) VALUES (3, 'INACTIVE_COPPA', 3, 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_legend) VALUES (4, 'REGISTERED', 3, 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_legend) VALUES (5, 'REGISTERED_COPPA', 3, 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend) VALUES (6, 'SUPER_MODERATORS', 3, '00AA00', 0);
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour) VALUES (7, 'ADMINISTRATORS', 3, 'AA0000');
-INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour) VALUES (8, 'BOTS', 3, '9E8DA7');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (1, 'GUESTS', 3, '', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (2, 'INACTIVE', 3, '', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (3, 'INACTIVE_COPPA', 3, '', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (4, 'REGISTERED', 3, '', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (5, 'REGISTERED_COPPA', 3, '', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (6, 'SUPER_MODERATORS', 3, '00AA00', 0, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (7, 'ADMINISTRATORS', 3, 'AA0000', 1, '', '');
+INSERT INTO phpbb_groups (group_id, group_name, group_type, group_colour, group_legend, group_avatar, group_description) VALUES (8, 'BOTS', 3, '9E8DA7', 1, '', '');
# MSSQL IDENTITY phpbb_groups OFF #
@@ -477,13 +477,13 @@ INSERT INTO phpbb_auth_groups (group_id, forum_id, auth_option_id, auth_setting)
# -- Moderator cache
-INSERT INTO phpbb_moderator_cache (user_id, forum_id, username) VALUES (2, 2, 'Admin');
+INSERT INTO phpbb_moderator_cache (user_id, forum_id, username, groupname) VALUES (2, 2, 'Admin', 'Administrators');
# MSSQL IDENTITY phpbb_topics ON #
# -- Demo Topic
-INSERT INTO phpbb_topics (topic_id, topic_title, topic_poster, topic_time, topic_views, topic_replies, topic_replies_real, forum_id, topic_status, topic_type, topic_first_post_id, topic_first_poster_name, topic_last_post_id, topic_last_poster_id, topic_last_poster_name, topic_last_post_time, topic_last_view_time) VALUES (1, 'Welcome to phpBB 2', 2, 972086460, 0, 0, 0, 2, 0, 0, 1, 'Admin', 1, 2, 'Admin', 972086460, 972086460);
+INSERT INTO phpbb_topics (topic_id, topic_title, topic_poster, topic_time, topic_views, topic_replies, topic_replies_real, forum_id, topic_status, topic_type, topic_first_post_id, topic_first_poster_name, topic_last_post_id, topic_last_poster_id, topic_last_poster_name, topic_last_post_time, topic_last_view_time, poll_title) VALUES (1, 'Welcome to phpBB 2', 2, 972086460, 0, 0, 0, 2, 0, 0, 1, 'Admin', 1, 2, 'Admin', 972086460, 972086460, '');
# MSSQL IDENTITY phpbb_topics OFF #
@@ -491,7 +491,7 @@ INSERT INTO phpbb_topics (topic_id, topic_title, topic_poster, topic_time, topic
# MSSQL IDENTITY phpbb_posts ON #
# -- Demo Post
-INSERT INTO phpbb_posts (post_id, topic_id, forum_id, poster_id, post_time, post_username, poster_ip, post_subject, post_text) VALUES (1, 1, 2, 2, 972086460, NULL, '127.0.0.1', 'Welcome to phpBB 2', 'This is an example post in your phpBB 2.2 installation. You may delete this post, this topic and even this forum if you like since everything seems to be working!');
+INSERT INTO phpbb_posts (post_id, topic_id, forum_id, poster_id, post_time, post_username, poster_ip, post_subject, post_text, post_checksum, bbcode_uid) VALUES (1, 1, 2, 2, 972086460, NULL, '127.0.0.1', 'Welcome to phpBB 2', 'This is an example post in your phpBB 2.2 installation. You may delete this post, this topic and even this forum if you like since everything seems to be working!', '', '');
# MSSQL IDENTITY phpbb_posts OFF #
@@ -554,8 +554,6 @@ INSERT INTO phpbb_search_wordlist (word_id, word_text, word_common) VALUES (12,
# MSSQL IDENTITY phpbb_search_wordlist OFF #
-# MSSQL IDENTITY phpbb_search_wordmatch ON #
-
# -- wordmatch
INSERT INTO phpbb_search_wordmatch (word_id, post_id, title_match) VALUES (1, 1, 0);
INSERT INTO phpbb_search_wordmatch (word_id, post_id, title_match) VALUES (2, 1, 0);
@@ -571,8 +569,6 @@ INSERT INTO phpbb_search_wordmatch (word_id, post_id, title_match) VALUES (11, 1
INSERT INTO phpbb_search_wordmatch (word_id, post_id, title_match) VALUES (12, 1, 1);
INSERT INTO phpbb_search_wordmatch (word_id, post_id, title_match) VALUES (3, 1, 1);
-# MSSQL IDENTITY phpbb_search_wordmatch OFF #
-
# MSSQL IDENTITY phpbb_reports_reasons ON #
@@ -587,12 +583,12 @@ INSERT INTO phpbb_reports_reasons (reason_id, reason_priority, reason_name, reas
# MSSQL IDENTITY phpbb_extension_groups ON #
# -- extension_groups
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (1, 'Images', 1, 1, 1, '', 0);
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (2, 'Archives', 0, 1, 1, '', 0);
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (3, 'Plain Text', 0, 0, 1, '', 0);
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (4, 'Documents', 0, 0, 1, '', 0);
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (5, 'Real Media', 3, 0, 2, '', 0);
-INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize) VALUES (6, 'Windows Media', 2, 0, 1, '', 0);
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (1, 'Images', 1, 1, 1, '', 0, '');
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (2, 'Archives', 0, 1, 1, '', 0, '');
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (3, 'Plain Text', 0, 0, 1, '', 0, '');
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (4, 'Documents', 0, 0, 1, '', 0, '');
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (5, 'Real Media', 3, 0, 2, '', 0, '');
+INSERT INTO phpbb_extension_groups (group_id, group_name, cat_id, allow_group, download_mode, upload_icon, max_filesize, allowed_forums) VALUES (6, 'Windows Media', 2, 0, 1, '', 0, '');
# MSSQL IDENTITY phpbb_extension_groups OFF #