Example #1
0
 function install_network()
 {
     if (!defined('nxt_INSTALLING_NETWORK')) {
         define('nxt_INSTALLING_NETWORK', true);
     }
     dbDelta(nxt_get_db_schema('global'));
 }
Example #2
0
/**
 * {@internal Missing Short Description}}
 *
 * {@internal Missing Long Description}}
 *
 * @since 1.5.0
 *
 * @param unknown_type $queries
 * @param unknown_type $execute
 * @return unknown
 */
function dbDelta($queries = '', $execute = true)
{
    global $nxtdb;
    if (in_array($queries, array('', 'all', 'blog', 'global', 'ms_global'), true)) {
        $queries = nxt_get_db_schema($queries);
    }
    // Separate individual queries into an array
    if (!is_array($queries)) {
        $queries = explode(';', $queries);
        if ('' == $queries[count($queries) - 1]) {
            array_pop($queries);
        }
    }
    $queries = apply_filters('dbdelta_queries', $queries);
    $cqueries = array();
    // Creation Queries
    $iqueries = array();
    // Insertion Queries
    $for_update = array();
    // Create a tablename index for an array ($cqueries) of queries
    foreach ($queries as $qry) {
        if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
            $cqueries[trim(strtolower($matches[1]), '`')] = $qry;
            $for_update[$matches[1]] = 'Created table ' . $matches[1];
        } else {
            if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
                array_unshift($cqueries, $qry);
            } else {
                if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
                    $iqueries[] = $qry;
                } else {
                    if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
                        $iqueries[] = $qry;
                    } else {
                        // Unrecognized query type
                    }
                }
            }
        }
    }
    $cqueries = apply_filters('dbdelta_create_queries', $cqueries);
    $iqueries = apply_filters('dbdelta_insert_queries', $iqueries);
    $global_tables = $nxtdb->tables('global');
    foreach ($cqueries as $table => $qry) {
        // Upgrade global tables only for the main site. Don't upgrade at all if DO_NOT_UPGRADE_GLOBAL_TABLES is defined.
        if (in_array($table, $global_tables) && (!is_main_site() || defined('DO_NOT_UPGRADE_GLOBAL_TABLES'))) {
            continue;
        }
        // Fetch the table column structure from the database
        $nxtdb->suppress_errors();
        $tablefields = $nxtdb->get_results("DESCRIBE {$table};");
        $nxtdb->suppress_errors(false);
        if (!$tablefields) {
            continue;
        }
        // Clear the field and index arrays
        $cfields = $indices = array();
        // Get all of the field names in the query from between the parens
        preg_match("|\\((.*)\\)|ms", $qry, $match2);
        $qryline = trim($match2[1]);
        // Separate field lines into an array
        $flds = explode("\n", $qryline);
        //echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
        // For every field line specified in the query
        foreach ($flds as $fld) {
            // Extract the field name
            preg_match("|^([^ ]*)|", trim($fld), $fvals);
            $fieldname = trim($fvals[1], '`');
            // Verify the found field name
            $validfield = true;
            switch (strtolower($fieldname)) {
                case '':
                case 'primary':
                case 'index':
                case 'fulltext':
                case 'unique':
                case 'key':
                    $validfield = false;
                    $indices[] = trim(trim($fld), ", \n");
                    break;
            }
            $fld = trim($fld);
            // If it's a valid field, add it to the field array
            if ($validfield) {
                $cfields[strtolower($fieldname)] = trim($fld, ", \n");
            }
        }
        // For every field in the table
        foreach ($tablefields as $tablefield) {
            // If the table field exists in the field array...
            if (array_key_exists(strtolower($tablefield->Field), $cfields)) {
                // Get the field type from the query
                preg_match("|" . $tablefield->Field . " ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
                $fieldtype = $matches[1];
                // Is actual field type different from the field type in query?
                if ($tablefield->Type != $fieldtype) {
                    // Add a query to change the column type
                    $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
                    $for_update[$table . '.' . $tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
                }
                // Get the default value from the array
                //echo "{$cfields[strtolower($tablefield->Field)]}<br>";
                if (preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
                    $default_value = $matches[1];
                    if ($tablefield->Default != $default_value) {
                        // Add a query to change the column's default value
                        $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
                        $for_update[$table . '.' . $tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
                    }
                }
                // Remove the field from the array (so it's not added)
                unset($cfields[strtolower($tablefield->Field)]);
            } else {
                // This field exists in the table, but not in the creation queries?
            }
        }
        // For every remaining field specified for the table
        foreach ($cfields as $fieldname => $fielddef) {
            // Push a query line into $cqueries that adds the field to that table
            $cqueries[] = "ALTER TABLE {$table} ADD COLUMN {$fielddef}";
            $for_update[$table . '.' . $fieldname] = 'Added column ' . $table . '.' . $fieldname;
        }
        // Index stuff goes here
        // Fetch the table index structure from the database
        $tableindices = $nxtdb->get_results("SHOW INDEX FROM {$table};");
        if ($tableindices) {
            // Clear the index array
            unset($index_ary);
            // For every index in the table
            foreach ($tableindices as $tableindex) {
                // Add the index to the index data array
                $keyname = $tableindex->Key_name;
                $index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
                $index_ary[$keyname]['unique'] = $tableindex->Non_unique == 0 ? true : false;
            }
            // For each actual index in the index array
            foreach ($index_ary as $index_name => $index_data) {
                // Build a create string to compare to the query
                $index_string = '';
                if ($index_name == 'PRIMARY') {
                    $index_string .= 'PRIMARY ';
                } else {
                    if ($index_data['unique']) {
                        $index_string .= 'UNIQUE ';
                    }
                }
                $index_string .= 'KEY ';
                if ($index_name != 'PRIMARY') {
                    $index_string .= $index_name;
                }
                $index_columns = '';
                // For each column in the index
                foreach ($index_data['columns'] as $column_data) {
                    if ($index_columns != '') {
                        $index_columns .= ',';
                    }
                    // Add the field to the column list string
                    $index_columns .= $column_data['fieldname'];
                    if ($column_data['subpart'] != '') {
                        $index_columns .= '(' . $column_data['subpart'] . ')';
                    }
                }
                // Add the column list to the index create string
                $index_string .= ' (' . $index_columns . ')';
                if (!(($aindex = array_search($index_string, $indices)) === false)) {
                    unset($indices[$aindex]);
                    //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br />Found index:".$index_string."</pre>\n";
                }
                //else echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br /><b>Did not find index:</b>".$index_string."<br />".print_r($indices, true)."</pre>\n";
            }
        }
        // For every remaining index specified for the table
        foreach ((array) $indices as $index) {
            // Push a query line into $cqueries that adds the index to that table
            $cqueries[] = "ALTER TABLE {$table} ADD {$index}";
            $for_update[$table . '.' . $fieldname] = 'Added index ' . $table . ' ' . $index;
        }
        // Remove the original table creation query from processing
        unset($cqueries[$table], $for_update[$table]);
    }
    $allqueries = array_merge($cqueries, $iqueries);
    if ($execute) {
        foreach ($allqueries as $query) {
            //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
            $nxtdb->query($query);
        }
    }
    return $for_update;
}