From 0b89d5d3016376904e7d777f71d53eb2ebe923f1 Mon Sep 17 00:00:00 2001 From: camer0n Date: Fri, 3 Jan 2025 16:02:26 -0800 Subject: [PATCH] Issue #5209 - Partial fix. Currently does not support FULLTEXT on a field that already has an INDEX. --- e107_core/sql/core_sql.php | 20 +++++-- e107_handlers/db_verify_class.php | 69 ++++++++++++++++------- e107_plugins/_blank/_blank_sql.php | 4 +- e107_plugins/chatbox_menu/chatbox_sql.php | 2 + e107_plugins/download/download_sql.php | 6 +- e107_plugins/faqs/faqs_sql.php | 8 ++- e107_plugins/forum/forum_sql.php | 6 +- e107_tests/tests/unit/db_verifyTest.php | 30 ++++++++-- 8 files changed, 111 insertions(+), 34 deletions(-) diff --git a/e107_core/sql/core_sql.php b/e107_core/sql/core_sql.php index 6a64d3059..d577efec6 100755 --- a/e107_core/sql/core_sql.php +++ b/e107_core/sql/core_sql.php @@ -331,7 +331,13 @@ CREATE TABLE news ( KEY news_datestamp (news_datestamp), KEY news_sticky (news_sticky), KEY news_render_type (news_render_type), - KEY news_class (news_class) + KEY news_class (news_class), + FULLTEXT (news_title), + FULLTEXT (news_body), + FULLTEXT (news_extended), + FULLTEXT (news_summary), + FULLTEXT (news_meta_keywords), + FULLTEXT (news_meta_description) ) ENGINE=InnoDB; @@ -410,9 +416,12 @@ CREATE TABLE page ( menu_template varchar(50) NOT NULL default '', menu_class varchar(250) NOT NULL default '0', menu_button_url varchar(250) NOT NULL default '', - menu_button_text varchar(250) NOT NULL default '', - - PRIMARY KEY (page_id) + menu_button_text varchar(250) NOT NULL default '', + PRIMARY KEY (page_id), + FULLTEXT (page_title), + FULLTEXT (page_text), + FULLTEXT (page_metakeys), + FULLTEXT (page_fields) ) ENGINE=InnoDB; # -------------------------------------------------------- @@ -589,7 +598,8 @@ CREATE TABLE user ( PRIMARY KEY (user_id), UNIQUE KEY user_name (user_name), UNIQUE KEY user_loginname (user_loginname), - KEY join_ban_index (user_join,user_ban) + KEY join_ban_index (user_join,user_ban), + FULLTEXT (user_signature) ) ENGINE=InnoDB; # -------------------------------------------------------- diff --git a/e107_handlers/db_verify_class.php b/e107_handlers/db_verify_class.php index 9d4d702ef..8cdf3b1ed 100755 --- a/e107_handlers/db_verify_class.php +++ b/e107_handlers/db_verify_class.php @@ -793,7 +793,7 @@ class db_verify // return "
".print_r($data,TRUE)."
"; $v = $data['_valid']; - $i = $data['_invalid']; + $i = !empty($data['_invalid']) ? $data['_invalid'] : array(); $valid = $this->toMysql($v,$mode); $invalid = $this->toMysql($i,$mode); @@ -1163,6 +1163,13 @@ class db_verify foreach($tmp as $line) { $line = trim($line); + + if(strpos($line,"PRIMARY") === 0 || strpos($line,"KEY") === 0 || strpos($line,"INDEX") === 0 || strpos($line,"FULLTEXT") === 0 || strpos($line,"FOREIGN") === 0) + { + $newline[] = ''; // Add a placeholder to preserve the structure + continue; + } + $newline[] = preg_replace('/^([^`\s][0-9a-zA-Z\$_]*)/',"`$1`", $line); } @@ -1172,26 +1179,13 @@ class db_verify $mes = e107::getMessage(); // $regex = "/`?([\w]*)`?\s*?(".implode("|",$this->fieldTypes)."|".implode("|",$this->fieldTypeNum).")\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]?.*?(?:(NOT NULL|NULL))?[\s]*(auto_increment|default .*)?[\s]?(?:PRIMARY KEY)?[\s]*?,?\s*?\n/im"; - $regex = "/^\s*?`?([\w]*)`?\s*?(".implode("|",$this->fieldTypes)."|".implode("|",$this->fieldTypeNum).")\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]?.*?(?:(NOT NULL|NULL))?[\s]*(auto_increment|default|AUTO_INCREMENT|DEFAULT [\w'\s.\(:\)-]*)?[\s]?(comment [\w\s'.-]*)?[\s]?(?:PRIMARY KEY)?[\s]*?,?\s*?\n/im"; + $regex = "/^\s*?`?([\w]*)`?\s*?(".implode("|",$this->fieldTypes)."|".implode("|",$this->fieldTypeNum).")\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]?.*?(?:(NOT NULL|NULL))?[\s]*(auto_increment|default|AUTO_INCREMENT|DEFAULT [\w'\s.\(:\)-]*)?[\s]?(comment [\w\s'.-]*)?[\s]?(?:PRIMARY KEY|FULLTEXT)?[\s]*?,?\s*?\n/im"; - - // echo $regex."

"; - - // $regex = "/`?([\w]*)`?\s*(int|varchar|tinyint|smallint|text|char|tinyint) ?(?:\([\s]?([0-9]*)[\s]?\))?[\s]?(unsigned)?[\s]?.*?(NOT NULL|NULL)?[\s]*(auto_increment|default .*)?[\s]?,/i"; - - // $regex = "/^\s*?`?([\w]*)`?\s*?(".implode("|",$this->fieldTypes)."|".implode("|",$this->fieldTypeNum).")\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]?.*?(?:(NOT NULL|NULL))?[\s]*?(auto_increment|default [\w'\".-]*)?[\s]?(?:PRIMARY KEY)?[\s]*?,?\n/im"; - //$regex = "/^\s*?`?([\w]*)`?\s*?(date|time|timestamp|datetime|year|tinyblob|blob|mediumblob|longblob|tinytext|mediumtext|longtext|text|bit|tinyint|smallint|mediumint|integer|int|bigint|real|double|float|decimal|numeric|varchar|char|binary|varbinary|enum|set)\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]*?(?:(NOT NULL|NULL))?[\s]*?(auto_increment|default [\w'\".-]*)?[\s]?(?:PRIMARY KEY)?[\s]*?,?\n/im"; - // $mes->addDebug($regex); - - //$regex = "/^\s*?`?([\w]*)`?\s*?(date|time|timestamp|datetime|year|text|bit|tinyint|smallint|mediumint|integer|int|bigint|real|double|float|decimal|numeric|varchar|char|binary|varbinary|enum|set)\s?(?:\([\s]?([0-9,]*)[\s]?\))?[\s]?(unsigned)?[\s]*?(?:(NOT NULL|NULL))?[\s]*?(auto_increment|default [\w'.-]*)?[\s]?(?:PRIMARY KEY)?[\s]*?,?\n/i"; - - // echo "reg=".$regex; - preg_match_all($regex,$data,$m); $ret = array(); - - if($print) var_dump($regex, $m); + + if($print) var_dump($regex, $m); foreach($m[1] as $k=>$val) { @@ -1215,10 +1209,47 @@ class db_verify */ function getIndex($data, $print = false) { - $regex = "/(PRIMARY|UNIQUE|FULLTEXT|FOREIGN)?[\s]*?(INDEX|KEY)[\s]*(?:`?([\w]*)`?)?[\s]*?\(`?([\w]+)`?(?:\s*\(\d+\))?(?:\s*(ASC|DESC))?\)[\s]*,?/i"; + // $regex = "/(PRIMARY|UNIQUE|FULLTEXT|FOREIGN)?[\s]*?(INDEX|KEY)[\s]*(?:`?([\w]*)`?)?[\s]*?\(`?([\w]+)`?(?:\s*\(\d+\))?(?:\s*(ASC|DESC))?\)[\s]*,?/i"; + // $regex = "/(?PPRIMARY|PRIMARY|UNIQUE|FULLTEXT|FOREIGN|KEY)[\s]*?(?PINDEX|KEY)?[\s]*(?:`?(?P[\w]*)`?)?[\s]*?\(`?(?P[\w]+)`?(?:\s*\(\d+\))?(?:\s*(?PASC|DESC))?\)[\s]*,?/i"; + $regex = "/(?PPRIMARY|UNIQUE|FULLTEXT|FOREIGN|KEY|INDEX)[\s]*?(?PINDEX|KEY)?[\s]*(?:`?(?P[\w]*)`?)?[\s]*?\(`?(?P[\w]+)`?(?:\s*\((?P\d+)\))?(?:\s*(?PASC|DESC))?\)[\s]*,?/i"; preg_match_all($regex,$data,$m); + $ret = []; + + foreach($m['type'] as $k=>$val) + { + $i = $m['field'][$k]; + $type = trim(strtoupper($m['type'][$k])); + $keyname = trim($m['keyname'][$k]); + $field = trim($m['field'][$k]); + + if(empty($field) || $field === 'KEY') + { + $field = $keyname; + $i = $keyname; + } + + if($type === 'KEY' || $type === 'INDEX') + { + $type = ''; + } + + if(empty($keyname) || $keyname === 'KEY') + { + $keyname = $field; + } + + $ret[$i] = array( + 'type' => $type, + 'keyname' => $keyname, + 'field' => $field, + + ); + } + + return $ret; +/* if (count($m) > 0) { unset($m[2]); @@ -1273,7 +1304,7 @@ class db_verify } return $ret; - +*/ } diff --git a/e107_plugins/_blank/_blank_sql.php b/e107_plugins/_blank/_blank_sql.php index 233789286..41909591d 100644 --- a/e107_plugins/_blank/_blank_sql.php +++ b/e107_plugins/_blank/_blank_sql.php @@ -57,5 +57,7 @@ CREATE TABLE blank ( `blank_url` varchar(255) NOT NULL, `blank_media` json DEFAULT NULL, `blank_class` int(10) NOT NULL, - PRIMARY KEY (`blank_id`) + PRIMARY KEY (`blank_id`), + FULLTEXT (`blank_nick`), + FULLTEXT (`blank_message`) ) ENGINE=MyISAM; diff --git a/e107_plugins/chatbox_menu/chatbox_sql.php b/e107_plugins/chatbox_menu/chatbox_sql.php index fa8d7ef6c..a4ae8d7e2 100644 --- a/e107_plugins/chatbox_menu/chatbox_sql.php +++ b/e107_plugins/chatbox_menu/chatbox_sql.php @@ -5,5 +5,7 @@ CREATE TABLE chatbox ( cb_datestamp int(10) unsigned NOT NULL default '0', cb_blocked tinyint(3) unsigned NOT NULL default '0', cb_ip varchar(45) NOT NULL default '', + FULLTEXT (cb_nick), + FULLTEXT (cb_message), PRIMARY KEY (cb_id) ) ENGINE=MyISAM; \ No newline at end of file diff --git a/e107_plugins/download/download_sql.php b/e107_plugins/download/download_sql.php index 9e860b80b..e75f59c74 100644 --- a/e107_plugins/download/download_sql.php +++ b/e107_plugins/download/download_sql.php @@ -25,7 +25,11 @@ CREATE TABLE download ( download_visible varchar(255) NOT NULL default '0', PRIMARY KEY (download_id), UNIQUE KEY download_name (download_name), - KEY download_category (download_category) + KEY download_category (download_category), + FULLTEXT (download_url), + FULLTEXT (download_description), + FULLTEXT (download_author), + FULLTEXT (download_author_website) ) ENGINE=MyISAM; # -------------------------------------------------------- diff --git a/e107_plugins/faqs/faqs_sql.php b/e107_plugins/faqs/faqs_sql.php index a03e780cf..895f55a66 100644 --- a/e107_plugins/faqs/faqs_sql.php +++ b/e107_plugins/faqs/faqs_sql.php @@ -9,7 +9,10 @@ CREATE TABLE faqs ( faq_author_ip varchar(45) NOT NULL default '', faq_tags varchar(255) NOT NULL default '', faq_order int(6) unsigned NOT NULL default '0', - PRIMARY KEY (faq_id) + PRIMARY KEY (faq_id), + FULLTEXT (faq_question), + FULLTEXT (faq_answer), + FULLTEXT (faq_tags) ) ENGINE=MyISAM; CREATE TABLE faqs_info ( @@ -23,6 +26,7 @@ CREATE TABLE faqs_info ( faq_info_metad varchar(255) NOT NULL default '', faq_info_metak varchar(255) NOT NULL default '', faq_info_sef varchar(255) NOT NULL default '', - PRIMARY KEY (faq_info_id) + PRIMARY KEY (faq_info_id), + FULLTEXT (faq_info_title) ) ENGINE=MyISAM; diff --git a/e107_plugins/forum/forum_sql.php b/e107_plugins/forum/forum_sql.php index b307b2b02..4a076401f 100644 --- a/e107_plugins/forum/forum_sql.php +++ b/e107_plugins/forum/forum_sql.php @@ -43,7 +43,8 @@ CREATE TABLE forum_thread ( PRIMARY KEY (`thread_id`), KEY `thread_forum_id` (`thread_forum_id`), KEY `thread_sticky` (`thread_sticky`), - KEY `thread_lastpost` (`thread_lastpost`) + KEY `thread_lastpost` (`thread_lastpost`), + FULLTEXT (`thread_name`) ) ENGINE=MyISAM AUTO_INCREMENT=1 ; CREATE TABLE forum_post ( @@ -65,7 +66,8 @@ CREATE TABLE forum_post ( KEY `post_thread` (`post_thread`), KEY `post_forum` (`post_forum`), KEY `post_datestamp` (`post_datestamp`), - KEY `post_user` (`post_user`) + KEY `post_user` (`post_user`), + FULLTEXT (`post_entry`) ) ENGINE=MyISAM AUTO_INCREMENT=1 ; CREATE TABLE forum_track ( diff --git a/e107_tests/tests/unit/db_verifyTest.php b/e107_tests/tests/unit/db_verifyTest.php index 4d2dccea2..303e4dbc9 100644 --- a/e107_tests/tests/unit/db_verifyTest.php +++ b/e107_tests/tests/unit/db_verifyTest.php @@ -51,6 +51,8 @@ class db_verifyTest extends \Codeception\Test\Unit table_email2 tinyint(3) unsigned NOT NULL default '0', table_email90 tinyint(3) unsigned NOT NULL default '0', e107_name varchar(100) NOT NULL default '', + FULLTEXT (table_title), + FULLTEXT (table_description), PRIMARY KEY (table_id)"; $expected = array( @@ -250,10 +252,12 @@ class db_verifyTest extends \Codeception\Test\Unit $data = "`schedule_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `schedule_cust_id` int(11) NOT NULL, + `schedule_description` text NOT NULL, `schedule_complete` int(1) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (`schedule_id`), - UNIQUE KEY `schedule_cust_id` (`schedule_cust_id`), - KEY `schedule_invoice_id` (`schedule_invoice_id`)"; + FULLTEXT (`schedule_description`), + UNIQUE KEY `schedule_cust_id` (`schedule_cust_id_key`), + KEY `schedule_invoice_id` (`schedule_invoice_id_key`)"; $expected = array( 'schedule_id' => @@ -262,16 +266,22 @@ class db_verifyTest extends \Codeception\Test\Unit 'keyname' => 'schedule_id', 'field' => 'schedule_id', ), + 'schedule_description' => + array( + 'type' => 'FULLTEXT', + 'keyname' => 'schedule_description', + 'field' => 'schedule_description', + ), 'schedule_cust_id' => array( 'type' => 'UNIQUE', - 'keyname' => 'schedule_cust_id', + 'keyname' => 'schedule_cust_id_key', 'field' => 'schedule_cust_id', ), 'schedule_invoice_id' => array( 'type' => '', - 'keyname' => 'schedule_invoice_id', + 'keyname' => 'schedule_invoice_id_key', 'field' => 'schedule_invoice_id', ), ); @@ -839,6 +849,7 @@ EOF; `schedule_results` text NOT NULL, PRIMARY KEY (`schedule_id`), UNIQUE KEY `schedule_user_id` (`schedule_user_id`), + FULLTEXT (`schedule_name`), KEY `schedule_invoice_id` (`schedule_invoice_id`) "; @@ -960,6 +971,17 @@ EOF; ), '_file' => 'myplugin', ), + 'schedule_name' => + array( + '_status' => 'missing_index', + '_valid' => + array( + 'type' => 'FULLTEXT', + 'keyname' => 'schedule_name', + 'field' => 'schedule_name', + ), + '_file' => 'myplugin', + ), ), );