function db_table_fix_sql($schema1, $schema2, $strict = false) { if (empty($schema1)) { return array(db_table_create_sql($schema2)); } $diff = $result = db_schema_compare($schema1, $schema2); if (!empty($diff['diffs']['tablename'])) { return array(db_table_create_sql($schema2)); } $sqls = array(); if (!empty($diff['diffs']['engine'])) { $sqls[] = "ALTER TABLE `{$schema1['tablename']}` ENGINE = {$schema2['engine']}"; } if (!empty($diff['diffs']['charset'])) { $pieces = explode('_', $schema2['charset']); $charset = $pieces[0]; $sqls[] = "ALTER TABLE `{$schema1['tablename']}` DEFAULT CHARSET = {$charset}"; } if (!empty($diff['fields'])) { if (!empty($diff['fields']['less'])) { foreach ($diff['fields']['less'] as $fieldname) { $field = $schema2['fields'][$fieldname]; $piece = _db_build_field_sql($field); if (!empty($field['rename']) && !empty($schema1['fields'][$field['rename']])) { $sql = "ALTER TABLE `{$schema1['tablename']}` CHANGE `{$field['rename']}` `{$field['name']}` {$piece}"; unset($schema1['fields'][$field['rename']]); } else { if ($field['position']) { $pos = ' ' . $field['position']; } $sql = "ALTER TABLE `{$schema1['tablename']}` ADD `{$field['name']}` {$piece}{$pos}"; } $primary = array(); $isincrement = array(); if (strexists($sql, 'AUTO_INCREMENT')) { $isincrement = $field; $sql = str_replace('AUTO_INCREMENT', '', $sql); foreach ($schema1['fields'] as $field) { if ($field['increment'] == 1) { $primary = $field; break; } } if (!empty($primary)) { $piece = _db_build_field_sql($primary); if (!empty($piece)) { $piece = str_replace('AUTO_INCREMENT', '', $piece); } $sqls[] = "ALTER TABLE `{$schema1['tablename']}` CHANGE `{$primary['name']}` `{$primary['name']}` {$piece}"; } } $sqls[] = $sql; } } if (!empty($diff['fields']['diff'])) { foreach ($diff['fields']['diff'] as $fieldname) { $field = $schema2['fields'][$fieldname]; $piece = _db_build_field_sql($field); if (!empty($schema1['fields'][$fieldname])) { $sqls[] = "ALTER TABLE `{$schema1['tablename']}` CHANGE `{$field['name']}` `{$field['name']}` {$piece}"; } } } if ($strict && !empty($diff['fields']['greater'])) { foreach ($diff['fields']['greater'] as $fieldname) { if (!empty($schema1['fields'][$fieldname])) { $sqls[] = "ALTER TABLE `{$schema1['tablename']}` DROP `{$fieldname}`"; } } } } if (!empty($diff['indexes'])) { if (!empty($diff['indexes']['less'])) { foreach ($diff['indexes']['less'] as $indexname) { $index = $schema2['indexes'][$indexname]; $piece = _db_build_index_sql($index); $sqls[] = "ALTER TABLE `{$schema1['tablename']}` ADD {$piece}"; } } if (!empty($diff['indexes']['diff'])) { foreach ($diff['indexes']['diff'] as $indexname) { $index = $schema2['indexes'][$indexname]; $piece = _db_build_index_sql($index); $sqls[] = "ALTER TABLE `{$schema1['tablename']}` DROP " . ($indexname == 'PRIMARY' ? " PRIMARY KEY " : "{$indexname}") . ", ADD {$piece}"; } } if ($strict && !empty($diff['indexes']['greater'])) { foreach ($diff['indexes']['greater'] as $indexname) { $sqls[] = "ALTER TABLE `{$schema1['tablename']}` DROP `{$indexname}`"; } } } if (!empty($isincrement)) { $piece = _db_build_field_sql($isincrement); $sqls[] = "ALTER TABLE `{$schema1['tablename']}` CHANGE `{$isincrement['name']}` `{$isincrement['name']}` {$piece}"; } return $sqls; }
exit; } load()->model('cloud'); $r = cloud_prepare(); if (is_error($r)) { message($r['message'], url('cloud/profile'), 'error'); } $upgrade = cloud_schema(); $schemas = $upgrade['schemas']; if (!empty($schemas)) { load()->func('db'); foreach ($schemas as $key => $value) { $tablename = substr($value['tablename'], 4); $struct = db_table_schema(pdo(), $tablename); if (!empty($struct)) { $temp = db_schema_compare($schemas[$key], $struct); $diff[$tablename]['name'] = $value['tablename']; if (!empty($temp['fields']['less'])) { foreach ($temp['fields']['less'] as $key => $value) { $diff[$tablename]['fields'][] = $value; } } if (!empty($temp['indexes']['less'])) { foreach ($temp['indexes']['less'] as $key => $value) { $diff[$tablename]['indexes'][] = $value; } } } } } }
function cloud_schema() { $pars = _cloud_build_params(); $pars['method'] = 'application.schema'; $dat = cloud_request('http://v2.addons.we7.cc/gateway.php', $pars); $file = IA_ROOT . '/data/application.schema'; $ret = _cloud_shipping_parse($dat, $file); if (!is_error($ret)) { $schemas = array(); if (!empty($ret['schemas'])) { load()->func('db'); foreach ($ret['schemas'] as $remote) { $name = substr($remote['tablename'], 4); $local = db_table_schema(pdo(), $name); unset($remote['increment']); unset($local['increment']); if (empty($local)) { $schemas[] = $remote; } else { $diffs = db_schema_compare($local, $remote); if (!empty($diffs)) { $schemas[] = $remote; } } } } $ret['schemas'] = $schemas; } return $ret; }
if (!empty($upgrade['schemas'])) { $upgrade['database'] = array(); foreach ($upgrade['schemas'] as $remote) { $row = array(); $row['tablename'] = $remote['tablename']; $name = substr($remote['tablename'], 4); $local = db_table_schema(pdo(), $name); unset($remote['increment']); unset($local['increment']); if (empty($local)) { $row['new'] = true; } else { $row['new'] = false; $row['fields'] = array(); $row['indexes'] = array(); $diffs = db_schema_compare($local, $remote); if (!empty($diffs['fields']['less'])) { $row['fields'] = array_merge($row['fields'], $diffs['fields']['less']); } if (!empty($diffs['fields']['diff'])) { $row['fields'] = array_merge($row['fields'], $diffs['fields']['diff']); } if (!empty($diffs['indexes']['less'])) { $row['indexes'] = array_merge($row['indexes'], $diffs['indexes']['less']); } if (!empty($diffs['indexes']['diff'])) { $row['indexes'] = array_merge($row['indexes'], $diffs['indexes']['diff']); } $row['fields'] = implode($row['fields'], ' '); $row['indexes'] = implode($row['indexes'], ' '); }