diff --git a/adminer/db.inc.php b/adminer/db.inc.php index 590ec5cd..2c8948dd 100644 --- a/adminer/db.inc.php +++ b/adminer/db.inc.php @@ -4,7 +4,7 @@ $tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]); if ($tables_views && !$error && !$_POST["search"]) { $result = true; $message = ""; - if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"])) { + if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) { queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once } if ($_POST["truncate"]) { @@ -15,6 +15,9 @@ if ($tables_views && !$error && !$_POST["search"]) { } elseif ($_POST["move"]) { $result = move_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]); $message = lang('Tables have been moved.'); + } elseif ($_POST["copy"]) { + $result = copy_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]); + $message = lang('Tables have been copied.'); } elseif ($_POST["drop"]) { if ($_POST["views"]) { $result = drop_views($_POST["views"]); @@ -76,7 +79,9 @@ if ($adminer->homepage()) { $db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB)); echo "

" . lang('Move to other database') . ": "; echo ($databases ? html_select("target", $databases, $db) : ''); - echo " \n"; + echo " "; + echo (support("copy") ? " " : ""); + echo "\n"; } } echo "\n"; diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 6b258491..a7edc44a 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -646,6 +646,7 @@ if (!defined("DRIVER")) { /** Move tables to other schema * @param array + * @param array * @param string * @return bool */ @@ -658,6 +659,34 @@ if (!defined("DRIVER")) { //! move triggers } + /** Copy tables to other schema + * @param array + * @param array + * @param string + * @return bool + */ + function copy_tables($tables, $views, $target) { + foreach ($tables as $table) { + $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table)); + if (!queries("DROP TABLE IF EXISTS $name") + || !queries("CREATE TABLE $name LIKE " . table($table)) + || !queries("INSERT INTO $name SELECT * FROM " . table($table)) + ) { + return false; + } + } + foreach ($views as $table) { + $name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table)); + $view = view($table); + if (!queries("DROP VIEW IF EXISTS $name") + || !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table + ) { + return false; + } + } + return true; + } + /** Get information about trigger * @param string trigger name * @return array array("Trigger" => , "Timing" => , "Event" => , "Statement" => ) @@ -865,7 +894,7 @@ if (!defined("DRIVER")) { } /** Check whether a feature is supported - * @param string "comment", "drop_col", "dump", "event", "partitioning", "routine", "scheme", "sequence", "status", "trigger", "type", "variables", "view" + * @param string "comment", "drop_col", "dump", "event", "partitioning", "routine", "scheme", "sequence", "status", "trigger", "type", "variables", "view", "copy" * @return bool */ function support($feature) { diff --git a/adminer/lang/cs.inc.php b/adminer/lang/cs.inc.php index b021cc8f..227073ed 100644 --- a/adminer/lang/cs.inc.php +++ b/adminer/lang/cs.inc.php @@ -105,6 +105,8 @@ $translations = array( 'Move to other database' => 'Přesunout do jiné databáze', 'Move' => 'Přesunout', 'Tables have been moved.' => 'Tabulky byly přesunuty.', + 'Copy' => 'Zkopírovat', + 'Tables have been copied.' => 'Tabulky byly zkopírovány.', 'Routines' => 'Procedury a funkce', 'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'), diff --git a/changes.txt b/changes.txt index 02efeb9d..ecab7ccc 100644 --- a/changes.txt +++ b/changes.txt @@ -1,6 +1,7 @@ Adminer 3.2.0-dev: Get long texts and slow information by AJAX -All links and some forms by AJAX in browsers with support for history.pushState +Most links and forms by AJAX in browsers with support for history.pushState +Copy tables Ability to search by expression in select Export SQL command result (bug #3116854) Focus first field with insert (bug #3126501) diff --git a/todo.txt b/todo.txt index d569ef0e..cbca945f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,17 +1,16 @@ Transactions in export Create view and routine options -Variables editation, especially timezone (or set by PHP date.timezone) +Variables editation, especially timezone, or set by PHP date("0") Highlight SQL textarea - may use external CodeMirror -Blob download and image display in edit form (important for Editor with hidden fields in select) -Add title to Logout, edit (in select) and select (in menu) in style "hever" +Blob download and image display in edit form (important for Editor with hidden fields in select and SQL command) +Add title to Logout, edit (in select) and select (in menu) for style "hever" Shift-click in checkboxes to select range Export by GET parameters Only first part of big BZ2 export is readable, files are missing in TAR -Auto-refresh processlist (thanks to Jan Garaj) Double click in select - Esc to abort editation Draggable columns in alter table (thanks to Michal Manak) ? Filter by value in row under in select -? Column and table names auto-completition in SQL textarea +? Column and table names auto-completition in SQL textarea - http://blog.quplo.com/2010/06/css-code-completion-in-your-browser/ ? Aliasing of built-in functions can save 7 KB, function minification can save 7 KB, substitution of repetitive $a["a"] can save 4 KB, substitution of $_GET and friends can save 2 KB, aliasing of $connection->query can save 24 B, JS Closure compiler can save 2 KB, not enclosing HTML attribute values can save 1.2 KB, replacing \\n by \n can save .3 KB ? Branch binary_compile: LZW compression of translations can save 30 KB, LZW compression of all texts can save 11 KB, remove of base64_decode() + using chars 127-255 in minification can save 1 KB @@ -29,6 +28,7 @@ Data longer than max_allowed_packet can be sent by mysqli_stmt_send_long_data() ? Geometry support SQLite: +Copy tables ASC and DESC instead of text length in index Delimiter in export and SQL command Backward keys in Editor