/** * Reads the Database table in $table and creates SQL Statements for recreating structure and data then return the * DUMP SQL. If you set the $filename params then the dump is store on filesystem too. * * Taken partially from phpMyAdmin and partially from Alain Wolf, Zurich - Switzerland * * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/ * * @brief Dump * * @param string $table Table name. * @param string $filename Optional. Complete path of a filename where store the dump. * * @return string */ public function dumpWithTable($table, $filename = '') { // Prepare dump $dump = ''; // Main information on dump $dump .= "# --------------------------------------------------------\n"; $dump .= "# Date: " . date('j F, Y H:i:s') . "\n"; $dump .= "# Database: " . DB_NAME . "\n"; $dump .= "# Table: " . $table . "\n"; $dump .= "# --------------------------------------------------------\n"; // Add SQL statement to drop existing table $dump .= "\n"; $dump .= "#\n"; $dump .= "# Delete any existing table `{$table}`\n"; $dump .= "#\n"; $dump .= "\n"; $dump .= "DROP TABLE IF EXISTS " . self::backquote($table) . ";\n"; // Comment in SQL-file $dump .= "\n"; $dump .= "#\n"; $dump .= "# Table structure of table `{$table}`\n"; $dump .= "#\n"; $dump .= "\n"; // Get table structure $query = 'SHOW CREATE TABLE ' . self::backquote($table); $result = $this->mysqli ? mysqli_query($this->dbh, $query) : mysql_query($query, $this->dbh); if ($result) { // Get num rows $num_rows = $this->mysqli ? mysqli_num_rows($result) : mysql_num_rows($result); if ($num_rows > 0) { $sql_create_arr = $this->mysqli ? mysqli_fetch_array($result) : mysql_fetch_array($result); $dump .= $sql_create_arr[1]; } if ($this->mysqli) { mysqli_free_result($result); } else { mysql_free_result($result); } $dump .= ' ;'; } // Get table contents $query = 'SELECT * FROM ' . self::backquote($table); /** * Filter the query used to select the rows to dump. * * The dynamic portion of the hook name, $table, refers to the database table name. * * @param string $query The SQL query. */ $query = apply_filters('wpdk_db_dump_query-' . $table, $query); $result = $this->mysqli ? mysqli_query($this->dbh, $query) : mysql_query($query, $this->dbh); $fields_cnt = 0; $rows_cnt = 0; if ($result) { $fields_cnt = $this->mysqli ? mysqli_num_fields($result) : mysql_num_fields($result); $rows_cnt = $this->mysqli ? mysqli_num_rows($result) : mysql_num_rows($result); } // Comment in SQL-file $dump .= "\n"; $dump .= "\n"; $dump .= "#\n"; $dump .= "# Data contents of table `{$table}` ({$rows_cnt} records)\n"; $dump .= "#\n"; $dump .= "\n"; // Lock table if insert available $dump .= empty($rows_cnt) ? '' : "\nLOCK TABLES `{$table}` WRITE;\n"; /** * Filter the addition SQL comment before printing the INSERT rows. * * The dynamic portion of the hook name, $table, refers to the database table name. * * @param string $comment Default empty. */ $dump .= apply_filters('wpdk_db_dump_info_before_inserts-' . $table, ''); // Checks whether the field is an integer or not for ($j = 0; $j < $fields_cnt; $j++) { if ($this->mysqli) { $object = mysqli_fetch_field_direct($result, $j); $field_set[$j] = $object->name; $type = $object->type; } else { $field_set[$j] = self::backquote(mysql_field_name($result, $j)); $type = mysql_field_type($result, $j); } // Is number? $field_num[$j] = in_array($type, array('tinyint', 'smallint', 'mediumint', 'int', 'bigint')); } // Sets the scheme $entries = 'INSERT INTO ' . self::backquote($table) . ' VALUES ('; $search = array('\\x00', '\\x0a', '\\x0d', '\\x1a'); //\x08\\x09, not required $replace = array('\\0', '\\n', '\\r', '\\Z'); $current_row = 0; $batch_write = 0; while ($row = $this->mysqli ? mysqli_fetch_row($result) : mysql_fetch_row($result)) { $current_row++; // build the statement for ($j = 0; $j < $fields_cnt; $j++) { if (!isset($row[$j])) { $values[] = 'NULL'; } elseif ($row[$j] === '0' || $row[$j] !== '') { // a number if ($field_num[$j]) { $values[] = $row[$j]; } else { $values[] = "'" . str_replace($search, $replace, self::addslashes($row[$j])) . "'"; } } else { $values[] = "''"; } } $dump .= "\n" . $entries . implode(', ', $values) . ") ;"; // write the rows in batches of 100 if ($batch_write === self::DUMP_SQL_FILE_CHUNCK_SIZE) { $batch_write = 0; // Write on disk if (!empty($filename)) { $result = WPDKFilesystem::append($dump, $filename); // TODO Fires an error or filters to stop the execution $dump = ''; } } $batch_write++; unset($values); } if ($this->mysqli) { mysqli_free_result($result); } else { mysql_free_result($result); } // Unlock tables $dump .= empty($rows_cnt) ? '' : "\n\nUNLOCK TABLES;\n"; // Create footer/closing comment in SQL-file $dump .= "\n"; $dump .= "\n"; $dump .= "#\n"; $dump .= "# End of data contents of table " . $table . "\n"; $dump .= "# --------------------------------------------------------\n"; $dump .= "\n"; $dump .= "\n"; // Write on disk if (!empty($filename)) { $result = WPDKFilesystem::append($dump, $filename); // TODO Fires an error } return $dump; }