Line 177 | Line 177 |
---|
$engine === 'MyISAM' || // FULLTEXT is supported on InnoDB since MySQL 5.6.4 according to // http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html
|
$engine === 'MyISAM' || // FULLTEXT is supported on InnoDB since MySQL 5.6.4 according to // http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html
|
| // We also require https://bugs.mysql.com/bug.php?id=67004 to be // fixed for proper overall operation. Hence we require 5.6.8.
|
$engine === 'InnoDB' &&
|
$engine === 'InnoDB' &&
|
phpbb_version_compare($this->db->sql_server_info(true), '5.6.4', '>=');
| phpbb_version_compare($this->db->sql_server_info(true), '5.6.8', '>=');
|
if (!$fulltext_supported) {
| if (!$fulltext_supported) {
|
Line 270 | Line 272 |
---|
foreach ($this->split_words as $i => $word) {
|
foreach ($this->split_words as $i => $word) {
|
| // Check for not allowed search queries for InnoDB. // We assume similar restrictions for MyISAM, which is usually even // slower but not as restrictive as InnoDB. // InnoDB full-text search does not support the use of a leading // plus sign with wildcard ('+*'), a plus and minus sign // combination ('+-'), or leading a plus and minus sign combination. // InnoDB full-text search only supports leading plus or minus signs. // For example, InnoDB supports '+apple' but does not support 'apple+'. // Specifying a trailing plus or minus sign causes InnoDB to report // a syntax error. InnoDB full-text search does not support the use // of multiple operators on a single search word, as in this example: // '++apple'. Use of multiple operators on a single search word // returns a syntax error to standard out. // Also, ensure that the wildcard character is only used at the // end of the line as it's intended by MySQL. if (preg_match('#^(\+[+-]|\+\*|.+[+-]$|.+\*(?!$))#', $word)) { unset($this->split_words[$i]); continue; }
|
$clean_word = preg_replace('#^[+\-|"]#', '', $word);
// check word length
| $clean_word = preg_replace('#^[+\-|"]#', '', $word);
// check word length
|
Line 379 | Line 402 |
---|
}
// generate a search_key from all the options to identify the results
|
}
// generate a search_key from all the options to identify the results
|
$search_key = md5(implode('#', array(
| $search_key_array = array(
|
implode(', ', $this->split_words), $type, $fields,
| implode(', ', $this->split_words), $type, $fields,
|
Line 390 | Line 413 |
---|
implode(',', $ex_fid_ary), $post_visibility, implode(',', $author_ary)
|
implode(',', $ex_fid_ary), $post_visibility, implode(',', $author_ary)
|
)));
| );
/** * Allow changing the search_key for cached results * * @event core.search_mysql_by_keyword_modify_search_key * @var array search_key_array Array with search parameters to generate the search_key * @var string type Searching type ('posts', 'topics') * @var string fields Searching fields ('titleonly', 'msgonly', 'firstpost', 'all') * @var string terms Searching terms ('all', 'any') * @var int sort_days Time, in days, of the oldest possible post to list * @var string sort_key The sort type used from the possible sort types * @var int topic_id Limit the search to this topic_id only * @var array ex_fid_ary Which forums not to search on * @var string post_visibility Post visibility data * @var array author_ary Array of user_id containing the users to filter the results to * @since 3.1.7-RC1 */ $vars = array( 'search_key_array', 'type', 'fields', 'terms', 'sort_days', 'sort_key', 'topic_id', 'ex_fid_ary', 'post_visibility', 'author_ary', ); extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_keyword_modify_search_key', compact($vars)));
$search_key = md5(implode('#', $search_key_array));
|
if ($start < 0) {
| if ($start < 0) {
|
Line 610 | Line 665 |
---|
}
// generate a search_key from all the options to identify the results
|
}
// generate a search_key from all the options to identify the results
|
$search_key = md5(implode('#', array(
| $search_key_array = array(
|
'', $type, ($firstpost_only) ? 'firstpost' : '',
| '', $type, ($firstpost_only) ? 'firstpost' : '',
|
Line 623 | Line 678 |
---|
$post_visibility, implode(',', $author_ary), $author_name,
|
$post_visibility, implode(',', $author_ary), $author_name,
|
)));
| );
/** * Allow changing the search_key for cached results * * @event core.search_mysql_by_author_modify_search_key * @var array search_key_array Array with search parameters to generate the search_key * @var string type Searching type ('posts', 'topics') * @var boolean firstpost_only Flag indicating if only topic starting posts are considered * @var int sort_days Time, in days, of the oldest possible post to list * @var string sort_key The sort type used from the possible sort types * @var int topic_id Limit the search to this topic_id only * @var array ex_fid_ary Which forums not to search on * @var string post_visibility Post visibility data * @var array author_ary Array of user_id containing the users to filter the results to * @var string author_name The username to search on * @since 3.1.7-RC1 */ $vars = array( 'search_key_array', 'type', 'firstpost_only', 'sort_days', 'sort_key', 'topic_id', 'ex_fid_ary', 'post_visibility', 'author_ary', 'author_name', ); extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_author_modify_search_key', compact($vars)));
$search_key = md5(implode('#', $search_key_array));
|
if ($start < 0) {
| if ($start < 0) {
|
Line 685 | Line 772 |
---|
* Set to 0 to force a re-count * @var string sql_sort_table CROSS JOIN'ed table to allow doing the sort chosen * @var string sql_sort_join Condition to define how to join the CROSS JOIN'ed table specifyed in sql_sort_table
|
* Set to 0 to force a re-count * @var string sql_sort_table CROSS JOIN'ed table to allow doing the sort chosen * @var string sql_sort_join Condition to define how to join the CROSS JOIN'ed table specifyed in sql_sort_table
|
| * @var string type Either "posts" or "topics" specifying the type of search being made
|
* @var array author_ary Array of user_id containing the users to filter the results to * @var string author_name An extra username to search on * @var string sql_author SQL WHERE condition for the post author ids
| * @var array author_ary Array of user_id containing the users to filter the results to * @var string author_name An extra username to search on * @var string sql_author SQL WHERE condition for the post author ids
|
Line 697 | Line 785 |
---|
* @var string sort_days Time, in days, that the oldest post showing can have * @var string sql_time The SQL to search on the time specifyed by sort_days * @var bool firstpost_only Wether or not to search only on the first post of the topics
|
* @var string sort_days Time, in days, that the oldest post showing can have * @var string sql_time The SQL to search on the time specifyed by sort_days * @var bool firstpost_only Wether or not to search only on the first post of the topics
|
| * @var string sql_firstpost The SQL with the conditions to join the tables when using firstpost_only
|
* @var array ex_fid_ary Forum ids that must not be searched on * @var array sql_fora SQL query for ex_fid_ary * @var string m_approve_fid_sql WHERE clause condition on post_visibility restrictions
| * @var array ex_fid_ary Forum ids that must not be searched on * @var array sql_fora SQL query for ex_fid_ary * @var string m_approve_fid_sql WHERE clause condition on post_visibility restrictions
|
Line 707 | Line 796 |
---|
'result_count', 'sql_sort_table', 'sql_sort_join',
|
'result_count', 'sql_sort_table', 'sql_sort_join',
|
| 'type',
|
'author_ary', 'author_name', 'sql_author',
| 'author_ary', 'author_name', 'sql_author',
|
Line 719 | Line 809 |
---|
'sort_days', 'sql_time', 'firstpost_only',
|
'sort_days', 'sql_time', 'firstpost_only',
|
| 'sql_firstpost',
|
'ex_fid_ary', 'sql_fora', 'm_approve_fid_sql',
| 'ex_fid_ary', 'sql_fora', 'm_approve_fid_sql',
|
Line 872 | Line 963 |
---|
$this->get_stats(); }
|
$this->get_stats(); }
|
$alter = array();
| $alter_list = array();
|
if (!isset($this->stats['post_subject'])) {
|
if (!isset($this->stats['post_subject'])) {
|
| $alter_entry = array();
|
if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) {
|
if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) {
|
$alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
| $alter_entry[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
|
} else {
|
} else {
|
$alter[] = 'MODIFY post_subject text NOT NULL';
| $alter_entry[] = 'MODIFY post_subject text NOT NULL';
|
}
|
}
|
$alter[] = 'ADD FULLTEXT (post_subject)';
| $alter_entry[] = 'ADD FULLTEXT (post_subject)'; $alter_list[] = $alter_entry;
|
}
if (!isset($this->stats['post_content'])) {
|
}
if (!isset($this->stats['post_content'])) {
|
| $alter_entry = array();
|
if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) {
|
if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>=')) {
|
$alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
| $alter_entry[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
|
} else {
|
} else {
|
$alter[] = 'MODIFY post_text mediumtext NOT NULL';
| $alter_entry[] = 'MODIFY post_text mediumtext NOT NULL';
|
}
|
}
|
$alter[] = 'ADD FULLTEXT post_content (post_text, post_subject)';
| $alter_entry[] = 'ADD FULLTEXT post_content (post_text, post_subject)'; $alter_list[] = $alter_entry;
|
}
|
}
|
if (sizeof($alter))
| if (sizeof($alter_list)) { foreach ($alter_list as $alter)
|
{ $this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
|
{ $this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
|
| }
|
}
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
| }
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
|