_app = vFactory::getApplication(); $this->_db = vFactory::getDbo(); // $this->_oldToNew = new stdClass(); $this->starttime = microtime(true); $max_execution_time = VmConfig::getExecutionTime(); $jrmax_execution_time= vRequest::getInt('max_execution_time',300); if(!empty($jrmax_execution_time)){ // vmdebug('$jrmax_execution_time',$jrmax_execution_time); if($max_execution_time!==$jrmax_execution_time) @ini_set( 'max_execution_time', $jrmax_execution_time ); } $this->maxScriptTime = VmConfig::getExecutionTime() * 0.90-1; //Lets use 10% of the execution time as reserve to store the progress VmConfig::ensureMemoryLimit(128); $this->maxMemoryLimit = $this->return_bytes(ini_get('memory_limit')) * 0.85; $config = vFactory::getConfig(); $this->_prefix = $config->get('dbprefix'); $this->reCreaPri = VmConfig::get('reCreaPri',0); $this->reCreaKey = VmConfig::get('reCreaKey',1); } var $tables = array( 'products'=>'virtuemart_product_id', 'vendors'=>'virtuemart_vendor_id', 'categories'=>'virtuemart_category_id', 'manufacturers'=>'virtuemart_manufacturer_id', 'manufacturercategories'=>'virtuemart_manufacturercategories_id', 'paymentmethods'=>'virtuemart_paymentmethod_id', 'shipmentmethods'=>'virtuemart_shipmentmethod_id'); /** * * * @author Max Milbers * @param unknown_type $config */ public function createLanguageTables($langs=0){ if(empty($langs)){ $langs = VmConfig::get('active_languages'); if(empty($langs)){ $params = JComponentHelper::getParams('com_languages'); $langs = (array)$params->get('site', 'en-GB'); } } $langTables = array(); //Todo add the mb_ stuff here // vmTime('my langs
'.print_r($langs,1).'
'); $i = 0; foreach($this->tables as $table=>$tblKey){ // if($i>1) continue; $className = 'Table'.ucfirst ($table); if(!class_exists($className)) require(VMPATH_ADMIN.DS.'tables'.DS.$table.'.php'); $tableName = '#__virtuemart_'.$table; $langTable = $this->getTable($table); $translatableFields = $langTable->getTranslatableFields(); if(empty($translatableFields)) continue; $fields = array(); $lines = array(); $linedefault = "NOT NULL DEFAULT ''"; //Text has no default $linedefaulttext = "NOT NULL"; $fields[$tblKey] = 'int(1) UNSIGNED NOT NULL'; // vmdebug('createLanguageTables ',$translatableFields); //set exceptions from normal shema here ! //Be aware that you can use this config settings, when declaring them in the virtuemart.cfg if(VmConfig::get('dblayoutstrict',true)){ if($table=='products'){ $fields['product_s_desc'] = 'varchar('.VmConfig::get('dbpsdescsize',2000).') '.$linedefault; $fields['product_desc'] = 'varchar('.VmConfig::get('dbpdescsize',18400).') '.$linedefault; $key = array_search('product_desc', $translatableFields); unset($translatableFields[$key]); $key = array_search('product_s_desc', $translatableFields); unset($translatableFields[$key]); } else if($table=='vendors'){ //This makes too much trouble with the vendor stuff, so we use simply text for it // $fields['vendor_store_desc'] = 'varchar('.VmConfig::get('dbvdescsize',1800).') '.$linedefault; // $fields['vendor_terms_of_service'] = 'varchar('.VmConfig::get('dbtossize',18100).') '.$linedefault; // $fields['vendor_legal_info'] = 'varchar('.VmConfig::get('dblegalsize',1100).') '.$linedefault; $fields['vendor_store_desc'] = 'text '.$linedefaulttext; $fields['vendor_terms_of_service'] = 'text '.$linedefaulttext; $fields['vendor_legal_info'] = 'text '.$linedefaulttext; $fields['vendor_letter_css'] = 'text '.$linedefaulttext; $fields['vendor_letter_header_html'] = "varchar(8000) NOT NULL DEFAULT '

{vm:vendorname}

{vm:vendoraddress}

'"; $fields['vendor_letter_footer_html'] = "varchar(8000) NOT NULL DEFAULT '

{vm:vendorlegalinfo}
Page {vm:pagenum}/{vm:pagecount}

'"; $key = array_search('vendor_store_desc', $translatableFields); unset($translatableFields[$key]); $key = array_search('vendor_terms_of_service', $translatableFields); unset($translatableFields[$key]); $key = array_search('vendor_legal_info', $translatableFields); unset($translatableFields[$key]); $key = array_search('vendor_letter_css', $translatableFields); unset($translatableFields[$key]); $key = array_search('vendor_letter_header_html', $translatableFields); unset($translatableFields[$key]); $key = array_search('vendor_letter_footer_html', $translatableFields); unset($translatableFields[$key]); } } else { vmdebug('dblayoutstrict false'); $fields['vendor_terms_of_service'] = 'text '.$linedefaulttext; $key = array_search('vendor_terms_of_service', $translatableFields); unset($translatableFields[$key]); $fields['vendor_legal_info'] = 'text '.$linedefaulttext; $key = array_search('vendor_legal_info', $translatableFields); unset($translatableFields[$key]); } // vmdebug('createLanguageTables ',$translatableFields); foreach($translatableFields as $k => $name){ if(strpos($name,'name') !==false ){ $fields[$name] = 'varchar('.VmConfig::get('dbnamesize',180).') '.$linedefault; } else if(strpos($name,'metadesc')!==false ){ $fields[$name] = 'varchar('.VmConfig::get('dbmetasize',400).') '.$linedefault; } else if(strpos($name,'metatitle')!==false ){ $fields[$name] = 'varchar('.VmConfig::get('dbmetasize',100).') '.$linedefault; } else if(strpos($name,'metakey')!==false ){ $fields[$name] = 'varchar('.VmConfig::get('dbmetasize',400).') '.$linedefault; } else if(strpos($name,'metaauthor')!==false ){ $fields[$name] = 'varchar(64) '.$linedefault; } else if(strpos($name,'slug')!==false ){ $fields[$name] = 'varchar('.VmConfig::get('dbslugsize',192).') '.$linedefault; $slug = true; }else if(strpos($name,'phone')!==false) { $fields[$name] = 'varchar(26) '.$linedefault; }else if(strpos($name,'desc')!==false) { if(VmConfig::get('dblayoutstrict',true)){ $fields[$name] = 'varchar('.VmConfig::get('dbdescsize',19000).') '.$linedefault; } else { $fields[$name] = 'text '.$linedefaulttext; } } else { $fields[$name] = 'varchar(255) '.$linedefault; } } $lines[0] = $fields; if($slug){ $lines[1][$tblKey] = 'PRIMARY KEY (`'.$tblKey.'`)'; $lines[1]['slug'] = 'UNIQUE KEY `slug` (`slug`)'; //a slug must anyway be unique and so one index for both is faster //testing revealed that it is slower //$lines[1][$tblKey] = 'PRIMARY KEY (`'.$tblKey.'`,`slug`)'; } else { $lines[1][$tblKey] = 'PRIMARY KEY (`'.$tblKey.'`)'; } $table[3] = ''; foreach($langs as $lang){ // $lang = strtr($lang,'-','_'); $lang = strtolower(strtr($lang,'-','_')); $tbl_lang = $tableName.'_'.$lang; $langTables[$tbl_lang] = $lines; } $i++; } $this->reCreaPri = 1; $ret = $this->updateMyVmTables($langTables); // vmTime('done creation of lang tables'); return $ret; } public function getTablesBySql($file){ if(!file_exists($file)){ vmError('Could not execute sql, could not find file '.$file); return false; } $data = fopen($file, 'r'); $tables = array(); $tableDefStarted = false; while ($line = fgets ($data)) { $line = trim($line); if (empty($line)) continue; // Empty line if (strpos($line, '#') === 0) continue; // Commentline if (strpos($line, '--') === 0) continue; // Commentline if(strpos($line,'CREATE TABLE IF NOT EXISTS')!==false){ $tableDefStarted = true; $fieldLines = array(); $tableKeys = array(); $start = strpos($line,'`'); $tablename = trim(substr($line,$start+1,-3)); // vmdebug('my $tablename ',$start,$end,$line); } else if($tableDefStarted && (strpos($line,'KEY')!==false or strpos($line,'UNIQUE')!==false)){ $start = strpos($line,"`"); $temp = substr($line,$start+1); $end = strpos($temp,"`"); $keyName = substr($temp,0,$end); if(strrpos($line,',')==strlen($line)-1){ $line = substr($line,0,-1); } $tableKeys[$keyName] = $line; } else if(strpos($line,'ENGINE')!==false or strpos($line,'COMMENT=')!==false){ $tableDefStarted = false; $tl = strtolower($line); if(strpos($tl,'myisam')!==false){ $engine = 'MyISAM'; } else if(strpos($tl,'innodb')!==false){ $engine = 'InnoDB'; } else if(strpos($tl,'memory')!==false){ $engine = 'Memory'; } else { $engine = 'MyISAM'; } $start = strpos($line,"COMMENT='"); $temp = substr($line,$start+9); $end = strpos($temp,"'"); $comment = substr($temp,0,$end); $tables[$tablename] = array($fieldLines, $tableKeys,$comment,$engine); } else if($tableDefStarted){ $start = strpos($line,"`"); $temp = substr($line,$start+1); $end = strpos($temp,"`"); $keyName = substr($temp,0,$end); if(empty($keyName)){ $m = 'getTablesBySql empty $keyName line: '.$line .' file: '. $file; //vmError($m,$m); //$tableDefStarted = false; } else { $line = trim(substr($line,$end+2)); if(strrpos($line,',')==strlen($line)-1){ $line = substr($line,0,-1); } $fieldLines[$keyName] = $line; } } } fclose($data); return $tables; } public function updateMyVmTables($file = 0, $like ='_virtuemart_'){ if(empty($file)){ $file = VMPATH_ADMIN.DS.'install'.DS.'install.sql'; } if(is_array($file)){ $tables = $file; } else { $tables = $this->getTablesBySql($file); } //vmdebug('updateMyVmTables $tables',$tables); return false; // vmdebug('Parsed tables',$tables); //return; $this->_db->setQuery('SHOW TABLES LIKE "%'.$like.'%"'); if (!$existingtables = $this->_db->loadColumn()) { vmError('updateMyVmTables '.$this->_db->getErrorMsg()); return false; } $i = 0; $demandedTables = array(); //TODO ignore admin menu table foreach ($tables as $tablename => $table){ // if($i>2) continue; $tablename = str_replace('#__',$this->_prefix,$tablename); $demandedTables[] = $tablename; if(in_array($tablename,$existingtables)){ /*$q = 'LOCK TABLES `'.$tablename.'` WRITE'; $this->_db->setQuery($q); $this->_db->execute();*/ if(!isset($table[3])) $table[3] = 'MyISAM'; if(empty($this->reCreaKey)) $table[1] = false; $this->alterColumns($tablename,$table); usleep(10); $this->optimizeTable($tablename); usleep(10); /*$q = 'UNLOCK TABLES'; $this->_db->setQuery($q); $this->_db->execute();*/ } else { $this->createTable($tablename,$table); } $i++; } } public function optimizeTable($tablename){ //There is a bug, which can make your table unaccessable /*$q ='OPTIMIZE TABLE '.$tablename; $this->_db->setQuery($q); $res1 = $this->_db->execute();*/ $q = 'Show Index FROM '.$tablename; $this->_db->setQuery($q); $res2 = $this->_db->loadAssocList(); //vmdebug('Optimised table '.$tablename,$res1,$res2); /*foreach($res2 as $m){ vmdebug($tablename.': '.$m['Key_name'].' '.$m['Cardinality']); }*/ } public function createTable($tablename,$table){ $q = 'CREATE TABLE IF NOT EXISTS `'.$tablename.'` ( '; foreach($table[0] as $fieldname => $alterCommand){ $q .= '`'.$fieldname.'` '.$alterCommand.', '; } foreach($table[1] as $name => $value){ $q .= $value.', '; } $q = substr(trim($q),0,-1); $comment = ''; if(!empty($table[3])){ $comment = " COMMENT='".$table[3]."'"; } $q .= ") ENGINE=MyISAM DEFAULT CHARSET=utf8 ".$comment." AUTO_INCREMENT=1 ;"; $this->_db->setQuery($q); if(!$this->_db->execute()){ vmError('createTable ERROR :'.$this->_db->getErrorMsg() ); } else { vmInfo('created table '.$tablename); } // $this->_app->enqueueMessage($q); } public function dropTables($todelete){ if(empty($todelete)) return; $q = 'DROP ';// .implode(',',$todelete); foreach($todelete as $tablename){ $tablename = str_replace('#__',$this->_prefix,$tablename); $q .= $tablename.', '; } $q = substr($q,0,-1); // $this->_db->setQuery($q); // if(!$this->_db->query()){ // $this->_app->enqueueMessage('dropTables ERROR :'.$this->_db->getErrorMsg() ); // } $this->_app->enqueueMessage($q); } private function alterKey($tablename,$keys){ if((microtime(true)-$this->starttime) >= ($this->maxScriptTime)){ vmWarn('compareUpdateTable alterKey not finished, please rise execution time and update tables again'); return false; } $demandedFieldNames = array(); foreach($keys as $i=>$line){ $demandedFieldNames[] = $i; } $query = "SHOW INDEXES FROM `".$tablename."` "; //SHOW {INDEX | INDEXES | KEYS} $this->_db->setQuery($query); $eKeys = $this->_db->loadObjectList(); $tkeys=array(); $keyT = $keys; //Lets check if something changed foreach($keyT as $name =>$value) { $k = new stdClass(); if($p = strpos( $value, 'PRIMARY' ) !== false) { if(strpos( $value, '`' ) !== false) { $spl = explode('`', $value); $k->Key_name = 'PRIMARY'; $k->Column_name = $spl[1]; $k->Non_unique=0; $tkeys[$k->Key_name] = $k; continue; } } if($p = strpos( $value, 'UNIQUE' ) !== false) { $k->Non_unique=0; $value = trim(substr($value,$p)); } else { $k->Non_unique=1; } if(strpos( $value, '`' ) !== false) { $spl = explode('`', $value); //We dont prevent drop and add of double keys if(!isset($spl[5])) { $k->Key_name = $spl[1]; $k->Column_name = $spl[3]; $tkeys[$k->Column_name] = $k; } /*$tkeys[$k->Column_name] = $k; if(isset($spl[5])) { $k2 = clone($k); $k2->Column_name = $spl[5]; $tkeys[$k2->Column_name] = $k2; }*/ } } foreach($eKeys as $i => $eKey) { if($eKey->Key_name == 'PRIMARY'){ $t = $tkeys['PRIMARY']; if($eKey->Column_name==$t->Column_name and $eKey->Non_unique==$t->Non_unique){ unset($keys[$eKey->Column_name]); unset($eKeys[$i]); } else { vmdebug('my primary',$eKey); } } else { if(isset($tkeys[$eKey->Column_name])) { $t = $tkeys[$eKey->Column_name]; if($eKey->Key_name==$t->Key_name and $eKey->Non_unique==$t->Non_unique){ unset($keys[$eKey->Key_name]); unset($eKeys[$i]); } else { //vmdebug('my $tkeys',$eKey,$t,$keys[$eKey->Key_name]); } } } } $ok=true; $primaryFound = false; foreach($eKeys as $i => $eKey) { if(strpos( $eKey->Key_name, 'PRIMARY' ) !== false) { $primaryFound = true; continue; } if(empty($eKey->Key_name)) continue; $query = "SHOW INDEXES FROM `".$tablename."` "; $this->_db->setQuery($query); $eKeyNamesNOW = $this->_db->loadColumn(2); if(!in_array($eKey->Key_name,$eKeyNamesNOW)) continue; $query = 'ALTER TABLE `'.$tablename.'` DROP INDEX `'.$eKey->Key_name.'` '; $this->_db->setQuery($query); $ok =$this->_db->execute(); if(!$ok){ $this->_app->enqueueMessage('alterTable DROP INDEX '.$tablename.'.'.$eKey->Key_name.' :'.$this->_db->getErrorMsg() ); } else { //$dropped++; //vmdebug('alterKey: Dropped KEY `'.$eKey->Key_name.'` in table `'.$tablename.'`'); } } foreach($keys as $name =>$value){ if($primaryFound and strpos($value,'PRIMARY')!==false){ if(strpos($value,'PRIMARY')!==false){ continue; } } $query = "ALTER TABLE `".$tablename."` ADD ".$value ; $action = 'ADD'; if(!empty($query)){ $this->_db->setQuery($query); if(!$this->_db->execute()){ $this->_app = vFactory::getApplication(); $this->_app->enqueueMessage('alterKey '.$action.' INDEX '.$name.': '.$this->_db->getErrorMsg() ); } else { //vmdebug('alterKey: a:'.$action.' KEY `'.$name.'` in table `'.$tablename.'` '.$this->_db->getQuery()); } } } } function reCreateKeyByTableAttributes($keyAttribs){ $oldkey =''; if(!empty($keyAttribs->Key_name) && !empty($keyAttribs->Column_name) ){ if(!$keyAttribs->Non_unique){ $oldkey = 'UNIQUE '; //$oldkey = 'PRIMARY KEY (`'.$keyAttribs->Column_name.'`)'; } //else { $oldkey .= 'KEY `'.$keyAttribs->Key_name.'` (`'.$keyAttribs->Column_name.'`)'; //} } else { vmdebug('reCreateKeyByTableAttributes $keyAttribs empty?',$keyAttribs); } // if(empty($keyAttribs->Cardinality)){ // vmdebug('Cardinality : '.$keyAttribs->Cardinality.' '.$oldkey); // } return $oldkey; } /** * @author Max Milbers * @param unknown_type $tablename * @param unknown_type $fields * @param unknown_type $command */ public function alterColumns($tablename,$tableDef){ $after =' FIRST'; $dropped = 0; $altered = 0; $added = 0; $toRepeat = false; $this->_app = vFactory::getApplication(); $fields = isset($tableDef[0]) ? $tableDef[0]:false; $keys = isset($tableDef[1]) ? $tableDef[1]:false; $engine = isset($tableDef[3]) ? $tableDef[3]:false; $demandFieldNames = array(); foreach($fields as $i=>$line){ $demandFieldNames[] = $i; } $q = 'SHOW FULL COLUMNS FROM `'.$tablename.'` '; //$q = 'SHOW CREATE TABLE '.$this->_tbl; $this->_db->setQuery($q); $fullColumns = $this->_db->loadObjectList(); $columns = $this->_db->loadColumn(0); //vmdebug('alterColumns',$fullColumns); //Attention user_infos is not in here, because it an contain customised fields. #__virtuemart_order_userinfos #__virtuemart_userinfos //This is currently not working as intended, because the config is not deleted before, it is better to create an extra command for this, when we need it later foreach($fields as $fieldname => $alterCommand){ if((microtime(true)-$this->starttime) >= ($this->maxScriptTime)){ vmWarn('alterColumns alterKey not finished, please rise execution time and update tables again'); return false; } $query=''; $action = ''; if(empty($alterCommand)){ vmdebug('empty alter command '.$fieldname); continue; } if(in_array($fieldname,$columns)){ $key=array_search($fieldname, $columns); $oldColumn = $this->reCreateColumnByTableAttributes($fullColumns[$key]); // while (strpos($oldColumn,' ')){ // str_replace(' ', ' ', $oldColumn); // } while (strpos($alterCommand,' ')){ $alterCommand = str_replace(' ', ' ', trim($alterCommand)); } $oldColumn = strtoupper($oldColumn); $alterCommand = strtoupper(trim($alterCommand)); if ($oldColumn != $alterCommand ) { $pr = ''; //If the field is an auto_increment, we add to the sql the creation of the primary key if( strpos($alterCommand,'AUTO_INCREMENT')!==false xor strpos($oldColumn,'AUTO_INCREMENT')!==false){ $pr = ', ADD PRIMARY KEY (`'.$fieldname.'`)'; //This function drops the key only if existing $this->dropPrimaryKey($tablename); } $query = 'ALTER TABLE `'.$tablename.'` CHANGE COLUMN `'.$fieldname.'` `'.$fieldname.'` '.$alterCommand.' '.$after.$pr; $action = 'CHANGE'; $altered++; vmdebug('alterColumns '.$tablename,$fieldname,$oldColumn,$alterCommand); } } else { $pr = ''; if(strpos($alterCommand,'AUTO_INCREMENT')!==false ){ $pr = ', ADD PRIMARY KEY (`'.$fieldname.'`)'; $this->dropPrimaryKey($tablename); } $query = 'ALTER TABLE `'.$tablename.'` ADD `'.$fieldname.'` '.$alterCommand.' '.$after.$pr; $action = 'ADD'; $added++; vmdebug('alterColumns ADD '.$query); } if (!empty($query)) { $this->_db->setQuery($query); $msg = 'alterTable '.$action.' '.$tablename.'.'.$fieldname; if(!$this->_db->execute() ){ vmError( $msg, $msg.$query ); } else { vmInfo( $msg ); } } $after = ' AFTER `'.$fieldname.'` '; } if($keys){ $this->alterKey($tablename,$keys,false); if($toRepeat){ vmdebug('Created keys, writing now field with autoincrement',$tablename,$toRepeat); $this->alterColumns($tablename,$toRepeat); } } if(VmConfig::get('updEngine',true)){ $q = 'SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME = "'.$tablename.'" '; $this->_db->setQuery( $q ); $exEngine = $this->_db->loadResult(); if(!empty($engine) and strtoupper( $exEngine ) != strtoupper( $engine )) { $q = 'ALTER TABLE '.$tablename.' ENGINE='.$engine; $this->_db->setQuery( $q ); $this->_db->execute(); vmdebug( 'Changed engine '.$exEngine.' of table '.$tablename.' to '.$engine, $exEngine ); } } if($dropped != 0 or $altered !=0 or $added!=0){ $this->_app->enqueueMessage('Table updated: Tablename '.$tablename.' dropped: '.$dropped.' altered: '.$altered.' added: '.$added); $err = $this->_db->getErrorMsg(); if(!empty($err)){ vmError('Tableupdater updating table '.$tablename.' throws error '.$err); } } return true; } /** * This function drops the key only if existing and removes before the auto_increment attribute from the column * @author Max Milbers * @param $tablename * @return bool */ public function dropPrimaryKey($tablename){ $q = 'SHOW INDEXES FROM `'.$tablename.'` WHERE Key_name = "PRIMARY";'; $this->_db->setQuery($q); $this->_db->execute(); $res = $this->_db->loadAssoc(); if($res){ //We check if there is an auto_increment field and disable it $q = 'SHOW FULL COLUMNS FROM `'.$tablename.'` WHERE Extra = "auto_increment";'; //$q = 'SHOW CREATE TABLE '.$this->_tbl; $this->_db->setQuery($q); $column = $this->_db->loadObject(); if($column){ $old = $this->reCreateColumnByTableAttributes($column); $old = trim(str_replace('AUTO_INCREMENT', '',$old)); $q = 'ALTER TABLE `'.$tablename.'` CHANGE COLUMN `'.$column->Field.'` `'.$column->Field.'` '.$old; $this->_db->setQuery($q); if(!$this->_db->execute() ){ vmError( 'Could not alter auto_increment column dropping primary '.$q ); } } $q = 'ALTER TABLE `'.$tablename.'` DROP PRIMARY KEY;'; $this->_db->setQuery($q); if(!$this->_db->execute() ){ vmError( 'Could not drop Primary for CHANGE '.$q ); } else { vmdebug('dropPrimaryKey '.$tablename); } } return true; } public function deleteColumns($tablename,$fields){ $dropped = 0; $q = 'SHOW FULL COLUMNS FROM `'.$tablename.'` '; //$q = 'SHOW CREATE TABLE '.$this->_tbl; $this->_db->setQuery($q); //$fullColumns = $this->_db->loadObjectList(); $columns = $this->_db->loadColumn(0); $demandFieldNames = array(); foreach($fields as $i=>$line){ $demandFieldNames[] = $i; } $upDelCols = (int) VmConfig::get('updelcols',0); if($upDelCols==1 and !($tablename==$this->_prefix.'virtuemart_userfields' or $tablename==$this->_prefix.'virtuemart_userinfos' or $tablename==$this->_prefix.'virtuemart_order_userinfos')){ foreach($columns as $fieldname){ if(!in_array($fieldname, $demandFieldNames)){ $query = 'ALTER TABLE `'.$tablename.'` DROP COLUMN `'.$fieldname.'` '; $action = 'DROP'; $dropped++; $this->_db->setQuery($query); if(!$this->_db->execute()){ vmError('alterTable '.$action.' '.$tablename.'.'.$fieldname.' :'.$this->_db->getErrorMsg() ); } } } } return $dropped; } private function reCreateColumnByTableAttributes($fullColumn){ $oldColumn = $fullColumn->Type; if(!empty($fullColumn->Null)){ $oldColumn .= $this->notnull($fullColumn->Null).$this->getdefault($fullColumn->Default); } $oldColumn .= $this->formatExtra($fullColumn->Extra).$this->formatComment($fullColumn->Comment); return trim($oldColumn); } private function formatComment($comment){ if(!empty($comment)){ return ' COMMENT \''.$comment.'\''; } else { return ''; } } private function notnull($string){ if ($string=='NO') { return ' NOT NULL'; } else { return ''; } } private function formatExtra($extra){ if (!empty($extra)) { return ' '.strtoupper(trim($extra)); } else { return ''; } } private function primarykey($string){ if ($string=='PRI') { return ' AUTO_INCREMENT'; } else { return ''; } } private function getdefault($string){ if (isset($string)) { if(strpos($string,'CURRENT_TIMESTAMP')!==FALSE){ return " DEFAULT ".trim($string); } else { return " DEFAULT '".trim($string)."'"; } } else { return ''; } } private function return_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } function loadCountListContinue($q,$startLimit,$maxItems,$msg){ $continue = true; $this->_db->setQuery($q); if(!$this->_db->execute()){ vmError($msg.' db error '. $this->_db->getErrorMsg()); vmError($msg.' db error '. $this->_db->getQuery()); $entries = array(); $continue = false; } else { $entries = $this->_db->loadAssocList(); $count = count($entries); vmInfo($msg. ' found '.$count.' vm1 entries for migration '); $startLimit += $maxItems; if($count<$maxItems){ $continue = false; } } return array($entries,$startLimit,$continue); } }