diff options
Diffstat (limited to 'libraries/import.lib.php')
-rw-r--r-- | libraries/import.lib.php | 1137 |
1 files changed, 0 insertions, 1137 deletions
diff --git a/libraries/import.lib.php b/libraries/import.lib.php deleted file mode 100644 index ca2ac2c55f..0000000000 --- a/libraries/import.lib.php +++ /dev/null @@ -1,1137 +0,0 @@ -<?php -/* vim: set expandtab sw=4 ts=4 sts=4: */ -/** - * Library that provides common import functions that are used by import plugins - * - * @version $Id$ - * @package phpMyAdmin - */ -if (! defined('PHPMYADMIN')) { - exit; -} - -/** - * We need to know something about user - */ -require_once './libraries/check_user_privileges.lib.php'; - -/** - * We do this check, DROP DATABASE does not need to be confirmed elsewhere - */ -define('PMA_CHK_DROP', 1); - -/** - * Check whether timeout is getting close - * - * @return boolean true if timeout is close - * @access public - */ -function PMA_checkTimeout() -{ - global $timestamp, $maximum_time, $timeout_passed; - if ($maximum_time == 0) { - return FALSE; - } elseif ($timeout_passed) { - return TRUE; - /* 5 in next row might be too much */ - } elseif ((time() - $timestamp) > ($maximum_time - 5)) { - $timeout_passed = TRUE; - return TRUE; - } else { - return FALSE; - } -} - -/** - * Detects what compression filse uses - * - * @param string filename to check - * @return string MIME type of compression, none for none - * @access public - */ -function PMA_detectCompression($filepath) -{ - $file = @fopen($filepath, 'rb'); - if (!$file) { - return FALSE; - } - $test = fread($file, 4); - $len = strlen($test); - fclose($file); - if ($len >= 2 && $test[0] == chr(31) && $test[1] == chr(139)) { - return 'application/gzip'; - } - if ($len >= 3 && substr($test, 0, 3) == 'BZh') { - return 'application/bzip2'; - } - if ($len >= 4 && $test == "PK\003\004") { - return 'application/zip'; - } - return 'none'; -} - -/** - * Runs query inside import buffer. This is needed to allow displaying - * of last SELECT, SHOW or HANDLER results and similar nice stuff. - * - * @uses $GLOBALS['finished'] read and write - * @param string query to run - * @param string query to display, this might be commented - * @param bool whether to use control user for queries - * @access public - */ -function PMA_importRunQuery($sql = '', $full = '', $controluser = false) -{ - global $import_run_buffer, $go_sql, $complete_query, $display_query, - $sql_query, $my_die, $error, $reload, - $skip_queries, $executed_queries, $max_sql_len, $read_multiply, - $cfg, $sql_query_disabled, $db, $run_query, $is_superuser; - $read_multiply = 1; - if (isset($import_run_buffer)) { - // Should we skip something? - if ($skip_queries > 0) { - $skip_queries--; - } else { - if (!empty($import_run_buffer['sql']) && trim($import_run_buffer['sql']) != '') { - $max_sql_len = max($max_sql_len, strlen($import_run_buffer['sql'])); - if (!$sql_query_disabled) { - $sql_query .= $import_run_buffer['full']; - } - if (!$cfg['AllowUserDropDatabase'] - && !$is_superuser - && preg_match('@^[[:space:]]*DROP[[:space:]]+(IF EXISTS[[:space:]]+)?DATABASE @i', $import_run_buffer['sql'])) { - $GLOBALS['message'] = PMA_Message::error('strNoDropDatabases'); - $error = TRUE; - } else { - $executed_queries++; - if ($run_query && $GLOBALS['finished'] && empty($sql) && !$error && ( - (!empty($import_run_buffer['sql']) && preg_match('/^[\s]*(SELECT|SHOW|HANDLER)/i', $import_run_buffer['sql'])) || - ($executed_queries == 1) - )) { - $go_sql = TRUE; - if (!$sql_query_disabled) { - $complete_query = $sql_query; - $display_query = $sql_query; - } else { - $complete_query = ''; - $display_query = ''; - } - $sql_query = $import_run_buffer['sql']; - } elseif ($run_query) { - if ($controluser) { - $result = PMA_query_as_controluser($import_run_buffer['sql']); - } else { - $result = PMA_DBI_try_query($import_run_buffer['sql']); - } - $msg = '# '; - if ($result === FALSE) { // execution failed - if (!isset($my_die)) { - $my_die = array(); - } - $my_die[] = array('sql' => $import_run_buffer['full'], 'error' => PMA_DBI_getError()); - - if ($cfg['VerboseMultiSubmit']) { - $msg .= $GLOBALS['strError']; - } - - if (!$cfg['IgnoreMultiSubmitErrors']) { - $error = TRUE; - return; - } - } elseif ($cfg['VerboseMultiSubmit']) { - $a_num_rows = (int)@PMA_DBI_num_rows($result); - $a_aff_rows = (int)@PMA_DBI_affected_rows(); - if ($a_num_rows > 0) { - $msg .= $GLOBALS['strRows'] . ': ' . $a_num_rows; - } elseif ($a_aff_rows > 0) { - $msg .= sprintf($GLOBALS['strRowsAffected'], $a_aff_rows); - } else { - $msg .= $GLOBALS['strEmptyResultSet']; - } - } - if (!$sql_query_disabled) { - $sql_query .= $msg . "\n"; - } - - // If a 'USE <db>' SQL-clause was found and the query succeeded, set our current $db to the new one - if ($result != FALSE && preg_match('@^[\s]*USE[[:space:]]*([\S]+)@i', $import_run_buffer['sql'], $match)) { - $db = trim($match[1]); - $db = trim($db,';'); // for example, USE abc; - $reload = TRUE; - } - - if ($result != FALSE && preg_match('@^[\s]*(DROP|CREATE)[\s]+(IF EXISTS[[:space:]]+)?(TABLE|DATABASE)[[:space:]]+(.+)@im', $import_run_buffer['sql'])) { - $reload = TRUE; - } - } // end run query - } // end if not DROP DATABASE - } // end non empty query - elseif (!empty($import_run_buffer['full'])) { - if ($go_sql) { - $complete_query .= $import_run_buffer['full']; - $display_query .= $import_run_buffer['full']; - } else { - if (!$sql_query_disabled) { - $sql_query .= $import_run_buffer['full']; - } - } - } - // check length of query unless we decided to pass it to sql.php - // (if $run_query is false, we are just displaying so show - // the complete query in the textarea) - if (! $go_sql && $run_query) { - if ($cfg['VerboseMultiSubmit'] && ! empty($sql_query)) { - if (strlen($sql_query) > 50000 || $executed_queries > 50 || $max_sql_len > 1000) { - $sql_query = ''; - $sql_query_disabled = TRUE; - } - } else { - if (strlen($sql_query) > 10000 || $executed_queries > 10 || $max_sql_len > 500) { - $sql_query = ''; - $sql_query_disabled = TRUE; - } - } - } - } // end do query (no skip) - } // end buffer exists - - // Do we have something to push into buffer? - if (!empty($sql) || !empty($full)) { - $import_run_buffer = array('sql' => $sql, 'full' => $full); - } else { - unset($GLOBALS['import_run_buffer']); - } -} - - -/** - * Returns next part of imported file/buffer - * - * @uses $GLOBALS['offset'] read and write - * @uses $GLOBALS['import_file'] read only - * @uses $GLOBALS['import_text'] read and write - * @uses $GLOBALS['finished'] read and write - * @uses $GLOBALS['read_limit'] read only - * @param integer size of buffer to read (this is maximal size - * function will return) - * @return string part of file/buffer - * @access public - */ -function PMA_importGetNextChunk($size = 32768) -{ - global $compression, $import_handle, $charset_conversion, $charset_of_file, - $charset, $read_multiply; - - // Add some progression while reading large amount of data - if ($read_multiply <= 8) { - $size *= $read_multiply; - } else { - $size *= 8; - } - $read_multiply++; - - // We can not read too much - if ($size > $GLOBALS['read_limit']) { - $size = $GLOBALS['read_limit']; - } - - if (PMA_checkTimeout()) { - return FALSE; - } - if ($GLOBALS['finished']) { - return TRUE; - } - - if ($GLOBALS['import_file'] == 'none') { - // Well this is not yet supported and tested, but should return content of textarea - if (strlen($GLOBALS['import_text']) < $size) { - $GLOBALS['finished'] = TRUE; - return $GLOBALS['import_text']; - } else { - $r = substr($GLOBALS['import_text'], 0, $size); - $GLOBALS['offset'] += $size; - $GLOBALS['import_text'] = substr($GLOBALS['import_text'], $size); - return $r; - } - } - - switch ($compression) { - case 'application/bzip2': - $result = bzread($import_handle, $size); - $GLOBALS['finished'] = feof($import_handle); - break; - case 'application/gzip': - $result = gzread($import_handle, $size); - $GLOBALS['finished'] = feof($import_handle); - break; - case 'application/zip': - $result = substr($GLOBALS['import_text'], 0, $size); - $GLOBALS['import_text'] = substr($GLOBALS['import_text'], $size); - $GLOBALS['finished'] = empty($GLOBALS['import_text']); - break; - case 'none': - $result = fread($import_handle, $size); - $GLOBALS['finished'] = feof($import_handle); - break; - } - $GLOBALS['offset'] += $size; - - if ($charset_conversion) { - return PMA_convert_string($charset_of_file, $charset, $result); - } else { - /** - * Skip possible byte order marks (I do not think we need more - * charsets, but feel free to add more, you can use wikipedia for - * reference: <http://en.wikipedia.org/wiki/Byte_Order_Mark>) - * - * @todo BOM could be used for charset autodetection - */ - if ($GLOBALS['offset'] == $size) { - // UTF-8 - if (strncmp($result, "\xEF\xBB\xBF", 3) == 0) { - $result = substr($result, 3); - // UTF-16 BE, LE - } elseif (strncmp($result, "\xFE\xFF", 2) == 0 || strncmp($result, "\xFF\xFE", 2) == 0) { - $result = substr($result, 2); - } - } - return $result; - } -} - -/** - * Returns the "Excel" column name (i.e. 1 = "A", 26 = "Z", 27 = "AA", etc.) - * This algorithm only works up to ZZ. it fails on AAA (up to 701 columns) - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses chr() - * @param int $num - * @return string The column's "Excel" name - */ -function PMA_getColumnAlphaName($num) -{ - /* ASCII value for capital "A" */ - $A = 65; - $sCol = ""; - $iRemain = 0; - - /* This algorithm only works up to ZZ. it fails on AAA */ - - if ($num > 701) { - return $num; - } elseif ($num <= 26) { - if ($num == 0) { - $sCol = chr(($A + 26) - 1); - } else { - $sCol = chr(($A + $num) - 1); - } - } else { - $iRemain = (($num / 26)) - 1; - if (($num % 26) == 0) { - $sCol = PMA_getColumnAlphaName($iRemain) . PMA_getColumnAlphaName($num % 26); - } else { - $sCol = chr($A + $iRemain) . PMA_getColumnAlphaName($num % 26); - } - } - - return $sCol; -} - -/** - * Returns the column number based on the Excel name. - * So "A" = 1, "AZ" = 27, etc. - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses strtoupper() - * @uses strlen() - * @uses count() - * @uses ord() - * @param string $name (i.e. "A", or "BC", etc.) - * @return int The column number - */ -function PMA_getColumnNumberFromName($name) { - if (strlen($name) != 0) { - $name = strtoupper($name); - $num_chars = count($name); - $number = 0; - for ($i = 0; $i < $num_chars; ++$i) { - $number += (ord($name[$i]) - 64); - } - return $number; - } else { - return 0; - } -} - -/** - * Constants definitions - */ - -/* MySQL type defs */ -define("NONE", 0); -define("VARCHAR", 1); -define("INT", 2); -define("DECIMAL", 3); - -/* Decimal size defs */ -define("M", 0); -define("D", 1); -define("FULL", 2); - -/* Table array defs */ -define("TBL_NAME", 0); -define("COL_NAMES", 1); -define("ROWS", 2); - -/* Analysis array defs */ -define("TYPES", 0); -define("SIZES", 1); - -/** - * Obtains the precision (total # of digits) from a size of type decimal - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses substr() - * @uses strpos() - * @param string $last_cumulative_size - * @return int Precision of the given decimal size notation - */ -function PMA_getM($last_cumulative_size) { - return (int)substr($last_cumulative_size, 0, strpos($last_cumulative_size, ",")); -} - -/** - * Obtains the scale (# of digits to the right of the decimal point) from a size of type decimal - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses substr() - * @uses strpos() - * @uses strlen() - * @param string $last_cumulative_size - * @return int Scale of the given decimal size notation - */ -function PMA_getD($last_cumulative_size) { - return (int)substr($last_cumulative_size, (strpos($last_cumulative_size, ",") + 1), (strlen($last_cumulative_size) - strpos($last_cumulative_size, ","))); -} - -/** - * Obtains the decimal size of a given cell - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses strlen() - * @uses strpos() - * @param string &$cell - * @return array Contains the precision, scale, and full size representation of the given decimal cell - */ -function PMA_getDecimalSize(&$cell) { - $curr_size = strlen((string)$cell); - $decPos = strpos($cell, "."); - $decPrecision = ($curr_size - 1) - $decPos; - - $m = $curr_size - 1; - $d = $decPrecision; - - return array($m, $d, ($m . "," . $d)); -} - -/** - * Obtains the size of the given cell - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @todo Handle the error cases more elegantly - * - * @access public - * - * @uses M - * @uses D - * @uses FULL - * @uses VARCHAR - * @uses DECIMAL - * @uses INT - * @uses NONE - * @uses strcmp() - * @uses strlen() - * @uses PMA_getM() - * @uses PMA_getD() - * @uses PMA_getDecimalSize() - * @param string $last_cumulative_size Last cumulative column size - * @param int $last_cumulative_type Last cumulative column type (NONE or VARCHAR or DECIMAL or INT) - * @param int $curr_type Type of the current cell (NONE or VARCHAR or DECIMAL or INT) - * @param string &$cell The current cell - * @return string Size of the given cell in the type-appropriate format - */ -function PMA_detectSize($last_cumulative_size, $last_cumulative_type, $curr_type, &$cell) { - $curr_size = strlen((string)$cell); - - /** - * If the cell is NULL, don't treat it as a varchar - */ - if (! strcmp('NULL', $cell)) { - return $last_cumulative_size; - } - /** - * What to do if the current cell is of type VARCHAR - */ - elseif ($curr_type == VARCHAR) { - /** - * The last cumlative type was VARCHAR - */ - if ($last_cumulative_type == VARCHAR) { - if ($curr_size >= $last_cumulative_size) { - return $curr_size; - } else { - return $last_cumulative_size; - } - } - /** - * The last cumlative type was DECIMAL - */ - elseif ($last_cumulative_type == DECIMAL) { - $oldM = PMA_getM($last_cumulative_size); - - if ($curr_size >= $oldM) { - return $curr_size; - } else { - return $oldM; - } - } - /** - * The last cumlative type was INT - */ - elseif ($last_cumulative_type == INT) { - if ($curr_size >= $last_cumulative_size) { - return $curr_size; - } else { - return $last_cumulative_size; - } - } - /** - * This is the first row to be analyzed - */ - elseif (! isset($last_cumulative_type) || $last_cumulative_type == NONE) { - return $curr_size; - } - /** - * An error has DEFINITELY occurred - */ - else { - /** - * TODO: Handle this MUCH more elegantly - */ - - return -1; - } - } - /** - * What to do if the current cell is of type DECIMAL - */ - elseif ($curr_type == DECIMAL) { - /** - * The last cumlative type was VARCHAR - */ - if ($last_cumulative_type == VARCHAR) { - /* Convert $last_cumulative_size from varchar to decimal format */ - $size = PMA_getDecimalSize($cell); - - if ($size[M] >= $last_cumulative_size) { - return $size[M]; - } else { - return $last_cumulative_size; - } - } - /** - * The last cumlative type was DECIMAL - */ - elseif ($last_cumulative_type == DECIMAL) { - $size = PMA_getDecimalSize($cell); - - $oldM = PMA_getM($last_cumulative_size); - $oldD = PMA_getD($last_cumulative_size); - - /* New val if M or D is greater than current largest */ - if ($size[M] > $oldM || $size[D] > $oldD) { - /* Take the largest of both types */ - return (string)((($size[M] > $oldM) ? $size[M] : $oldM) . "," . (($size[D] > $oldD) ? $size[D] : $oldD)); - } else { - return $last_cumulative_size; - } - } - /** - * The last cumlative type was INT - */ - elseif ($last_cumulative_type == INT) { - /* Convert $last_cumulative_size from int to decimal format */ - $size = PMA_getDecimalSize($cell); - - if ($size[M] >= $last_cumulative_size) { - return $size[FULL]; - } else { - return ($last_cumulative_size.",".$size[D]); - } - } - /** - * This is the first row to be analyzed - */ - elseif (! isset($last_cumulative_type) || $last_cumulative_type == NONE) { - /* First row of the column */ - $size = PMA_getDecimalSize($cell); - - return $size[FULL]; - } - /** - * An error has DEFINITELY occurred - */ - else { - /** - * TODO: Handle this MUCH more elegantly - */ - - return -1; - } - } - /** - * What to do if the current cell is of type INT - */ - elseif ($curr_type == INT) { - /** - * The last cumlative type was VARCHAR - */ - if ($last_cumulative_type == VARCHAR) { - if ($curr_size >= $last_cumulative_size) { - return $curr_size; - } else { - return $last_cumulative_size; - } - } - /** - * The last cumlative type was DECIMAL - */ - elseif ($last_cumulative_type == DECIMAL) { - $oldM = PMA_getM($last_cumulative_size); - $oldD = PMA_getD($last_cumulative_size); - $oldInt = $oldM - $oldD; - $newInt = strlen((string)$cell); - - /* See which has the larger integer length */ - if ($oldInt >= $newInt) { - /* Use old decimal size */ - return $last_cumulative_size; - } else { - /* Use $newInt + $oldD as new M */ - return (($newInt + $oldD) . "," . $oldD); - } - } - /** - * The last cumlative type was INT - */ - elseif ($last_cumulative_type == INT) { - if ($curr_size >= $last_cumulative_size) { - return $curr_size; - } else { - return $last_cumulative_size; - } - } - /** - * This is the first row to be analyzed - */ - elseif (!isset($last_cumulative_type) || $last_cumulative_type == NONE) { - return $curr_size; - } - /** - * An error has DEFINITELY occurred - */ - else { - /** - * TODO: Handle this MUCH more elegantly - */ - - return -1; - } - } - /** - * An error has DEFINITELY occurred - */ - else { - /** - * TODO: Handle this MUCH more elegantly - */ - - return -1; - } -} - -/** - * Determines what MySQL type a cell is - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @access public - * - * @uses DECIMAL - * @uses INT - * @uses VARCHAR - * @uses NONE - * @uses is_numeric() - * @uses strcmp() - * @uses strpos() - * @uses substr_count() - * @param int $last_cumulative_type Last cumulative column type (VARCHAR or INT or DECIMAL or NONE) - * @param string &$cell String representation of the cell for which a best-fit type is to be determined - * @return int The MySQL type representation (VARCHAR or INT or DECIMAL or NONE) - */ -function PMA_detectType($last_cumulative_type, &$cell) { - /** - * If numeric, determine if decimal or int - * Else, we call it varchar for simplicity - */ - - if (! strcmp('NULL', $cell)) { - if ($last_cumulative_type === NULL || $last_cumulative_type == NONE) { - return NONE; - } else { - return $last_cumulative_type; - } - } elseif (is_numeric($cell)) { - if ($cell == (string)(float)$cell && strpos($cell, ".") !== false && substr_count($cell, ".") == 1) { - return DECIMAL; - } else { - return INT; - } - } else { - return VARCHAR; - } -} - -/** - * Determines if the column types are int, decimal, or string - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @link http://wiki.phpmyadmin.net/pma/Devel:Import - * - * @todo Handle the error case more elegantly - * - * @access public - * - * @uses TBL_NAME - * @uses COL_NAMES - * @uses ROWS - * @uses VARCHAR - * @uses DECIMAL - * @uses INT - * @uses NONE - * @uses count() - * @uses is_array() - * @uses PMA_detectType() - * @uses PMA_detectSize() - * @param &$table array(string $table_name, array $col_names, array $rows) - * @return array array(array $types, array $sizes) - */ -function PMA_analyzeTable(&$table) { - /* Get number of rows in table */ - $numRows = count($table[ROWS]); - /* Get number of columns */ - $numCols = count($table[COL_NAMES]); - /* Current type for each column */ - $types = array(); - $sizes = array(); - - /* Initialize $sizes to all 0's */ - for ($i = 0; $i < $numCols; ++$i) { - $sizes[$i] = 0; - } - - /* Initialize $types to NONE */ - for ($i = 0; $i < $numCols; ++$i) { - $types[$i] = NONE; - } - - /* Temp vars */ - $curr_type = NONE; - $curr_size = 0; - - /* If the passed array is not of the correct form, do not process it */ - if (is_array($table) && ! is_array($table[TBL_NAME]) && is_array($table[COL_NAMES]) && is_array($table[ROWS])) { - /* Analyze each column */ - for ($i = 0; $i < $numCols; ++$i) { - /* Analyze the column in each row */ - for ($j = 0; $j < $numRows; ++$j) { - /* Determine type of the current cell */ - $curr_type = PMA_detectType($types[$i], $table[ROWS][$j][$i]); - /* Determine size of the current cell */ - $sizes[$i] = PMA_detectSize($sizes[$i], $types[$i], $curr_type, $table[ROWS][$j][$i]); - - /** - * If a type for this column has alreday been delcared, - * only alter it if it was a number and a varchar was found - */ - if ($curr_type != NONE) { - if ($curr_type == VARCHAR) { - $types[$i] = VARCHAR; - } else if ($curr_type == DECIMAL) { - if ($types[$i] != VARCHAR) { - $types[$i] = DECIMAL; - } - } else if ($curr_type == INT) { - if ($types[$i] != VARCHAR && $types[$i] != DECIMAL) { - $types[$i] = INT; - } - } - } - } - } - - /* Check to ensure that all types are valid */ - $len = count($types); - for ($n = 0; $n < $len; ++$n) { - if (! strcmp(NONE, $types[$n])) { - $types[$n] = VARCHAR; - $sizes[$n] = '10'; - } - } - - return array($types, $sizes); - } - else - { - /** - * TODO: Handle this better - */ - - return false; - } -} - -/* Needed to quell the beast that is PMA_Message */ -$import_notice = NULL; - -/** - * Builds and executes SQL statements to create the database and tables - * as necessary, as well as insert all the data. - * - * @author Derek Schaefer (derek.schaefer@gmail.com) - * - * @link http://wiki.phpmyadmin.net/pma/Devel:Import - * - * @access public - * - * @uses TBL_NAME - * @uses COL_NAMES - * @uses ROWS - * @uses TYPES - * @uses SIZES - * @uses strcmp() - * @uses count() - * @uses ereg() - * @uses ereg_replace() - * @uses PMA_isView() - * @uses PMA_backquote() - * @uses PMA_importRunQuery() - * @uses PMA_generate_common_url() - * @uses PMA_Message::notice() - * @param string $db_name Name of the database - * @param array &$tables Array of tables for the specified database - * @param array &$analyses = NULL Analyses of the tables - * @param array &$additional_sql = NULL Additional SQL statements to be executed - * @param array $options = NULL Associative array of options - * @return void - */ -function PMA_buildSQL($db_name, &$tables, &$analyses = NULL, &$additional_sql = NULL, $options = NULL) { - /* Take care of the options */ - if (isset($options['db_collation'])) { - $collation = $options['db_collation']; - } else { - $collation = "utf8_general_ci"; - } - - if (isset($options['db_charset'])) { - $charset = $options['db_charset']; - } else { - $charset = "utf8"; - } - - if (isset($options['create_db'])) { - $create_db = $options['create_db']; - } else { - $create_db = true; - } - - /* Create SQL code to handle the database */ - $sql = array(); - - if ($create_db) { - $sql[] = "CREATE DATABASE IF NOT EXISTS " . PMA_backquote($db_name) . " DEFAULT CHARACTER SET " . $charset . " COLLATE " . $collation; - } - - /** - * The calling plug-in should include this statement, if necessary, in the $additional_sql parameter - * - * $sql[] = "USE " . PMA_backquote($db_name); - */ - - /* Execute the SQL statements create above */ - $sql_len = count($sql); - for ($i = 0; $i < $sql_len; ++$i) { - PMA_importRunQuery($sql[$i], $sql[$i]); - } - - /* No longer needed */ - unset($sql); - - /* Run the $additional_sql statements supplied by the caller plug-in */ - if ($additional_sql != NULL) { - /* Clean the SQL first */ - $additional_sql_len = count($additional_sql); - - /** - * Only match tables for now, because CREATE IF NOT EXISTS - * syntax is lacking or nonexisting for views, triggers, - * functions, and procedures. - * - * See: http://bugs.mysql.com/bug.php?id=15287 - * - * To the best of my knowledge this is still an issue. - * - * $pattern = 'CREATE (TABLE|VIEW|TRIGGER|FUNCTION|PROCEDURE)'; - */ - $pattern = 'CREATE .*(TABLE)'; - $replacement = 'CREATE \\1 IF NOT EXISTS'; - - /* Change CREATE statements to CREATE IF NOT EXISTS to support inserting into existing structures */ - for ($i = 0; $i < $additional_sql_len; ++$i) { - $additional_sql[$i] = ereg_replace($pattern, $replacement, $additional_sql[$i]); - /* Execute the resulting statements */ - PMA_importRunQuery($additional_sql[$i], $additional_sql[$i]); - } - } - - if ($analyses != NULL) { - $type_array = array(NONE => "NULL", VARCHAR => "varchar", INT => "int", DECIMAL => "decimal"); - - /* TODO: Do more checking here to make sure they really are matched */ - if (count($tables) != count($analyses)) { - exit(); - } - - /* Create SQL code to create the tables */ - $tempSQLStr = ""; - $num_tables = count($tables); - for ($i = 0; $i < $num_tables; ++$i) { - $num_cols = count($tables[$i][COL_NAMES]); - $tempSQLStr = "CREATE TABLE IF NOT EXISTS " . PMA_backquote($db_name) . '.' . PMA_backquote($tables[$i][TBL_NAME]) . " ("; - for ($j = 0; $j < $num_cols; ++$j) { - $size = $analyses[$i][SIZES][$j]; - if ((int)$size == 0) { - $size = 10; - } - - $tempSQLStr .= PMA_backquote($tables[$i][COL_NAMES][$j]) . " " . $type_array[$analyses[$i][TYPES][$j]] . "(" . $size . ")"; - - if ($j != (count($tables[$i][COL_NAMES]) - 1)) { - $tempSQLStr .= ", "; - } - } - $tempSQLStr .= ") ENGINE=MyISAM;"; - - /** - * Each SQL statement is executed immediately - * after it is formed so that we don't have - * to store them in a (possibly large) buffer - */ - PMA_importRunQuery($tempSQLStr, $tempSQLStr); - } - } - - /** - * Create the SQL statements to insert all the data - * - * Only one insert query is formed for each table - */ - $tempSQLStr = ""; - $col_count = 0; - $num_tables = count($tables); - for ($i = 0; $i < $num_tables; ++$i) { - $num_cols = count($tables[$i][COL_NAMES]); - $num_rows = count($tables[$i][ROWS]); - - $tempSQLStr = "INSERT INTO " . PMA_backquote($db_name) . '.' . PMA_backquote($tables[$i][TBL_NAME]) . " ("; - - for ($m = 0; $m < $num_cols; ++$m) { - $tempSQLStr .= PMA_backquote($tables[$i][COL_NAMES][$m]); - - if ($m != ($num_cols - 1)) { - $tempSQLStr .= ", "; - } - } - - $tempSQLStr .= ") VALUES "; - - for ($j = 0; $j < $num_rows; ++$j) { - $tempSQLStr .= "("; - - for ($k = 0; $k < $num_cols; ++$k) { - if ($analyses != NULL) { - $is_varchar = ($analyses[$i][TYPES][$col_count] === VARCHAR); - } else { - $is_varchar = !is_numeric($tables[$i][ROWS][$j][$k]); - } - - /* Don't put quotes around NULL fields */ - if (! strcmp($tables[$i][ROWS][$j][$k], 'NULL')) { - $is_varchar = false; - } - - $tempSQLStr .= (($is_varchar) ? "'" : ""); - $tempSQLStr .= (str_replace("'", "\'", (string)$tables[$i][ROWS][$j][$k])); - $tempSQLStr .= (($is_varchar) ? "'" : ""); - - if ($k != ($num_cols - 1)) { - $tempSQLStr .= ", "; - } - - if ($col_count == ($num_cols - 1)) { - $col_count = 0; - } else { - $col_count++; - } - - /* Delete the cell after we are done with it */ - unset($tables[$i][ROWS][$j][$k]); - } - - $tempSQLStr .= ")"; - - if ($j != ($num_rows - 1)) { - $tempSQLStr .= ",\n "; - } - - $col_count = 0; - /* Delete the row after we are done with it */ - unset($tables[$i][ROWS][$j]); - } - - $tempSQLStr .= ";"; - - /** - * Each SQL statement is executed immediately - * after it is formed so that we don't have - * to store them in a (possibly large) buffer - */ - PMA_importRunQuery($tempSQLStr, $tempSQLStr); - } - - /* No longer needed */ - unset($tempSQLStr); - - /** - * A work in progress - */ - - /* Add the viewable structures from $additional_sql to $tables so they are also displayed */ - - $view_pattern = 'VIEW `[^`]+`\.`([^`]+)'; - $table_pattern = 'CREATE TABLE IF NOT EXISTS `([^`]+)`'; - /* Check a third pattern to make sure its not a "USE `db_name`;" statement */ - - $regs = array(); - - $inTables = false; - - $additional_sql_len = count($additional_sql); - for ($i = 0; $i < $additional_sql_len; ++$i) { - ereg($view_pattern, $additional_sql[$i], $regs); - - if (count($regs) == 0) { - ereg($table_pattern, $additional_sql[$i], $regs); - } - - if (count($regs)) { - for ($n = 0; $n < $num_tables; ++$n) { - if (!strcmp($regs[1], $tables[$n][TBL_NAME])) { - $inTables = true; - break; - } - } - - if (!$inTables) { - $tables[] = array(TBL_NAME => $regs[1]); - } - } - - /* Reset the array */ - $regs = array(); - $inTables = false; - } - - $params = array('db' => (string)$db_name); - $db_url = 'db_structure.php' . PMA_generate_common_url($params); - $db_ops_url = 'db_operations.php' . PMA_generate_common_url($params); - - $message = '<br /><br />'; - $message .= '<strong>' . $GLOBALS['strImportNoticePt1'] . '</strong><br />'; - $message .= '<ul><li>' . $GLOBALS['strImportNoticePt2'] . '</li>'; - $message .= '<li>' . $GLOBALS['strImportNoticePt3'] . '</li>'; - $message .= '<li>' . $GLOBALS['strImportNoticePt4'] . '</li>'; - $message .= sprintf('<br /><li><a href="%s" title="%s">%s</a> (<a href="%s" title="%s">' . $GLOBALS['strOptions'] . '</a>)</li>', - $db_url, - $GLOBALS['strGoToDatabase'] . ': ' . PMA_backquote($db_name), - $db_name, - $db_ops_url, - $GLOBALS['strEdit'] . ' ' . PMA_backquote($db_name) . ' ' . $GLOBALS['strSettings']); - - $message .= '<ul>'; - - unset($params); - - $num_tables = count($tables); - for ($i = 0; $i < $num_tables; ++$i) - { - $params = array('db' => (string)$db_name, 'table' => (string)$tables[$i][TBL_NAME]); - $tbl_url = 'sql.php' . PMA_generate_common_url($params); - $tbl_struct_url = 'tbl_structure.php' . PMA_generate_common_url($params); - $tbl_ops_url = 'tbl_operations.php' . PMA_generate_common_url($params); - - unset($params); - - if (! PMA_isView($db_name, $tables[$i][TBL_NAME])) { - $message .= sprintf('<li><a href="%s" title="%s">%s</a> (<a href="%s" title="%s">' . $GLOBALS['strStructure'] . '</a>) (<a href="%s" title="%s">' . $GLOBALS['strOptions'] . '</a>)</li>', - $tbl_url, - $GLOBALS['strGoToTable'] . ': ' . PMA_backquote($tables[$i][TBL_NAME]), - $tables[$i][TBL_NAME], - $tbl_struct_url, - PMA_backquote($tables[$i][TBL_NAME]) . ' ' . $GLOBALS['strStructureLC'], - $tbl_ops_url, - $GLOBALS['strEdit'] . ' ' . PMA_backquote($tables[$i][TBL_NAME]) . ' ' . $GLOBALS['strSettings']); - } else { - $message .= sprintf('<li><a href="%s" title="%s">%s</a></li>', - $tbl_url, - $GLOBALS['strGoToView'] . ': ' . PMA_backquote($tables[$i][TBL_NAME]), - $tables[$i][TBL_NAME]); - } - } - - $message .= '</ul></ul>'; - - global $import_notice; - $import_notice = $message; - - unset($tables); -} - -?> |