1
0
mirror of https://github.com/e107inc/e107.git synced 2025-03-14 01:19:44 +01:00

Issue #5209 - Partial fix. Currently does not support FULLTEXT on a field that already has an INDEX.

This commit is contained in:
camer0n 2025-01-03 16:02:26 -08:00
parent 8a6919f2a3
commit 0b89d5d301
8 changed files with 111 additions and 34 deletions

View File

@ -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;
# --------------------------------------------------------

View File

@ -793,7 +793,7 @@ class db_verify
// return "<pre>".print_r($data,TRUE)."</pre>";
$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."<br /><br />";
// $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 = "/(?P<type>PRIMARY|PRIMARY|UNIQUE|FULLTEXT|FOREIGN|KEY)[\s]*?(?P<key_type>INDEX|KEY)?[\s]*(?:`?(?P<field>[\w]*)`?)?[\s]*?\(`?(?P<keyname>[\w]+)`?(?:\s*\(\d+\))?(?:\s*(?P<order>ASC|DESC))?\)[\s]*,?/i";
$regex = "/(?P<type>PRIMARY|UNIQUE|FULLTEXT|FOREIGN|KEY|INDEX)[\s]*?(?P<key_type>INDEX|KEY)?[\s]*(?:`?(?P<field>[\w]*)`?)?[\s]*?\(`?(?P<keyname>[\w]+)`?(?:\s*\((?P<length>\d+)\))?(?:\s*(?P<order>ASC|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;
*/
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
# --------------------------------------------------------

View File

@ -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;

View File

@ -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 (

View File

@ -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',
),
),
);