aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes
diff options
context:
space:
mode:
authorDavid M <davidmj@users.sourceforge.net>2006-07-24 10:08:36 +0000
committerDavid M <davidmj@users.sourceforge.net>2006-07-24 10:08:36 +0000
commit9532514c2a566437a9524af1dfca298da58fd40a (patch)
tree95cd37ebfc723ae45216db69625a1858479c94ba /phpBB/includes
parent48b2dc127761640810a8bbd6c59fd3c5be696778 (diff)
downloadforums-9532514c2a566437a9524af1dfca298da58fd40a.tar
forums-9532514c2a566437a9524af1dfca298da58fd40a.tar.gz
forums-9532514c2a566437a9524af1dfca298da58fd40a.tar.bz2
forums-9532514c2a566437a9524af1dfca298da58fd40a.tar.xz
forums-9532514c2a566437a9524af1dfca298da58fd40a.zip
OK...
This commit should increase the total number of BBCodes from 31 to 2040. Some things to watch out for: Each database likes to deal with binary data in its own, special way. They are, quite frankly, too cool for school. MySQL, MSSQL and Oracle all allow me to send in a default value for their binary column using a hex number. However, MSSQL forces me to send the specific data as a hex number and thus we must CAST it. PostgreSQL allows me to set a binary column, but with a twist. It demands that the default be in _octal_ and its datatype allows somewhere around a gigabyte's worth of BBCodes ( PGSQL users, we shut you down to 2040 for your own good! ) Firebird has no decent mechanism for allowing me to shuttle in binary data so I must force my way in. By virtue of triggers and a UDF, we ram in our default values. SQLite is the most bizarre of them all. They have no mechanism for turning an ASCII code into a ASCII character. Because of this, we have a trigger and a UDF (just like Firebird!) but with a twist! The UDF is defined on the PHP side of things instead of SQL. SQLite also demands that it's data be encoded before being sent off. Other notes: - SQLite installs again :D - Firebird nearly installs again :P - Database backup is not screwed up :P P.S. I hope nothing broke :D git-svn-id: file:///svn/phpbb/trunk@6209 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/includes')
-rw-r--r--phpBB/includes/acp/acp_bbcodes.php2
-rw-r--r--phpBB/includes/acp/acp_database.php6
-rw-r--r--phpBB/includes/acp/acp_forums.php72
-rw-r--r--phpBB/includes/acp/acp_styles.php79
-rw-r--r--phpBB/includes/bbcode.php57
-rw-r--r--phpBB/includes/db/mssql.php2
-rw-r--r--phpBB/includes/db/sqlite.php27
-rw-r--r--phpBB/includes/functions.php96
-rw-r--r--phpBB/includes/functions_posting.php140
-rw-r--r--phpBB/includes/functions_privmsgs.php134
-rw-r--r--phpBB/includes/functions_user.php207
-rw-r--r--phpBB/includes/message_parser.php16
-rw-r--r--phpBB/includes/ucp/ucp_groups.php2
-rw-r--r--phpBB/includes/ucp/ucp_pm_compose.php2
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewmessage.php4
-rw-r--r--phpBB/includes/ucp/ucp_profile.php70
16 files changed, 854 insertions, 62 deletions
diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php
index 675048327a..cdb6fce1f8 100644
--- a/phpBB/includes/acp/acp_bbcodes.php
+++ b/phpBB/includes/acp/acp_bbcodes.php
@@ -164,7 +164,7 @@ class acp_bbcodes
$bbcode_id = NUM_CORE_BBCODES + 1;
}
- if ($bbcode_id > 31)
+ if ($bbcode_id > 2039)
{
trigger_error('TOO_MANY_BBCODES');
}
diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
index 52a9732e82..7fd959b104 100644
--- a/phpBB/includes/acp/acp_database.php
+++ b/phpBB/includes/acp/acp_database.php
@@ -210,11 +210,11 @@ class acp_database
case 'oracle':
case 'postgres':
case 'firebird':
- $sql_data .= 'TRUNCATE TABLE ' . $table_name . "\n";
+ $sql_data .= 'TRUNCATE TABLE ' . $table_name . ";\n";
break;
case 'sqlite':
- $sql_data .= 'DELETE FROM ' . $table_name . "\n";
+ $sql_data .= 'DELETE FROM ' . $table_name . ";\n";
break;
}
}
@@ -1686,7 +1686,7 @@ class acp_database
if ($row['COLUMN_DEFAULT'])
{
- $line .= ' CONSTRAINT [DF_' . $table_name . '_' . $row['COLUMN_NAME'] . '] DEFAULT ' . $row['COLUMN_DEFAULT'];
+ $line .= ' DEFAULT ' . $row['COLUMN_DEFAULT'];
}
$rows[] = $line;
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index 21f633f4f6..8542d44301 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -104,7 +104,7 @@ class acp_forums
'forum_rules' => request_var('forum_rules', '', true),
'forum_rules_uid' => '',
'forum_rules_options' => 0,
- 'forum_rules_bitfield' => 0,
+ 'forum_rules_bitfield' => '',
'forum_rules_link' => request_var('forum_rules_link', ''),
'forum_image' => request_var('forum_image', ''),
'forum_style' => request_var('forum_style', 0),
@@ -419,7 +419,7 @@ class acp_forums
{
// Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
$forum_data['forum_rules_uid'] = '';
- $forum_data['forum_rules_bitfield'] = 0;
+ $forum_data['forum_rules_bitfield'] = '';
$forum_data['forum_rules_options'] = 0;
generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_allow_bbcode', false), request_var('rules_allow_urls', false), request_var('rules_allow_smiliess', false));
@@ -439,7 +439,7 @@ class acp_forums
{
// Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
$forum_data['forum_desc_uid'] = '';
- $forum_data['forum_desc_bitfield'] = 0;
+ $forum_data['forum_desc_bitfield'] = '';
$forum_data['forum_desc_options'] = 0;
generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_allow_bbcode', false), request_var('desc_allow_urls', false), request_var('desc_allow_smiliess', false));
@@ -919,8 +919,72 @@ class acp_forums
$forum_id = $forum_data_sql['forum_id'];
unset($forum_data_sql['forum_id']);
+ $query = '';
+
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $values = array();
+ foreach ($forum_data_sql as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'forum_desc_bitfield' && $key != 'forum_rules_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ case 'sqlite':
+ $values = array();
+ foreach ($forum_data_sql as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'forum_desc_bitfield' && $key != 'forum_rules_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = '" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ default:
+ $query = $db->sql_build_array('UPDATE', $forum_data_sql);
+ break;
+ }
+
$sql = 'UPDATE ' . FORUMS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $forum_data_sql) . '
+ SET ' . $query . '
WHERE forum_id = ' . $forum_id;
$db->sql_query($sql);
diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php
index 92bd515f98..2e27995a81 100644
--- a/phpBB/includes/acp/acp_styles.php
+++ b/phpBB/includes/acp/acp_styles.php
@@ -27,7 +27,14 @@ class acp_styles
global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
// Hardcoded template bitfield to add for new templates
- define('TEMPLATE_BITFIELD', 6921);
+ $bitfield = new bitfield();
+ $bitfield->set(0);
+ $bitfield->set(3);
+ $bitfield->set(8);
+ $bitfield->set(9);
+ $bitfield->set(11);
+ $bitfield->set(12);
+ define('TEMPLATE_BITFIELD', $bitfield->data);
$user->add_lang('acp/styles');
@@ -2917,10 +2924,78 @@ pagination_sep = \'{PAGINATION_SEP}\'
unset($cfg_data);
}
+ $query = '';
+
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ case 'sqlite':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "'" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ default:
+ $query = $db->sql_build_array('INSERT', $sql_ary);
+ break;
+ }
+
$db->sql_transaction('begin');
$sql = "INSERT INTO $sql_from
- " . $db->sql_build_array('INSERT', $sql_ary);
+ " . $query;
$db->sql_query($sql);
$id = $db->sql_nextid();
diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php
index 680d17dd20..96efad10f8 100644
--- a/phpBB/includes/bbcode.php
+++ b/phpBB/includes/bbcode.php
@@ -15,7 +15,7 @@
class bbcode
{
var $bbcode_uid = '';
- var $bbcode_bitfield = 0;
+ var $bbcode_bitfield = '';
var $bbcode_cache = array();
var $bbcode_template = array();
@@ -69,32 +69,31 @@ class bbcode
$str = array('search' => array(), 'replace' => array());
$preg = array('search' => array(), 'replace' => array());
- $bitlen = strlen(decbin($this->bbcode_bitfield));
- for ($bbcode_id = 0; $bbcode_id < $bitlen; ++$bbcode_id)
+ $bitfield = new bitfield($this->bbcode_bitfield);
+ $bbcodes_set = $bitfield->get_all_set();
+
+ foreach ($bbcodes_set as $bbcode_id)
{
- if ($this->bbcode_bitfield & (1 << $bbcode_id))
+ if (!empty($this->bbcode_cache[$bbcode_id]))
{
- if (!empty($this->bbcode_cache[$bbcode_id]))
+ foreach ($this->bbcode_cache[$bbcode_id] as $type => $array)
{
- foreach ($this->bbcode_cache[$bbcode_id] as $type => $array)
+ foreach ($array as $search => $replace)
{
- foreach ($array as $search => $replace)
- {
- ${$type}['search'][] = str_replace('$uid', $this->bbcode_uid, $search);
- ${$type}['replace'][] = $replace;
- }
+ ${$type}['search'][] = str_replace('$uid', $this->bbcode_uid, $search);
+ ${$type}['replace'][] = $replace;
+ }
- if (sizeof($str['search']))
- {
- $message = str_replace($str['search'], $str['replace'], $message);
- $str = array('search' => array(), 'replace' => array());
- }
+ if (sizeof($str['search']))
+ {
+ $message = str_replace($str['search'], $str['replace'], $message);
+ $str = array('search' => array(), 'replace' => array());
+ }
- if (sizeof($preg['search']))
- {
- $message = preg_replace($preg['search'], $preg['replace'], $message);
- $preg = array('search' => array(), 'replace' => array());
- }
+ if (sizeof($preg['search']))
+ {
+ $message = preg_replace($preg['search'], $preg['replace'], $message);
+ $preg = array('search' => array(), 'replace' => array());
}
}
}
@@ -129,9 +128,12 @@ class bbcode
$bbcode_ids = $rowset = array();
$bitlen = strlen(decbin($this->bbcode_bitfield));
- for ($bbcode_id = 0; $bbcode_id < $bitlen; ++$bbcode_id)
+ $bitfield = new bitfield($this->bbcode_bitfield);
+ $bbcodes_set = $bitfield->get_all_set();
+
+ foreach ($bbcodes_set as $bbcode_id)
{
- if (isset($this->bbcode_cache[$bbcode_id]) || !($this->bbcode_bitfield & (1 << $bbcode_id)))
+ if (isset($this->bbcode_cache[$bbcode_id]))
{
// do not try to re-cache it if it's already in
continue;
@@ -312,9 +314,13 @@ class bbcode
break;
default:
+ if (!isset($template_bitfield))
+ {
+ $template_bitfield = new bitfield($this->template_bitfield);
+ }
if (isset($rowset[$bbcode_id]))
{
- if ($this->template_bitfield & (1 << $bbcode_id))
+ if ($template_bitfield->get($bbcode_id))
{
// The bbcode requires a custom template to be loaded
if (!$bbcode_tpl = $this->bbcode_tpl($rowset[$bbcode_id]['bbcode_tag'], $bbcode_id))
@@ -390,9 +396,10 @@ class bbcode
'color' => '<span style="color: $1">$2</span>',
'email' => '<a href="mailto:$1">$2</a>'
);
+ $template_bitfield = new bitfield($this->template_bitfield);
}
- if ($bbcode_id != -1 && !($this->template_bitfield & (1 << $bbcode_id)))
+ if ($bbcode_id != -1 && !$template_bitfield->get($bbcode_id))
{
return (isset($bbcode_hardtpl[$tpl_name])) ? $bbcode_hardtpl[$tpl_name] : false;
}
diff --git a/phpBB/includes/db/mssql.php b/phpBB/includes/db/mssql.php
index efe0b4333d..6ef8597c18 100644
--- a/phpBB/includes/db/mssql.php
+++ b/phpBB/includes/db/mssql.php
@@ -243,7 +243,7 @@ class dbal_mssql extends dbal
{
foreach ($row as $key => $value)
{
- $row[$key] = ($value === ' ') ? '' : $value;
+ $row[$key] = ($value === ' ' && strpos($key, 'bitfield') === false) ? '' : $value;
}
}
diff --git a/phpBB/includes/db/sqlite.php b/phpBB/includes/db/sqlite.php
index 7b23171187..95f12175c3 100644
--- a/phpBB/includes/db/sqlite.php
+++ b/phpBB/includes/db/sqlite.php
@@ -47,6 +47,8 @@ class dbal_sqlite extends dbal
{
@sqlite_query('PRAGMA short_column_names = 1', $this->db_connect_id);
}
+
+ sqlite_create_function($this->db_connect_id, 'binary_insert', array('dbal_sqlite', '_sql_insert'), 1);
return ($this->db_connect_id) ? true : array('message' => $error);
}
@@ -328,6 +330,31 @@ class dbal_sqlite extends dbal
}
}
+ /**
+ * Build the proper binary string used for the default
+ * @access: private
+ */
+ function _sql_insert($mode)
+ {
+ if ($mode == 1)
+ {
+ $bitfield = new bitfield();
+ $bitfield->set(0);
+ $bitfield->set(3);
+ $bitfield->set(8);
+ $bitfield->set(9);
+ $bitfield->set(11);
+ $bitfield->set(12);
+ return sqlite_udf_encode_binary($bitfield->data);
+ }
+ /*
+ else
+ {
+ return sqlite_udf_encode_binary("\0");
+ }
+ */
+ }
+
}
} // if ... define
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index c5d5b2f2a3..d5355ca600 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -1857,7 +1857,7 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
global $phpbb_root_path, $phpEx;
$uid = '';
- $bitfield = 0;
+ $bitfield = '';
if (!$text)
{
@@ -2863,4 +2863,98 @@ function garbage_collection()
$db->sql_close();
}
+class bitfield
+{
+ var $data;
+
+ function bitfield($bitfield = '')
+ {
+ $this->data = $bitfield;
+ }
+
+ function get($n)
+ {
+ /**
+ * Get the ($n / 8)th char
+ */
+ $byte = $n >> 3;
+
+ if (!isset($this->data[$byte]))
+ {
+ /**
+ * Of course, if it doesn't exist then the result if FALSE
+ */
+ return FALSE;
+ }
+
+ $c = $this->data[$byte];
+
+ /**
+ * Lookup the ($n % 8)th bit of the byte
+ */
+ $bit = 7 - ($n & 7);
+ return (bool) (ord($c) & (1 << $bit));
+ }
+
+ function set($n)
+ {
+ $byte = $n >> 3;
+ $bit = 7 - ($n & 7);
+
+ if (isset($this->data[$byte]))
+ {
+ $this->data[$byte] = $this->data[$byte] | chr(1 << $bit);
+ }
+ else
+ {
+ if ($byte - strlen($this->data) > 0)
+ {
+ $this->data .= str_repeat("\0", $byte - strlen($this->data));
+ }
+ $this->data .= chr(1 << $bit);
+ }
+ }
+
+ function clear($n)
+ {
+ $byte = $n >> 3;
+
+ if (!isset($this->data[$byte]))
+ {
+ return;
+ }
+
+ $bit = 7 - ($n & 7);
+ $this->data[$byte] = $this->data[$byte] &~ chr(1 << $bit);
+ }
+
+ function get_blob()
+ {
+ return $this->data;
+ }
+
+ function get_bin()
+ {
+ $bin = '';
+ $len = strlen($this->data);
+
+ for ($i = 0; $i < $len; ++$i)
+ {
+ $bin .= str_pad(decbin(ord($this->data[$i])), 8, '0', STR_PAD_LEFT);
+ }
+
+ return $bin;
+ }
+
+ function get_all_set()
+ {
+ return array_keys(array_filter(str_split($this->get_bin())));
+ }
+
+ function merge($bitfield)
+ {
+ $this->data = $this->data | $bitfield->get_blob();
+ }
+}
+
?> \ No newline at end of file
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index d2ee32969b..d0567f5e76 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -832,11 +832,11 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
return false;
}
- $bbcode_bitfield = 0;
+ $bbcode_bitfield = '';
do
{
$rowset[] = $row;
- $bbcode_bitfield |= $row['bbcode_bitfield'];
+ $bbcode_bitfield = $bbcode_bitfield | $row['bbcode_bitfield'];
}
while ($row = $db->sql_fetchrow($result));
$db->sql_freeresult($result);
@@ -1537,8 +1537,76 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
);
}
- $sql = 'INSERT INTO ' . POSTS_TABLE . ' ' .
- $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
+ $query = '';
+
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $fields = array();
+ foreach ($sql_data[POSTS_TABLE]['sql'] as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ case 'sqlite':
+ $fields = array();
+ foreach ($sql_data[POSTS_TABLE]['sql'] as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "'" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ default:
+ $query = $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
+ break;
+ }
+
+
+ $sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $query;
$db->sql_query($sql);
$data['post_id'] = $db->sql_nextid();
@@ -1614,8 +1682,70 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
// Update the posts table
if (isset($sql_data[POSTS_TABLE]['sql']))
{
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $values = array();
+ foreach ($sql_data as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ case 'sqlite':
+ $values = array();
+ foreach ($sql_data as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key ='" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ default:
+ $query = $db->sql_build_array('UPDATE', $sql_data);
+ break;
+ }
+
$sql = 'UPDATE ' . POSTS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . '
+ SET ' . $query . '
WHERE post_id = ' . $data['post_id'];
$db->sql_query($sql);
}
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php
index 238ac76cb5..dde811c3f3 100644
--- a/phpBB/includes/functions_privmsgs.php
+++ b/phpBB/includes/functions_privmsgs.php
@@ -1302,15 +1302,145 @@ function submit_pm($mode, $subject, &$data, $update_message, $put_in_outbox = tr
if (sizeof($sql_data))
{
+ $query = '';
+
if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward')
{
- $db->sql_query('INSERT INTO ' . PRIVMSGS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data));
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $fields = array();
+ foreach ($sql_data as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ case 'sqlite':
+ $fields = array();
+ foreach ($sql_data as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "'" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ default:
+ $query = $db->sql_build_array('INSERT', $sql_data);
+ break;
+ }
+
+ $db->sql_query('INSERT INTO ' . PRIVMSGS_TABLE . ' ' . $query);
$data['msg_id'] = $db->sql_nextid();
}
else if ($mode == 'edit')
{
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $values = array();
+ foreach ($sql_data as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'forum_desc_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ case 'sqlite':
+ $values = array();
+ foreach ($sql_data as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'forum_desc_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = '" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ default:
+ $query = $db->sql_build_array('UPDATE', $sql_data);
+ break;
+ }
+
$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
- SET message_edit_count = message_edit_count + 1, ' . $db->sql_build_array('UPDATE', $sql_data) . '
+ SET message_edit_count = message_edit_count + 1, ' . $query . '
WHERE msg_id = ' . $data['msg_id'];
$db->sql_query($sql);
}
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index 72383c1501..b0c2d4a2b7 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -186,7 +186,7 @@ function user_add($user_row, $cp_data = false)
'user_sig' => '',
'user_sig_bbcode_uid' => '',
- 'user_sig_bbcode_bitfield' => 0,
+ 'user_sig_bbcode_bitfield' => '',
);
// Now fill the sql array with not required variables
@@ -207,7 +207,75 @@ function user_add($user_row, $cp_data = false)
}
}
- $sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
+ $query = '';
+
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'user_sig_bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ case 'sqlite':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'user_sig_bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "'" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ default:
+ $query = $db->sql_build_array('INSERT', $sql_ary);
+ break;
+ }
+
+ $sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $query;
$db->sql_query($sql);
$user_id = $db->sql_nextid();
@@ -1388,7 +1456,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
'group_name' => (string) $name,
'group_desc' => (string) $desc,
'group_desc_uid' => '',
- 'group_desc_bitfield' => 0,
+ 'group_desc_bitfield' => '',
'group_type' => (int) $type,
);
@@ -1413,15 +1481,144 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
// Setting the log message before we set the group id (if group gets added)
$log = ($group_id) ? 'LOG_GROUP_UPDATED' : 'LOG_GROUP_CREATED';
+ $query = '';
+
if ($group_id)
{
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $values = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'group_desc_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ case 'sqlite':
+ $values = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'group_desc_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = '" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ default:
+ $query = $db->sql_build_array('UPDATE', $sql_ary);
+ break;
+ }
+
$sql = 'UPDATE ' . GROUPS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
+ SET ' . $query . "
WHERE group_id = $group_id";
}
else
{
- $sql = 'INSERT INTO ' . GROUPS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ case 'sqlite':
+ $fields = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ $fields[] = $key;
+
+ if (is_null($var))
+ {
+ $values[] = 'NULL';
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'bbcode_bitfield')
+ {
+ $values[] = "'" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "'" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? intval($var) : $var;
+ }
+ }
+ $query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
+ break;
+
+ default:
+ $query = $db->sql_build_array('INSERT', $sql_ary);
+ break;
+ }
+ $sql = 'INSERT INTO ' . GROUPS_TABLE . ' ' . $query;
}
$db->sql_query($sql);
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index a44a11d566..37376c17e8 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -43,7 +43,9 @@ class bbcode_firstpass extends bbcode
}
global $user;
- $this->bbcode_bitfield = 0;
+
+ $this->bbcode_bitfield = '';
+ $bitfield = new bitfield();
$size = strlen($this->message);
foreach ($this->bbcodes as $bbcode_name => $bbcode_data)
@@ -72,10 +74,12 @@ class bbcode_firstpass extends bbcode
$new_size = strlen($this->message);
if ($size != $new_size)
{
- $this->bbcode_bitfield |= (1 << $bbcode_data['bbcode_id']);
+ $bitfield->set($bbcode_data['bbcode_id']);
$size = $new_size;
}
}
+
+ $this->bbcode_bitfield = $bitfield->get_blob();
}
/**
@@ -1376,21 +1380,21 @@ class parse_message extends bbcode_firstpass
// Parse Poll Option text ;)
$tmp_message = $this->message;
$this->message = $poll['poll_option_text'];
- $bbcode_bitfield = $this->bbcode_bitfield;
+
$poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], $poll['enable_urls'], $poll['enable_smilies'], $poll['img_status'], false, false, false);
- $this->bbcode_bitfield |= $bbcode_bitfield;
+
$this->message = $tmp_message;
// Parse Poll Title
$tmp_message = $this->message;
$this->message = $poll['poll_title'];
- $bbcode_bitfield = $this->bbcode_bitfield;
+
$poll['poll_title'] = $this->parse($poll['enable_bbcode'], $poll['enable_urls'], $poll['enable_smilies'], $poll['img_status'], false, false, false);
- $this->bbcode_bitfield |= $bbcode_bitfield;
+
$this->message = $tmp_message;
unset($tmp_message);
diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php
index a9fb0444f5..4dcacdc575 100644
--- a/phpBB/includes/ucp/ucp_groups.php
+++ b/phpBB/includes/ucp/ucp_groups.php
@@ -316,7 +316,7 @@ class ucp_groups
// Hide hidden groups unless user is an admin with group privileges
$sql_and = ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? '<> ' . GROUP_SPECIAL : 'NOT IN (' . GROUP_SPECIAL . ', ' . GROUP_HIDDEN . ')';
- $sql = 'SELECT group_id, group_name, group_desc, group_desc_uid, group_desc_bitfield, group_type
+ $sql = 'SELECT group_id, group_name, group_desc, group_desc_uid, group_desc_bitfield, group_desc_options, group_type
FROM ' . GROUPS_TABLE . '
WHERE group_id NOT IN (' . implode(', ', $group_id_ary) . ")
AND group_type $sql_and
diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php
index 272b93af55..8ba12650c1 100644
--- a/phpBB/includes/ucp/ucp_pm_compose.php
+++ b/phpBB/includes/ucp/ucp_pm_compose.php
@@ -520,7 +520,7 @@ function compose_pm($id, $mode, $action)
'enable_bbcode' => (bool) $enable_bbcode,
'enable_smilies' => (bool) $enable_smilies,
'enable_urls' => (bool) $enable_urls,
- 'bbcode_bitfield' => (int) $message_parser->bbcode_bitfield,
+ 'bbcode_bitfield' => $message_parser->bbcode_bitfield,
'bbcode_uid' => $message_parser->bbcode_uid,
'message' => $message_parser->message,
'attachment_data' => $message_parser->attachment_data,
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index 8e1b580571..3df09a4a0c 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -264,7 +264,7 @@ function message_history($msg_id, $user_id, $message_row, $folder)
}
$rowset = array();
- $bbcode_bitfield = 0;
+ $bbcode_bitfield = '';
$folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm') . '&amp;folder=';
$title = ($sort_dir == 'd') ? $row['message_subject'] : '';
@@ -281,7 +281,7 @@ function message_history($msg_id, $user_id, $message_row, $folder)
else
{
$rowset[$row['msg_id']] = $row;
- $bbcode_bitfield |= $row['bbcode_bitfield'];
+ $bbcode_bitfield = $bbcode_bitfield | $row['bbcode_bitfield'];
}
}
while ($row = $db->sql_fetchrow($result));
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index c529e55223..522aa29723 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -431,17 +431,81 @@ class ucp_profile
{
$error[] = implode('<br />', $message_parser->warn_msg);
}
-
+
if (!sizeof($error) && $submit)
{
$sql_ary = array(
'user_sig' => (string) $message_parser->message,
'user_sig_bbcode_uid' => (string) $message_parser->bbcode_uid,
- 'user_sig_bbcode_bitfield' => (int) $message_parser->bbcode_bitfield
+ 'user_sig_bbcode_bitfield' => $message_parser->bbcode_bitfield
);
+ $query = '';
+
+ switch (SQL_LAYER)
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $values = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'user_sig_bbcode_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = CAST('" . $var . "' AS varbinary)";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ case 'sqlite':
+ $values = array();
+ foreach ($sql_ary as $key => $var)
+ {
+ if (is_null($var))
+ {
+ $values[] = "$key = NULL";
+ }
+ else if (is_string($var))
+ {
+ if ($key !== 'user_sig_bbcode_bitfield')
+ {
+ $values[] = "$key = '" . $db->sql_escape($var) . "'";
+ }
+ else
+ {
+ $values[] = "$key = '" . sqlite_udf_encode_binary($var) . "'";
+ }
+ }
+ else
+ {
+ $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
+ }
+ }
+ $query = implode(', ', $values);
+ break;
+
+ default:
+ $query = $db->sql_build_array('UPDATE', $sql_ary);
+ break;
+ }
+
$sql = 'UPDATE ' . USERS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ SET ' . $query . '
WHERE user_id = ' . $user->data['user_id'];
$db->sql_query($sql);