From 0cc54a7b448598ed01b4f4d715a50e59ef985791 Mon Sep 17 00:00:00 2001 From: Abhijit Rakas Date: Wed, 14 Nov 2018 12:08:45 +0530 Subject: [PATCH 1/4] Allow all mysql flags while importing database --- src/DB_Command.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/DB_Command.php b/src/DB_Command.php index f5140354c..db5241b53 100644 --- a/src/DB_Command.php +++ b/src/DB_Command.php @@ -539,6 +539,9 @@ public function export( $args, $assoc_args ) { * [--dbpass=] * : Password to pass to mysql. Defaults to DB_PASSWORD. * + * [--=] + * : Extra arguments to pass to mysqldump. [Refer to mysqldump docs](https://dev.mysql.com/doc/en/mysqldump.html#mysqldump-option-summary). + * * [--skip-optimization] * : When using an SQL file, do not include speed optimization such as disabling auto-commit and key checks. * @@ -555,10 +558,7 @@ public function import( $args, $assoc_args ) { $result_file = sprintf( '%s.sql', DB_NAME ); } - $mysql_args = array( - 'database' => DB_NAME, - ); - $mysql_args = array_merge( self::get_dbuser_dbpass_args( $assoc_args ), $mysql_args ); + $assoc_args['database'] = DB_NAME; if ( '-' !== $result_file ) { if ( ! is_readable( $result_file ) ) { @@ -569,10 +569,14 @@ public function import( $args, $assoc_args ) { ? 'SOURCE %s;' : 'SET autocommit = 0; SET unique_checks = 0; SET foreign_key_checks = 0; SOURCE %s; COMMIT;'; - $mysql_args['execute'] = sprintf( $query, $result_file ); + if ( isset( $assoc_args['skip-optimization'] ) ) { + unset( $assoc_args['skip-optimization'] ); + } + + $assoc_args['execute'] = sprintf( $query, $result_file ); } - self::run( '/usr/bin/env mysql --no-defaults --no-auto-rehash', $mysql_args ); + self::run( '/usr/bin/env mysql --no-defaults --no-auto-rehash', $assoc_args ); WP_CLI::success( sprintf( "Imported from '%s'.", $result_file ) ); } @@ -1025,10 +1029,10 @@ public function prefix() { * | 98 | foo_options | a:1:{s:12:"_multiwidget";i:1;} | yes | * | 99 | foo_settings | a:0:{} | yes | * +----+--------------+--------------------------------+-----+ - * + * * # SQL search and delete records from database table 'wp_options' where 'option_name' match 'foo' * wp db query "DELETE from wp_options where option_id in ($(wp db query "SELECT GROUP_CONCAT(option_id SEPARATOR ',') from wp_options where option_name like '%foo%';" --silent --skip-column-names))" - * + * * @when after_wp_load */ public function search( $args, $assoc_args ) { From d5408f316e055dcc4e1a29ac3b999e22504aec01 Mon Sep 17 00:00:00 2001 From: Abhijit Rakas Date: Wed, 21 Nov 2018 21:15:47 +0530 Subject: [PATCH 2/4] Add allowed mysql flag and behat test --- features/db-import.feature | 14 ++++++++++++++ src/DB_Command.php | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/features/db-import.feature b/features/db-import.feature index ba199266a..700bc813a 100644 --- a/features/db-import.feature +++ b/features/db-import.feature @@ -44,6 +44,20 @@ Feature: Import a WordPress database """ And STDOUT should be empty + Scenario: Import database with passed-in options + Given a WP install + + Given a debug.sql file: + """ + INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES (999, 'testoption', 'testval', 'yes'),(999, 'testoption', 'testval', 'yes'); + """ + + When I try `wp db import debug.sql --force` + Then STDOUT should be: + """ + Success: Imported from 'debug.sql'. + """ + Scenario: Help runs properly at various points of a functional WP install Given an empty directory diff --git a/src/DB_Command.php b/src/DB_Command.php index db5241b53..0333bfcc3 100644 --- a/src/DB_Command.php +++ b/src/DB_Command.php @@ -558,7 +558,10 @@ public function import( $args, $assoc_args ) { $result_file = sprintf( '%s.sql', DB_NAME ); } - $assoc_args['database'] = DB_NAME; + $mysql_args = array( + 'database' => DB_NAME, + ); + $mysql_args = array_merge( self::get_dbuser_dbpass_args( $assoc_args ), $mysql_args ); if ( '-' !== $result_file ) { if ( ! is_readable( $result_file ) ) { @@ -569,14 +572,12 @@ public function import( $args, $assoc_args ) { ? 'SOURCE %s;' : 'SET autocommit = 0; SET unique_checks = 0; SET foreign_key_checks = 0; SOURCE %s; COMMIT;'; - if ( isset( $assoc_args['skip-optimization'] ) ) { - unset( $assoc_args['skip-optimization'] ); - } - - $assoc_args['execute'] = sprintf( $query, $result_file ); + $mysql_args['execute'] = sprintf( $query, $result_file ); } + // Check if any mysql option pass. + $mysql_args = array_merge( $mysql_args, self::get_mysql_args( $assoc_args ) ); - self::run( '/usr/bin/env mysql --no-defaults --no-auto-rehash', $assoc_args ); + self::run( '/usr/bin/env mysql --no-defaults --no-auto-rehash', $mysql_args ); WP_CLI::success( sprintf( "Imported from '%s'.", $result_file ) ); } @@ -1433,4 +1434,27 @@ private function get_colors( $assoc_args, $colors ) { return $colors; } + + /** + * Helper to pluck `mysql` opitons from associative args array. + * + * @param array $assoc_args Associative args array. + * @return array Array with `mysql` opitons set if in passed-in associative args array. + */ + private static function get_mysql_args( $assoc_args ) { + + $allowed_mysql_option = [ 'auto-rehash', 'auto-vertical-output', 'batch', 'binary-as-hex', 'binary-mode', 'bind-address', 'character-sets-dir', 'column-names', 'column-type-info', 'comments', 'compress', 'connect-expired-password', 'connect_timeout', 'database', 'debug', 'debug-check', 'debug-info', 'default-auth', 'default-character-set', 'defaults-extra-file', 'defaults-file', 'defaults-group-suffix', 'delimiter', 'enable-cleartext-plugin', 'execute', 'force', 'get-server-public-key', 'help', 'histignore', 'host', 'html', 'ignore-spaces', 'init-command', 'line-numbers', 'local-infile', 'login-path', 'max_allowed_packet', 'max_join_size', 'named-commands', 'net_buffer_length', 'no-beep', 'one-database', 'pager', 'pipe', 'plugin-dir', 'port', 'print-defaults', 'protocol', 'quick', 'raw', 'reconnect', 'i-am-a-dummy', 'safe-updates', 'secure-auth', 'select_limit', 'server-public-key-path', 'shared-memory-base-name', 'show-warnings', 'sigint-ignore', 'silent', 'skip-auto-rehash', 'skip-column-names', 'skip-line-numbers', 'skip-named-commands', 'skip-pager', 'skip-reconnect', 'socket', 'ssl-ca', 'ssl-capath', 'ssl-cert', 'ssl-cipher', 'ssl-crl', 'ssl-crlpath', 'ssl-fips-mode', 'ssl-key', 'ssl-mode', 'syslog', 'table', 'tee', 'tls-version', 'unbuffered', 'verbose', 'version', 'vertical', 'wait', 'xml' ]; + + $mysql_args = array(); + + foreach ( $assoc_args as $mysql_option_key => $mysql_option_value ) { + // check flags is valid flag or not. + if ( in_array( $mysql_option_key, $allowed_mysql_option, true ) && ! empty( $mysql_option_value ) ) { + $mysql_args[$mysql_option_key] = $mysql_option_value; + + } + } + + return $mysql_args; + } } From 228d2d72d8105102454752bfa416066b4db22ffb Mon Sep 17 00:00:00 2001 From: Abhijit Rakas Date: Mon, 26 Nov 2018 19:45:37 +0530 Subject: [PATCH 3/4] Fix mysql binary link in comment --- src/DB_Command.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DB_Command.php b/src/DB_Command.php index 0333bfcc3..a6446ecd5 100644 --- a/src/DB_Command.php +++ b/src/DB_Command.php @@ -540,7 +540,7 @@ public function export( $args, $assoc_args ) { * : Password to pass to mysql. Defaults to DB_PASSWORD. * * [--=] - * : Extra arguments to pass to mysqldump. [Refer to mysqldump docs](https://dev.mysql.com/doc/en/mysqldump.html#mysqldump-option-summary). + * : Extra arguments to pass to mysql. [Refer to mysql binary docs](https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html). * * [--skip-optimization] * : When using an SQL file, do not include speed optimization such as disabling auto-commit and key checks. From bbb476a37c27555403a6aa2b526bcaeb65917e4e Mon Sep 17 00:00:00 2001 From: Abhijit Rakas Date: Sun, 2 Dec 2018 16:33:09 +0530 Subject: [PATCH 4/4] Fix typo and code structure --- src/DB_Command.php | 98 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/src/DB_Command.php b/src/DB_Command.php index a6446ecd5..024c373ff 100644 --- a/src/DB_Command.php +++ b/src/DB_Command.php @@ -1436,22 +1436,108 @@ private function get_colors( $assoc_args, $colors ) { } /** - * Helper to pluck `mysql` opitons from associative args array. + * Helper to pluck `mysql` options from associative args array. * * @param array $assoc_args Associative args array. - * @return array Array with `mysql` opitons set if in passed-in associative args array. + * @return array Array with `mysql` options set if in passed-in associative args array. */ private static function get_mysql_args( $assoc_args ) { - $allowed_mysql_option = [ 'auto-rehash', 'auto-vertical-output', 'batch', 'binary-as-hex', 'binary-mode', 'bind-address', 'character-sets-dir', 'column-names', 'column-type-info', 'comments', 'compress', 'connect-expired-password', 'connect_timeout', 'database', 'debug', 'debug-check', 'debug-info', 'default-auth', 'default-character-set', 'defaults-extra-file', 'defaults-file', 'defaults-group-suffix', 'delimiter', 'enable-cleartext-plugin', 'execute', 'force', 'get-server-public-key', 'help', 'histignore', 'host', 'html', 'ignore-spaces', 'init-command', 'line-numbers', 'local-infile', 'login-path', 'max_allowed_packet', 'max_join_size', 'named-commands', 'net_buffer_length', 'no-beep', 'one-database', 'pager', 'pipe', 'plugin-dir', 'port', 'print-defaults', 'protocol', 'quick', 'raw', 'reconnect', 'i-am-a-dummy', 'safe-updates', 'secure-auth', 'select_limit', 'server-public-key-path', 'shared-memory-base-name', 'show-warnings', 'sigint-ignore', 'silent', 'skip-auto-rehash', 'skip-column-names', 'skip-line-numbers', 'skip-named-commands', 'skip-pager', 'skip-reconnect', 'socket', 'ssl-ca', 'ssl-capath', 'ssl-cert', 'ssl-cipher', 'ssl-crl', 'ssl-crlpath', 'ssl-fips-mode', 'ssl-key', 'ssl-mode', 'syslog', 'table', 'tee', 'tls-version', 'unbuffered', 'verbose', 'version', 'vertical', 'wait', 'xml' ]; + $allowed_mysql_options = [ + 'auto-rehash', + 'auto-vertical-output', + 'batch', + 'binary-as-hex', + 'binary-mode', + 'bind-address', + 'character-sets-dir', + 'column-names', + 'column-type-info', + 'comments', + 'compress', + 'connect-expired-password', + 'connect_timeout', + 'database', + 'debug', + 'debug-check', + 'debug-info', + 'default-auth', + 'default-character-set', + 'defaults-extra-file', + 'defaults-file', + 'defaults-group-suffix', + 'delimiter', + 'enable-cleartext-plugin', + 'execute', + 'force', + 'get-server-public-key', + 'help', + 'histignore', + 'host', + 'html', + 'ignore-spaces', + 'init-command', + 'line-numbers', + 'local-infile', + 'login-path', + 'max_allowed_packet', + 'max_join_size', + 'named-commands', + 'net_buffer_length', + 'no-beep', + 'one-database', + 'pager', + 'pipe', + 'plugin-dir', + 'port', + 'print-defaults', + 'protocol', + 'quick', + 'raw', + 'reconnect', + 'i-am-a-dummy', + 'safe-updates', + 'secure-auth', + 'select_limit', + 'server-public-key-path', + 'shared-memory-base-name', + 'show-warnings', + 'sigint-ignore', + 'silent', + 'skip-auto-rehash', + 'skip-column-names', + 'skip-line-numbers', + 'skip-named-commands', + 'skip-pager', + 'skip-reconnect', + 'socket', + 'ssl-ca', + 'ssl-capath', + 'ssl-cert', + 'ssl-cipher', + 'ssl-crl', + 'ssl-crlpath', + 'ssl-fips-mode', + 'ssl-key', + 'ssl-mode', + 'syslog', + 'table', + 'tee', + 'tls-version', + 'unbuffered', + 'verbose', + 'version', + 'vertical', + 'wait', + 'xml' + ]; $mysql_args = array(); foreach ( $assoc_args as $mysql_option_key => $mysql_option_value ) { - // check flags is valid flag or not. - if ( in_array( $mysql_option_key, $allowed_mysql_option, true ) && ! empty( $mysql_option_value ) ) { + // Check flags to make sure they only contain valid options. + if ( in_array( $mysql_option_key, $allowed_mysql_options, true ) && ! empty( $mysql_option_value ) ) { $mysql_args[$mysql_option_key] = $mysql_option_value; - } }