mirror of
https://github.com/e107inc/e107.git
synced 2025-08-04 05:37:32 +02:00
update routine: fixed missing FULLTEXT index case
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
+ ----------------------------------------------------------------------------+
|
||||
| e107 website system
|
||||
|
|
||||
| <EFBFBD>Steve Dunstan 2001-2002
|
||||
| Steve Dunstan 2001-2002
|
||||
| http://e107.org
|
||||
| jalist@e107.org
|
||||
|
|
||||
@@ -11,9 +11,9 @@
|
||||
| GNU General Public License (http://gnu.org).
|
||||
|
|
||||
| $Source: /cvs_backup/e107_0.8/e107_admin/update_routines.php,v $
|
||||
| $Revision: 1.50 $
|
||||
| $Date: 2009-09-10 09:26:54 $
|
||||
| $Author: e107coders $
|
||||
| $Revision: 1.51 $
|
||||
| $Date: 2009-09-13 20:22:39 $
|
||||
| $Author: secretr $
|
||||
+----------------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
@@ -264,7 +264,7 @@ function update_706_to_800($type='')
|
||||
|
||||
|
||||
// List of changed DB tables from core plugins (defined in pluginname_sql.php file)
|
||||
// key = plugin directory nane. Data = comma-separated list of tables to check
|
||||
// key = plugin directory name. Data = comma-separated list of tables to check
|
||||
// (primarily those which have changed significantly; for the odd field write some explicit code - it'll run faster)
|
||||
$pluginChangedTables = array('linkwords' => 'linkwords');
|
||||
|
||||
|
@@ -1,33 +1,29 @@
|
||||
<?php
|
||||
/*
|
||||
+----------------------------------------------------------------------------+
|
||||
| e107 website system
|
||||
|
|
||||
| <20>Steve Dunstan 2001-2002
|
||||
| http://e107.org
|
||||
| jalist@e107.org
|
||||
|
|
||||
| Released under the terms and conditions of the
|
||||
| GNU General Public License (http://gnu.org).
|
||||
|
|
||||
| $Source: /cvs_backup/e107_0.8/e107_handlers/db_table_admin_class.php,v $
|
||||
| $Revision: 1.9 $
|
||||
| $Date: 2009-08-17 15:45:20 $
|
||||
| $Author: e107coders $
|
||||
+----------------------------------------------------------------------------+
|
||||
* e107 website system
|
||||
*
|
||||
* Copyright (C) 2001-2008 e107 Inc (e107.org)
|
||||
* Released under the terms and conditions of the
|
||||
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
||||
*
|
||||
* Database utilities
|
||||
*
|
||||
* $Source: /cvs_backup/e107_0.8/e107_handlers/db_table_admin_class.php,v $
|
||||
* $Revision: 1.10 $
|
||||
* $Date: 2009-09-13 20:22:39 $
|
||||
* $Author: secretr $
|
||||
*/
|
||||
|
||||
/*
|
||||
Database utilities for admin tasks:
|
||||
Get structure of a table from a database
|
||||
Get structure of a table from a file
|
||||
First level parse of table structure
|
||||
Parse of field definitions part of table structure
|
||||
Comparison of two structures, including generation of MySQL to make them the same
|
||||
Some crude printing utilities
|
||||
|
||||
Note: there are some uncommented 'echo' statements which are intentional to highlight that something's gone wrong! (not that it should, of course)
|
||||
*/
|
||||
Database utilities for admin tasks:
|
||||
Get structure of a table from a database
|
||||
Get structure of a table from a file
|
||||
First level parse of table structure
|
||||
Parse of field definitions part of table structure
|
||||
Comparison of two structures, including generation of MySQL to make them the same
|
||||
Some crude printing utilities
|
||||
Note: there are some uncommented 'echo' statements which are intentional to highlight that something's gone wrong! (not that it should, of course)
|
||||
*/
|
||||
|
||||
class db_table_admin
|
||||
{
|
||||
@@ -40,20 +36,31 @@ class db_table_admin
|
||||
{
|
||||
global $sql;
|
||||
|
||||
if (!$prefix) { $prefix = MPREFIX; }
|
||||
if (!$prefix)
|
||||
{
|
||||
$prefix = MPREFIX;
|
||||
}
|
||||
// echo "Get table structure for: {$table_name}, prefix: {$prefix}<br />";
|
||||
$sql->db_Select_gen('SET SQL_QUOTE_SHOW_CREATE = 1');
|
||||
$qry = 'SHOW CREATE TABLE `'.$prefix.$table_name."`";
|
||||
if (!($z = $sql->db_Select_gen($qry))) { return FALSE; }
|
||||
if (!($z = $sql->db_Select_gen($qry)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
$row = $sql->db_Fetch(MYSQL_NUM);
|
||||
$tmp = str_replace("`", "", stripslashes($row[1])).';'; // Add semicolon to work with our parser
|
||||
$count = preg_match_all("#CREATE\s+?TABLE\s+?`{0,1}({$prefix}{$table_name})`{0,1}\s+?\((.*?)\)\s+?(?:TYPE|ENGINE)\s*\=\s*(.*?);#is",$tmp,$matches,PREG_SET_ORDER);
|
||||
if ($count === FALSE) { return "Error occurred";}
|
||||
if (!$count) { return "No matches"; }
|
||||
$count = preg_match_all("#CREATE\s+?TABLE\s+?`{0,1}({$prefix}{$table_name})`{0,1}\s+?\((.*?)\)\s+?(?:TYPE|ENGINE)\s*\=\s*(.*?);#is", $tmp, $matches, PREG_SET_ORDER);
|
||||
if ($count === FALSE)
|
||||
{
|
||||
return "Error occurred";
|
||||
}
|
||||
if (!$count)
|
||||
{
|
||||
return "No matches";
|
||||
}
|
||||
return $matches;
|
||||
}
|
||||
|
||||
|
||||
// Routine to do first-level parse of table structure
|
||||
//---------------------------------------------------
|
||||
// Given the name of a file, returns an array, with each element being a table creation definition.
|
||||
@@ -67,52 +74,68 @@ class db_table_admin
|
||||
// [2] - Field definitions, with the surrounding (...) stripped
|
||||
// [3] - The 'TYPE' field ('TYPE=' is stripped) and any AUTO-INCREMENT definition or other text.
|
||||
// function get_table_def($table_name='',$file_name = e_ADMIN."sql/core_sql.php")
|
||||
function get_table_def($table_name='',$file_name ="")
|
||||
function get_table_def($table_name = '', $file_name = "")
|
||||
{
|
||||
if ($file_name != '')
|
||||
{ // Read in and buffer a new file (if we've not already got one)
|
||||
if ($this->last_file != $file_name)
|
||||
{
|
||||
if (!is_readable($file_name)) { return "No file"; }
|
||||
if (!is_readable($file_name))
|
||||
{
|
||||
return "No file";
|
||||
}
|
||||
$temp = file_get_contents($file_name);
|
||||
// Strip any php header
|
||||
$this->file_buffer = preg_replace("#\<\?php.*?\?\>#mis",'',$temp);
|
||||
$this->file_buffer = preg_replace("#\<\?php.*?\?\>#mis", '', $temp);
|
||||
$this->last_file = $file_name;
|
||||
}
|
||||
}
|
||||
if (!$table_name) { $table_name = '\w+?'; }
|
||||
if (!$table_name)
|
||||
{
|
||||
$table_name = '\w+?';
|
||||
}
|
||||
// Regex should be identical to that in get_current_table (apart from the source text variable name)
|
||||
$count = preg_match_all("#CREATE\s+?TABLE\s+?`{0,1}({$table_name})`{0,1}\s+?\((.*?)\)\s+?(?:TYPE|ENGINE)\s*\=\s*(.*?);#is",$this->file_buffer,$matches,PREG_SET_ORDER);
|
||||
if ($count === false) { return "Error occurred"; }
|
||||
if (!$count) { return "No matches"; }
|
||||
$count = preg_match_all("#CREATE\s+?TABLE\s+?`{0,1}({$table_name})`{0,1}\s+?\((.*?)\)\s+?(?:TYPE|ENGINE)\s*\=\s*(.*?);#is", $this->file_buffer, $matches, PREG_SET_ORDER);
|
||||
if ($count === false)
|
||||
{
|
||||
return "Error occurred";
|
||||
}
|
||||
if (!$count)
|
||||
{
|
||||
return "No matches";
|
||||
}
|
||||
return $matches;
|
||||
}
|
||||
|
||||
|
||||
// Parses the block of lines which make up the field and index definitions
|
||||
// Returns an array where each entry is the definitions of a field or index
|
||||
function parse_field_defs($text)
|
||||
{
|
||||
$ans = array();
|
||||
$text = str_replace("\r","\n",$text);
|
||||
$field_lines = explode("\n",$text);
|
||||
$ans = array(
|
||||
);
|
||||
$text = str_replace("\r", "\n", $text);
|
||||
$field_lines = explode("\n", $text);
|
||||
foreach ($field_lines as $fv)
|
||||
{
|
||||
unset($defs);
|
||||
$fv = trim(str_replace(' ',' ',$fv));
|
||||
if (substr($fv,-1) == ',') { $fv = trim(substr($fv,0,-1)); }
|
||||
$fv = trim(str_replace(' ', ' ', $fv));
|
||||
if (substr($fv, -1) == ',')
|
||||
{
|
||||
$fv = trim(substr($fv, 0, -1));
|
||||
}
|
||||
// echo "Line: ".$fv."<br />";
|
||||
if ($fv)
|
||||
{
|
||||
$fd = explode(' ',$fv);
|
||||
$fd = explode(' ', $fv);
|
||||
switch (strtoupper($fd[0]))
|
||||
{
|
||||
case 'PRIMARY' :
|
||||
case 'PRIMARY':
|
||||
if (strtoupper($fd[1]) == 'KEY')
|
||||
$defs['type'] = 'pkey';
|
||||
$defs['name'] = $fd[2];
|
||||
break;
|
||||
case 'UNIQUE' :
|
||||
|
||||
case 'UNIQUE':
|
||||
if (count($fd) < 3)
|
||||
{
|
||||
echo "Truncated definition after UNIQUE {$i}: ".$fd[1]."<br />";
|
||||
@@ -121,17 +144,38 @@ class db_table_admin
|
||||
{
|
||||
$defs['type'] = 'ukey';
|
||||
$defs['name'] = $fd[2];
|
||||
if (isset($fd[3])) $defs['keyfield'] = $fd[3]; else $defs['keyfield'] = '['.$fd[2].']';
|
||||
if (isset($fd[3])) $defs['keyfield'] = $fd[3];
|
||||
else $defs['keyfield'] = '['.$fd[2].']';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "Unrecognised word after UNIQUE in definition {$i}: ".$fd[1]."<br />";
|
||||
}
|
||||
break;
|
||||
case 'KEY' :
|
||||
|
||||
case 'FULLTEXT':
|
||||
if (count($fd) < 3)
|
||||
{
|
||||
echo "Truncated definition after FULLTEXT {$i}: ".$fd[1]."<br />";
|
||||
}
|
||||
elseif (strtoupper($fd[1]) == 'KEY')
|
||||
{
|
||||
$defs['type'] = 'ftkey';
|
||||
$defs['name'] = $fd[2];
|
||||
if (isset($fd[3])) $defs['keyfield'] = $fd[3];
|
||||
else $defs['keyfield'] = '['.$fd[2].']';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "Unrecognised word after FULLTEXT in definition {$i}: ".$fd[1]."<br />";
|
||||
}
|
||||
break;
|
||||
|
||||
case 'KEY':
|
||||
$defs['type'] = 'key';
|
||||
$defs['name'] = $fd[1];
|
||||
if (isset($fd[2])) {
|
||||
if (isset($fd[2]))
|
||||
{
|
||||
$defs['keyfield'] = $fd[2];
|
||||
}
|
||||
else
|
||||
@@ -139,12 +183,12 @@ class db_table_admin
|
||||
$defs['keyfield'] = '['.$fd[1].']';
|
||||
}
|
||||
break;
|
||||
default : // Must be a DB field name
|
||||
default: // Must be a DB field name
|
||||
$defs['type'] = 'field';
|
||||
$defs['name'] = $fd[0];
|
||||
$defs['fieldtype'] = $fd[1];
|
||||
$i = 2; // First unused field
|
||||
if ((strpos($fd[1],'int') === 0) || (strpos($fd[1],'tinyint') === 0) || (strpos($fd[1],'smallint') === 0) || (strpos($fd[1],'bigint') === 0))
|
||||
if ((strpos($fd[1], 'int') === 0) || (strpos($fd[1], 'tinyint') === 0) || (strpos($fd[1], 'smallint') === 0) || (strpos($fd[1], 'bigint') === 0))
|
||||
{
|
||||
if (isset($fd[2]) && (strtoupper($fd[2]) == 'UNSIGNED'))
|
||||
{
|
||||
@@ -154,33 +198,33 @@ class db_table_admin
|
||||
}
|
||||
while ($i < count($fd))
|
||||
{
|
||||
switch(strtoupper($fd[$i]))
|
||||
switch (strtoupper($fd[$i]))
|
||||
{
|
||||
case 'NOT' :
|
||||
if (isset($fd[$i+1]) && strtoupper($fd[$i+1]) == 'NULL')
|
||||
case 'NOT':
|
||||
if (isset($fd[$i + 1]) && strtoupper($fd[$i + 1]) == 'NULL')
|
||||
{
|
||||
$i++;
|
||||
$defs['nulltype'] = 'NOT NULL';
|
||||
}
|
||||
else
|
||||
{ // Syntax error
|
||||
echo "Unrecognised word in definition {$i} after 'NOT': ".$fd[$i+1]."<br />";
|
||||
echo "Unrecognised word in definition {$i} after 'NOT': ".$fd[$i + 1]."<br />";
|
||||
}
|
||||
break;
|
||||
case 'DEFAULT' :
|
||||
if (isset($fd[$i+1]))
|
||||
case 'DEFAULT':
|
||||
if (isset($fd[$i + 1]))
|
||||
{
|
||||
$i++;
|
||||
$defs['default'] = $fd[$i];
|
||||
}
|
||||
break;
|
||||
case 'COLLATE' :
|
||||
case 'COLLATE':
|
||||
$i++; // Just skip over - we ignore collation
|
||||
break;
|
||||
case 'AUTO_INCREMENT' :
|
||||
case 'AUTO_INCREMENT':
|
||||
$defs['autoinc'] = TRUE;
|
||||
break;
|
||||
default :
|
||||
default:
|
||||
echo "Unknown definition {$i}: ".$fd[$i]."<br />";
|
||||
}
|
||||
$i++;
|
||||
@@ -196,53 +240,76 @@ class db_table_admin
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!count($ans)) { return FALSE; }
|
||||
if (!count($ans))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
return $ans;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Utility routine - given our array-based definition, create a string MySQL field definition
|
||||
function make_def($list)
|
||||
{
|
||||
switch ($list['type'])
|
||||
{
|
||||
case 'key' :
|
||||
return 'KEY '.$list['name'].' ('.str_replace(array('(',')'),'',$list['keyfield']).')';
|
||||
case 'ukey' :
|
||||
return 'UNIQUE KEY '.$list['name'].' ('.$list['name'].')';
|
||||
case 'pkey' :
|
||||
case 'key':
|
||||
return 'KEY '.$list['name'].' ('.str_replace(array( '(', ')' ), '', $list['keyfield']).')';
|
||||
case 'ukey':
|
||||
return 'UNIQUE KEY '.$list['name'].' ('.str_replace(array( '(', ')' ), '', $list['keyfield']).')';
|
||||
case 'ftkey':
|
||||
return 'FULLTEXT KEY '.$list['name'].' ('.str_replace(array( '(', ')' ), '', $list['keyfield']).')';
|
||||
case 'pkey':
|
||||
return 'PRIMARY KEY ('.$list['name'].')';
|
||||
case 'field' : // Require a field - got a key. so add a field at the end
|
||||
case 'field': // Require a field - got a key. so add a field at the end
|
||||
$def = $list['name'];
|
||||
if (isset($list['fieldtype'])) { $def .= ' '.$list['fieldtype']; }
|
||||
if (isset($list['vartype'])) { $def .= ' '.$list['vartype']; }
|
||||
if (isset($list['nulltype'])) { $def .= ' '.$list['nulltype']; }
|
||||
if (isset($list['default'])) { $def .= ' default '.$list['default']; }
|
||||
if (varsettrue($list['autoinc'])) { $def .= ' auto_increment'; }
|
||||
if (isset($list['fieldtype']))
|
||||
{
|
||||
$def .= ' '.$list['fieldtype'];
|
||||
}
|
||||
if (isset($list['vartype']))
|
||||
{
|
||||
$def .= ' '.$list['vartype'];
|
||||
}
|
||||
if (isset($list['nulltype']))
|
||||
{
|
||||
$def .= ' '.$list['nulltype'];
|
||||
}
|
||||
if (isset($list['default']))
|
||||
{
|
||||
$def .= ' default '.$list['default'];
|
||||
}
|
||||
if (varsettrue($list['autoinc']))
|
||||
{
|
||||
$def .= ' auto_increment';
|
||||
}
|
||||
return $def;
|
||||
}
|
||||
return "Cannot generate definition for: ".$list['type'].' '.$list['name'];
|
||||
}
|
||||
|
||||
|
||||
// Compare two field/index lists as generated by parse_field_defs
|
||||
// If $stop_on_error is TRUE, returns TRUE if the same, false if different
|
||||
// Return a text list of differences, plus an array of MySQL queries to fix
|
||||
// List1 is the reference, List 2 is the actual
|
||||
// This version looks ahead on a failed match, and moves a field up in the table if already defined - should retain as much as possible
|
||||
function compare_field_lists($list1, $list2, $stop_on_error=FALSE)
|
||||
function compare_field_lists($list1, $list2, $stop_on_error = FALSE)
|
||||
{
|
||||
$i = 0; // Counts records in list1 (required format)
|
||||
$j = 0; // Counts records in $created_list (our 'table so far' list)
|
||||
$error_list = array(); // Free text list of differences
|
||||
$change_list = array(); // MySQL statements to implement changes
|
||||
$created_list = array(); // List of field defs that we build up (just names)
|
||||
$error_list = array(
|
||||
); // Free text list of differences
|
||||
$change_list = array(
|
||||
); // MySQL statements to implement changes
|
||||
$created_list = array(
|
||||
); // List of field defs that we build up (just names)
|
||||
while ($i < count($list1))
|
||||
{
|
||||
if (count($list2) == 0)
|
||||
{ // Missing field at end
|
||||
if ($stop_on_error) { return FALSE; }
|
||||
if ($stop_on_error)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
$error_list[] = 'Missing field at end: '.$list1[$i]['name'];
|
||||
$change_list[] = 'ADD '.$this->make_def($list1[$i]);
|
||||
$created_list[$j] = $list1[$i]['name'];
|
||||
@@ -251,15 +318,18 @@ class db_table_admin
|
||||
elseif ($list1[$i]['type'] == $list2[0]['type'])
|
||||
{ // Worth doing a compare - fields are same type
|
||||
// echo $i.': compare - '.$list1[$i]['name'].', '.$list2[0]['name'].'<br />';
|
||||
if (strcasecmp($list1[$i]['name'],$list2[0]['name']) != 0)
|
||||
if (strcasecmp($list1[$i]['name'], $list2[0]['name']) != 0)
|
||||
{ // Names differ, so need to add or subtract a field.
|
||||
// echo $i.': names differ - '.$list1[$i]['name'].', '.$list2[0]['name'].'<br />';
|
||||
if ($stop_on_error) { return FALSE; }
|
||||
if ($stop_on_error)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
$found = FALSE;
|
||||
for ($k = $i+1; $k < count($list1); $k++)
|
||||
for ($k = $i + 1; $k < count($list1); $k++)
|
||||
{
|
||||
// echo "Compare ".$list1[$k]['name'].' with '.$list2[0]['name'];
|
||||
if (strcasecmp($list1[$k]['name'],$list2[0]['name']) == 0)
|
||||
if (strcasecmp($list1[$k]['name'], $list2[0]['name']) == 0)
|
||||
{ // Field in list2 found later in list1; do nothing
|
||||
// echo " - match<br />";
|
||||
$found = TRUE;
|
||||
@@ -280,7 +350,7 @@ class db_table_admin
|
||||
for ($k = 0; $k < count($list2); $k++)
|
||||
{
|
||||
// echo "Compare ".$list1[$i]['name'].' with '.$list2[$k]['name'];
|
||||
if (strcasecmp($list1[$i]['name'],$list2[$k]['name']) == 0)
|
||||
if (strcasecmp($list1[$i]['name'], $list2[$k]['name']) == 0)
|
||||
{ // Field found; we need to move it up
|
||||
// echo " - match<br />";
|
||||
$found = TRUE;
|
||||
@@ -291,8 +361,8 @@ class db_table_admin
|
||||
if ($found)
|
||||
{
|
||||
$error_list[] = 'Field out of position: '.$list2[$k]['name'];
|
||||
$change_list[] = 'MODIFY '.$this->make_def($list1[$i]).(count($created_list) ? ' AFTER '.$created_list[count($created_list)-1] : ' FIRST');
|
||||
array_splice($list2,$k,1); // Finished with this element - delete it, and renumber the keys
|
||||
$change_list[] = 'MODIFY '.$this->make_def($list1[$i]).(count($created_list) ? ' AFTER '.$created_list[count($created_list) - 1] : ' FIRST');
|
||||
array_splice($list2, $k, 1); // Finished with this element - delete it, and renumber the keys
|
||||
$created_list[$j] = $list1[$i]['name'];
|
||||
$j++;
|
||||
// The above also amends any parameters as necessary
|
||||
@@ -302,17 +372,18 @@ class db_table_admin
|
||||
$error_list[] = 'Missing field: '.$list1[$i]['name'].' (found: '.$list2[0]['type'].' '.$list2[0]['name'].')';
|
||||
switch ($list1[$i]['type'])
|
||||
{
|
||||
case 'key' :
|
||||
case 'ukey' :
|
||||
case 'pkey' : // Require a key
|
||||
case 'key':
|
||||
case 'ukey':
|
||||
case 'ftkey':
|
||||
case 'pkey': // Require a key
|
||||
$change_list[] = 'ADD '.$this->make_def($list1[$i]);
|
||||
$error_list[] = 'Missing index: '.$list1[$i]['name'];
|
||||
$created_list[$j] = $list1[$i]['name'];
|
||||
$j++;
|
||||
break;
|
||||
|
||||
case 'field' :
|
||||
$change_list[] = 'ADD '.$this->make_def($list1[$i]).(count($created_list) ? ' AFTER '.$created_list[count($created_list)-1] : ' FIRST');
|
||||
case 'field':
|
||||
$change_list[] = 'ADD '.$this->make_def($list1[$i]).(count($created_list) ? ' AFTER '.$created_list[count($created_list) - 1] : ' FIRST');
|
||||
$error_list[] = 'Missing field: '.$list1[$i]['name'].' (found: '.$list2[0]['type'].' '.$list2[0]['name'].')';
|
||||
$created_list[$j] = $list1[$i]['name'];
|
||||
$j++;
|
||||
@@ -324,14 +395,23 @@ class db_table_admin
|
||||
{ // Field/index is present as required; may be changes though
|
||||
// Any difference and we need to update the table
|
||||
// echo $i.': name match - '.$list1[$i]['name'].'<br />';
|
||||
foreach ($list1[$i] as $fi => $v)
|
||||
foreach ($list1[$i] as $fi=>$v)
|
||||
{
|
||||
$t = $list2[0][$fi];
|
||||
if (stripos($v,'varchar') !== FALSE) { $v = substr($v,3); } // Treat char, varchar the same
|
||||
if (stripos($t,'varchar') !== FALSE) { $t = substr($t,3); } // Treat char, varchar the same
|
||||
if (strcasecmp($t , $v) !== 0)
|
||||
if (stripos($v, 'varchar') !== FALSE)
|
||||
{
|
||||
if ($stop_on_error) { return FALSE; }
|
||||
$v = substr($v, 3);
|
||||
} // Treat char, varchar the same
|
||||
if (stripos($t, 'varchar') !== FALSE)
|
||||
{
|
||||
$t = substr($t, 3);
|
||||
} // Treat char, varchar the same
|
||||
if (strcasecmp($t, $v) !== 0)
|
||||
{
|
||||
if ($stop_on_error)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
$error_list[] = 'Incorrect definition: '.$fi.' = '.$v;
|
||||
$change_list[] = 'MODIFY '.$this->make_def($list1[$i]);
|
||||
break;
|
||||
@@ -345,13 +425,17 @@ class db_table_admin
|
||||
else
|
||||
{ // Field type has changed. We know fields come before indexes. So something's missing
|
||||
// echo $i.': types differ - '.$list1[$i]['type'].' '.$list1[$i]['name'].', '.$list2[$k]['type'].' '.$list2[$k]['name'].'<br />';
|
||||
if ($stop_on_error) { return FALSE; }
|
||||
if ($stop_on_error)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
switch ($list1[$i]['type'])
|
||||
{
|
||||
case 'key' :
|
||||
case 'ukey' :
|
||||
case 'pkey' : // Require a key - got a field, or a key of a different type
|
||||
while ((count($list2)>0) && ($list2[0]['type'] == 'field'))
|
||||
case 'key':
|
||||
case 'ukey':
|
||||
case 'ftkey':
|
||||
case 'pkey': // Require a key - got a field, or a key of a different type
|
||||
while ((count($list2) > 0) && ($list2[0]['type'] == 'field'))
|
||||
{
|
||||
$error_list[] = 'Extra field: '.$list2[0]['name'];
|
||||
$change_list[] = 'DROP '.$list2[0]['name'];
|
||||
@@ -366,12 +450,12 @@ class db_table_admin
|
||||
}
|
||||
break;
|
||||
|
||||
case 'field' : // Require a field - got a key. so add a field at the end
|
||||
case 'field': // Require a field - got a key. so add a field at the end
|
||||
$error_list[] = 'Missing field: '.$list1[$i]['name'].' (found: '.$list2[0]['type'].' '.$list2[0]['name'].')';
|
||||
$change_list[] = 'ADD '.$this->make_def($list1[$i]);
|
||||
break;
|
||||
|
||||
default :
|
||||
default:
|
||||
$error_list[] = 'Unknown field type: '.$list1[$i]['type'];
|
||||
$change_list[] = ''; // Null entry to keep them in step
|
||||
}
|
||||
@@ -386,26 +470,33 @@ class db_table_admin
|
||||
{
|
||||
switch ($f['type'])
|
||||
{
|
||||
case 'key' :
|
||||
case 'ukey' :
|
||||
case 'pkey' : // Require a key - got a field
|
||||
case 'key':
|
||||
case 'ukey':
|
||||
case 'ftkey':
|
||||
case 'pkey': // Require a key - got a field
|
||||
$error_list[] = 'Extra index: '.$list2[0]['name'];
|
||||
$change_list[] = 'DROP INDEX '.$list2[0]['name'];
|
||||
break;
|
||||
case 'field' :
|
||||
case 'field':
|
||||
$error_list[] = 'Extra field: '.$list2[0]['name'];
|
||||
$change_list[] = 'DROP '.$list2[0]['name'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($stop_on_error) return TRUE; // If doing a simple comparison and we get to here, all matches
|
||||
return array($error_list, $change_list);
|
||||
if ($stop_on_error)
|
||||
return TRUE; // If doing a simple comparison and we get to here, all matches
|
||||
return array(
|
||||
$error_list, $change_list
|
||||
);
|
||||
}
|
||||
|
||||
function make_changes_list($result)
|
||||
{
|
||||
if (!is_array($result)) { return "Not an array<br />"; }
|
||||
if (!is_array($result))
|
||||
{
|
||||
return "Not an array<br />";
|
||||
}
|
||||
$text = "<table>";
|
||||
for ($i = 0; $i < count($result[0]); $i++)
|
||||
{
|
||||
@@ -417,11 +508,13 @@ class db_table_admin
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
||||
// Return a table of info from the output of get_table_def
|
||||
function make_table_list($result)
|
||||
{
|
||||
if (!is_array($result)) { return "Not an array<br />"; }
|
||||
if (!is_array($result))
|
||||
{
|
||||
return "Not an array<br />";
|
||||
}
|
||||
$text = "<table>";
|
||||
for ($i = 0; $i < count($result); $i++)
|
||||
{
|
||||
@@ -434,27 +527,32 @@ class db_table_admin
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
||||
// Return a table of info from the output of parse_field_defs()
|
||||
function make_field_list($fields)
|
||||
{
|
||||
$text = "<table>";
|
||||
foreach ($fields as $f)
|
||||
{
|
||||
switch($f['type'])
|
||||
switch ($f['type'])
|
||||
{
|
||||
case 'pkey' :
|
||||
case 'pkey':
|
||||
$text .= "<tr><td>PRIMARY KEY</td><td>{$f['name']}</td><td> </td></tr>";
|
||||
break;
|
||||
case 'ukey' :
|
||||
case 'ukey':
|
||||
$text .= "<tr><td>UNIQUE KEY</td><td>{$f['name']}</td><td>{$f['keyfield']}</td></tr>";
|
||||
break;
|
||||
case 'key' :
|
||||
case 'ftkey':
|
||||
$text .= "<tr><td>FULLTEXT KEY</td><td>{$f['name']}</td><td>{$f['keyfield']}</td></tr>";
|
||||
break;
|
||||
case 'key':
|
||||
$text .= "<tr><td>KEY</td><td>{$f['name']}</td><td>{$f['keyfield']}</td></tr>";
|
||||
break;
|
||||
case 'field' :
|
||||
case 'field':
|
||||
$text .= "<tr><td>FIELD</td><td>{$f['name']}</td><td>{$f['fieldtype']}";
|
||||
if (isset($f['vartype'])) { $text .= " ".$f['vartype']; }
|
||||
if (isset($f['vartype']))
|
||||
{
|
||||
$text .= " ".$f['vartype'];
|
||||
}
|
||||
$text .= "</td>";
|
||||
if (isset($f['nulltype']))
|
||||
{
|
||||
@@ -478,7 +576,7 @@ class db_table_admin
|
||||
}
|
||||
$text .= "</tr>";
|
||||
break;
|
||||
default :
|
||||
default:
|
||||
$text .= "<tr><td>!!Unknown!!</td><td>{$f['type']}</td><td> </td></tr>";
|
||||
}
|
||||
}
|
||||
@@ -486,9 +584,6 @@ class db_table_admin
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
// Update a table to required structure
|
||||
//--------------------------------------------------
|
||||
@@ -499,7 +594,7 @@ class db_table_admin
|
||||
// Return text string if $justCheck is TRUE and changes needed
|
||||
// Return text string on most failures
|
||||
// Return FALSE on certain failures (generally indicative of code/system problems)
|
||||
function update_table_structure($newStructure, $justCheck=FALSE, $makeNewifNotExist = TRUE, $mlUpdate = FALSE)
|
||||
function update_table_structure($newStructure, $justCheck = FALSE, $makeNewifNotExist = TRUE, $mlUpdate = FALSE)
|
||||
{
|
||||
global $sql;
|
||||
// Pull out table name
|
||||
@@ -508,12 +603,21 @@ class db_table_admin
|
||||
$tableName = $newStructure[1];
|
||||
if (!$sql->db_Table_exists($tableName))
|
||||
{
|
||||
if ($makeNewifNotExist === FALSE) { return 'Table doesn\'t exist'; }
|
||||
if ($sql->db_Select_gen($newStructure[0])) { return TRUE; }
|
||||
if ($makeNewifNotExist === FALSE)
|
||||
{
|
||||
return 'Table doesn\'t exist';
|
||||
}
|
||||
if ($sql->db_Select_gen($newStructure[0]))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return 'Error creating new table: '.$tableName;
|
||||
}
|
||||
$reqFields = $this->parse_field_defs($newStructure[2]); // Required field definitions
|
||||
if ($debugLevel) { echo "Required table structure: <br />".$this->make_field_list($reqFields); }
|
||||
if ($debugLevel)
|
||||
{
|
||||
echo "Required table structure: <br />".$this->make_field_list($reqFields);
|
||||
}
|
||||
|
||||
if ((($actualDefs = $this->get_current_table($tableName)) === FALSE) || !is_array($actualDefs)) // Get actual table definition (Adds current default prefix)
|
||||
{
|
||||
@@ -523,16 +627,28 @@ class db_table_admin
|
||||
{
|
||||
// echo $db_parser->make_table_list($actual_defs);
|
||||
$actualFields = $this->parse_field_defs($actualDefs[0][2]); // Split into field definitions
|
||||
if ($debugLevel) { echo 'Actual table structure: <br />'.$this->make_field_list($actualFields); }
|
||||
if ($debugLevel)
|
||||
{
|
||||
echo 'Actual table structure: <br />'.$this->make_field_list($actualFields);
|
||||
}
|
||||
|
||||
$diffs = $this->compare_field_lists($reqFields,$actualFields); // Work out any differences
|
||||
$diffs = $this->compare_field_lists($reqFields, $actualFields); // Work out any differences
|
||||
if (count($diffs[0]))
|
||||
{ // Changes needed
|
||||
if ($justCheck) { return 'Field changes rqd; table: '.$tableName.'<br />'; }
|
||||
if ($justCheck)
|
||||
{
|
||||
return 'Field changes rqd; table: '.$tableName.'<br />';
|
||||
}
|
||||
// Do the changes here
|
||||
if ($debugLevel) { echo "List of changes found:<br />".$this->make_changes_list($diffs); }
|
||||
$qry = 'ALTER TABLE '.MPREFIX.$tableName.' '.implode(', ',$diffs[1]);
|
||||
if ($debugLevel) { echo 'Update Query used: '.$qry.'<br />'; }
|
||||
if ($debugLevel)
|
||||
{
|
||||
echo "List of changes found:<br />".$this->make_changes_list($diffs);
|
||||
}
|
||||
$qry = 'ALTER TABLE '.MPREFIX.$tableName.' '.implode(', ', $diffs[1]);
|
||||
if ($debugLevel)
|
||||
{
|
||||
echo 'Update Query used: '.$qry.'<br />';
|
||||
}
|
||||
if ($mlUpdate)
|
||||
{
|
||||
$ret = $sql->db_Query_all($qry); // Returns TRUE = success, FALSE = fail
|
||||
@@ -543,7 +659,7 @@ class db_table_admin
|
||||
}
|
||||
if ($ret === FALSE)
|
||||
{
|
||||
return $sql->dbError() ;
|
||||
return $sql->dbError();
|
||||
}
|
||||
}
|
||||
return TRUE; // Success even if no changes required
|
||||
@@ -551,22 +667,24 @@ class db_table_admin
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
function createTable($pathToSqlFile='', $tableName='', $addPrefix=true, $renameTable='')
|
||||
function createTable($pathToSqlFile = '', $tableName = '', $addPrefix = true, $renameTable = '')
|
||||
{
|
||||
$e107 = e107::getInstance();
|
||||
$tmp = $this->get_table_def($tableName, $pathToSqlFile);
|
||||
$createText = $tmp[0][0];
|
||||
$newTableName = ($renameTable ? $renameTable : $tableName);
|
||||
if($addPrefix) { $newTableName = MPREFIX.$newTableName; }
|
||||
if($newTableName != $tableName)
|
||||
if ($addPrefix)
|
||||
{
|
||||
$newTableName = MPREFIX.$newTableName;
|
||||
}
|
||||
if ($newTableName != $tableName)
|
||||
{
|
||||
$createText = preg_replace('#create +table +(\w*?) +#i', 'CREATE TABLE '.$newTableName.' ', $createText);
|
||||
}
|
||||
return $e107->sql->db_Select_gen($createText);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user