示例#1
0
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;
}
示例#2
0
        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;
                    }
                }
            }
        }
    }
}
示例#3
0
文件: cloud.mod.php 项目: 7demo/we7
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;
}
示例#4
0
 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'], ' ');
         }