mirror of
https://github.com/phpbb/phpbb.git
synced 2025-07-30 21:40:43 +02:00
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
This commit is contained in:
@@ -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');
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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') . '&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));
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user