Advertisements

dbDelta

Definition:
function dbDelta($queries, $execute = true) {}

Parameters

  • unknown_type $queries
  • unknown_type $execute

Source code

function dbDelta($queries, $execute = true) {

	global $wpdb;



	// Separate individual queries into an array

	if ( !is_array($queries) ) {

		$queries = explode( ';', $queries );

		if ('' == $queries[count($queries) - 1]) array_pop($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

		}

	}



	// Check to see which tables and fields exist

	if ($tables = $wpdb->get_col('SHOW TABLES;')) {

		// For every table in the database

		foreach ($tables as $table) {

			// 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, $wpdb->tables('global')) && ( !is_main_site() || defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) )

				continue;



			// If a table query exists for the database table...

			if ( array_key_exists(strtolower($table), $cqueries) ) {

				// 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", $cqueries[strtolower($table)], $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");

					}

				}



				// Fetch the table column structure from the database

				$tablefields = $wpdb->get_results("DESCRIBE {$table};");



				// 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}";

764

Advertisements

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: