Drush: commands/sql/sql.drush.inc Source File

  1. 7.x doxygen/html/sql_8drush_8inc_source.html
  2. master doxygen/html/sql_8drush_8inc_source.html
Go to the documentation of this file.
1 <?php
2 
3 /**
4  * @file
5  * Drush sql commands
6  */
7 
8 /**
9  * Implementation of hook_drush_help().
10  */
11 function sql_drush_help($section) {
12  switch ($section) {
13  case 'meta:sql:title':
14  return dt('SQL commands');
15  case 'meta:sql:summary':
16  return dt('Examine and modify your Drupal database.');
17  case 'drush:sql-sanitize':
18  return dt('Run sanitization operations on the current database. You can add more sanitization to this command by implementing hook_drush_sql_sync_sanitize().');
19  }
20 }
21 
22 /**
23  * Implementation of hook_drush_command().
24  */
25 function sql_drush_command() {
26  $options['database'] = array(
27  'description' => 'The DB connection key if using multiple connections in settings.php.',
28  'example-value' => 'key',
29  );
30  $db_url['db-url'] = array(
31  'description' => 'A Drupal 6 style database URL.',
32  'example-value' => 'mysql://root:pass@127.0.0.1/db',
33  );
34  $options['target'] = array(
35  'description' => 'The name of a target within the specified database connection. Defaults to \'default\'.',
36  'example-value' => 'key',
37  // Gets unhidden in help_alter(). We only want to show this to D7 users but have to
38  // declare it here since some commands do not bootstrap fully.
39  'hidden' => TRUE,
40  );
41 
42  $items['sql-drop'] = array(
43  'description' => 'Drop all tables in a given database.',
44  'arguments' => array(
45  ),
46  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
47  'options' => array(
48  'yes' => 'Skip confirmation and proceed.',
49  'result-file' => array(
50  'description' => 'Save to a file. The file should be relative to Drupal root. Recommended.',
51  'example-value' => '/path/to/file',
52  ),
53  ) + $options + $db_url,
54  'topics' => array('docs-policy'),
55  );
56  $items['sql-conf'] = array(
57  'description' => 'Print database connection details using print_r().',
58  'hidden' => TRUE,
59  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
60  'options' => array(
61  'all' => 'Show all database connections, instead of just one.',
62  'show-passwords' => 'Show database password.',
63  ) + $options,
64  'outputformat' => array(
65  'default' => 'print-r',
66  'pipe-format' => 'var_export',
67  'private-fields' => 'password',
68  ),
69  );
70  $items['sql-connect'] = array(
71  'description' => 'A string for connecting to the DB.',
72  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
73  'options' => $options + $db_url + array(
74  'extra' => array(
75  'description' => 'Add custom options to the mysql command.',
76  'example-value' => '--skip-column-names',
77  ),
78  ),
79  'examples' => array(
80  '`drush sql-connect` < example.sql' => 'Import sql statements from a file into the current database.',
81  ),
82  );
83  $items['sql-create'] = array(
84  'description' => 'Create a database.',
85  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
86  'examples' => array(
87  'drush sql-create' => 'Create the database for the current site.',
88  'drush @site.test sql-create' => 'Create the database as specified for @site.test.',
89  'drush sql-create --db-su=root --db-su-pw=rootpassword --db-url="mysql://drupal_db_user:drupal_db_password@127.0.0.1/drupal_db"' =>
90  'Create the database as specified in the db-url option.'
91  ),
92  'options' => array(
93  'db-su' => 'Account to use when creating a new database. Optional.',
94  'db-su-pw' => 'Password for the "db-su" account. Optional.',
95  ) + $options + $db_url,
96  );
97  $items['sql-dump'] = array(
98  'description' => 'Exports the Drupal DB as SQL using mysqldump or equivalent.',
99  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
100  'examples' => array(
101  'drush sql-dump --result-file=../18.sql' => 'Save SQL dump to the directory above Drupal root.',
102  'drush sql-dump --skip-tables-key=common' => 'Skip standard tables. @see example.drushrc.php',
103  ),
104  'options' => array(
105  'result-file' => array(
106  'description' => 'Save to a file. The file should be relative to Drupal root. If --result-file is provided with no value, then date based filename will be created under ~/drush-backups directory.',
107  'example-value' => '/path/to/file',
108  'value' => 'optional',
109  ),
110  'skip-tables-key' => 'A key in the $skip_tables array. @see example.drushrc.php. Optional.',
111  'structure-tables-key' => 'A key in the $structure_tables array. @see example.drushrc.php. Optional.',
112  'tables-key' => 'A key in the $tables array. Optional.',
113  'skip-tables-list' => 'A comma-separated list of tables to exclude completely. Optional.',
114  'structure-tables-list' => 'A comma-separated list of tables to include for structure, but not data. Optional.',
115  'tables-list' => 'A comma-separated list of tables to transfer. Optional.',
116  'create-db' => array('hidden' => TRUE, 'description' => 'Omit DROP TABLE statements. Postgres and Oracle only. Used by sql-sync, since including the DROP TABLE statements interfere with the import when the database is created.'),
117  'data-only' => 'Dump data without statements to create any of the schema.',
118  'ordered-dump' => 'Order by primary key and add line breaks for efficient diff in revision control. Slows down the dump. Mysql only.',
119  'gzip' => 'Compress the dump using the gzip program which must be in your $PATH.',
120  ) + $options + $db_url,
121  );
122  $items['sql-query'] = array(
123  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
124  'description' => 'Execute a query against a database.',
125  'examples' => array(
126  'drush sql-query "SELECT * FROM users WHERE uid=1"' => 'Browse user record. Table prefixes, if used, must be added to table names by hand.',
127  'drush sql-query --db-prefix "SELECT * FROM {users} WHERE uid=1"' => 'Browse user record. Table prefixes are honored. Caution: curly-braces will be stripped from all portions of the query.',
128  '`drush sql-connect` < example.sql' => 'Import sql statements from a file into the current database.',
129  'drush sql-query --file=example.sql' => 'Alternate way to import sql statements from a file.',
130  ),
131  'arguments' => array(
132  'query' => 'An SQL query. Ignored if \'file\' is provided.',
133  ),
134  'options' => array(
135  'result-file' => array(
136  'description' => 'Save to a file. The file should be relative to Drupal root. Optional.',
137  'example-value' => '/path/to/file',
138  ),
139  'file' => 'Path to a file containing the SQL to be run. Gzip files are accepted.',
140  'extra' => array(
141  'description' => 'Add custom options to the mysql command.',
142  'example-value' => '--skip-column-names',
143  ),
144  'db-prefix' => 'Enable replacement of braces in your query.',
145  'db-spec' => array(
146  'description' => 'A database specification',
147  'hidden' => TRUE, // Hide since this is only used with --backend calls.
148  )
149  ) + $options + $db_url,
150  'aliases' => array('sqlq'),
151  );
152  $items['sql-sync'] = array(
153  'description' => 'Copies the database contents from a source site to a target site. Transfers the database dump via rsync.',
154  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
155  'drush dependencies' => array('core'), // core-rsync.
156  'examples' => array(
157  'drush sql-sync @source @target' => 'Copy the database from the site with the alias "source" to the site with the alias "target".',
158  'drush sql-sync prod dev' => 'Copy the database from the site in /sites/prod to the site in /sites/dev (multisite installation).',
159  ),
160  'arguments' => array(
161  'source' => 'A site-alias or the name of a subdirectory within /sites whose database you want to copy from.',
162  'target' => 'A site-alias or the name of a subdirectory within /sites whose database you want to replace.',
163  ),
164  'required-arguments' => TRUE,
165  'options' => array(
166  'skip-tables-key' => 'A key in the $skip_tables array. See example.drushrc.php. Optional.',
167  'skip-tables-list' => 'A comma-separated list of tables to exclude completely. Optional.',
168  'structure-tables-key' => 'A key in the $structure_tables array. See example.drushrc.php. Optional.',
169  'structure-tables-list' => 'A comma-separated list of tables to include for structure, but not data. Optional.',
170  'tables-key' => 'A key in the $tables array. Optional.',
171  'tables-list' => 'A comma-separated list of tables to transfer. Optional.',
172  // 'cache' => 'Skip dump if result file exists and is less than "cache" hours old. Optional; default is 24 hours.',
173  // 'no-cache' => 'Do not cache the sql-dump file.',
174  'no-dump' => 'Do not dump the sql database; always use an existing dump file.',
175  'source-db-url' => 'Database specification for source system to dump from.',
176  'source-remote-port' => 'Override sql database port number in source-db-url. Optional.',
177  'source-remote-host' => 'Remote machine to run sql-dump file on. Optional; default is local machine.',
178  'source-dump' => 'The destination for the dump file, or the path to the dump file when --no-dump is specified.',
179  'source-database' => 'A key in the $db_url (D6) or $databases (D7+) array which provides the data.',
180  'source-target' => array(
181  'description' => 'A key within the SOURCE database identifying a particular server in the database group.',
182  'example-value' => 'key',
183  // Gets unhidden in help_alter(). We only want to show to D7+ users but have to
184  // declare it here since this command does not bootstrap fully.
185  'hidden' => TRUE,
186  ),
187  'target-db-url' => '',
188  'target-remote-port' => '',
189  'target-remote-host' => '',
190  'target-dump' => 'A path for saving the dump file on target. Mandatory when using --no-sync.',
191  'target-database' => 'A key in the $db_url (D6) or $databases (D7+) array which shall receive the data.',
192  'target-target' => array(
193  'description' => 'Oy. A key within the TARGET database identifying a particular server in the database group.',
194  'example-value' => 'key',
195  // Gets unhidden in help_alter(). We only want to show to D7+ users but have to
196  // declare it here since this command does not bootstrap fully.
197  'hidden' => TRUE,
198  ),
199  // 'temp' => 'Use a temporary file to hold dump files. Implies --no-cache.',
200  // 'dump-dir' => 'Directory to store sql dump files in when --source-dump or --target-dump are not used.',
201  'create-db' => 'Create a new database before importing the database dump on the target machine.',
202  'db-su' => array(
203  'description' => 'Account to use when creating a new database. Optional.',
204  'example-value' => 'root',
205  ),
206  'db-su-pw' => array(
207  'description' => 'Password for the "db-su" account. Optional.',
208  'example-value' => 'pass',
209  ),
210  // 'no-ordered-dump' => 'Do not pass --ordered-dump to sql-dump. sql-sync orders the dumpfile by default in order to increase the efficiency of rsync.',
211  'sanitize' => 'Obscure email addresses and reset passwords in the user table post-sync.',
212  ),
213  'sub-options' => array(
214  'sanitize' => array(
215  'sanitize-password' => 'The password to assign to all accounts in the sanitization operation, or "no" to keep passwords unchanged. Default is "password".',
216  'sanitize-email' => 'The pattern for test email addresses in the sanitization operation, or "no" to keep email addresses unchanged. May contain replacement patterns %uid, %mail or %name. Default is "user+%uid@localhost".',
217  'confirm-sanitizations' => 'Prompt yes/no after importing the database, but before running the sanitizations',
218  ),
219  ),
220  'topics' => array('docs-aliases', 'docs-policy', 'docs-example-sync-via-http', 'docs-example-sync-extension'),
221  );
222  $items['sql-cli'] = array(
223  'description' => "Open a SQL command-line interface using Drupal's credentials.",
224  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
225  // 'options' => $options + $db_url,
226  'allow-additional-options' => array('sql-connect'),
227  'aliases' => array('sqlc'),
228  'examples' => array(
229  'drush sql-cli' => "Open a SQL command-line interface using Drupal's credentials.",
230  'drush sql-cli --extra=-A' => "Open a SQL CLI and skip reading table information.",
231  ),
232  'remote-tty' => TRUE,
233  );
234  $items['sql-sanitize'] = array(
235  'description' => "Run sanitization operations on the current database.",
236  'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
237  'options' => array(
238  'db-prefix' => 'Enable replacement of braces in sanitize queries.',
239  'sanitize-password' => 'The password to assign to all accounts in the sanitization operation, or "no" to keep passwords unchanged. Default is "password".',
240  'sanitize-email' => 'The pattern for test email addresses in the sanitization operation, or "no" to keep email addresses unchanged. May contain replacement patterns %uid, %mail or %name. Default is "user+%uid@localhost".',
241  ) + $db_url,
242  'aliases' => array('sqlsan'),
243  );
244  return $items;
245 }
246 
247 /**
248  * Implements hook_drush_help_alter().
249  */
250 function sql_drush_help_alter(&$command) {
251  // Drupal 7+ only options.
252  if (drush_drupal_major_version() >= 7) {
253  if ($command['command'] == 'sql-sync') {
254  unset($command['options']['source-target']['hidden'], $command['options']['target-target']['hidden']);
255  }
256  elseif ($command['commandfile'] == 'sql') {
257  unset($command['options']['target']['hidden']);
258  }
259  }
260 }
261 
262 /**
263  * Command argument complete callback.
264  *
265  * @return
266  * Array of available site aliases.
267  */
269  return array('values' => array_keys(_drush_sitealias_all_list()));
270 }
271 
272 /**
273  * Safely bootstrap Drupal to the point where we can
274  * access the database configuration.
275  */
277  // Under Drupal 7, if the database is configured but empty, then
278  // DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION will throw an exception.
279  // If this happens, we'll just catch it and continue.
280  // TODO: Fix this in the bootstrap, per http://drupal.org/node/1996004
281  try {
283  }
284  catch (Exception $e) {
285  }
286 }
287 
288 /**
289  * Check whether further bootstrap is needed. If so, do it.
290  */
292  if (!drush_get_option(array('db-url', 'db-spec'))) {
294  }
295 }
296 
297 /**
298  * Command callback. Displays the Drupal site's database connection string.
299  */
300 function drush_sql_conf() {
302  if (drush_get_option('all')) {
303  $sqlVersion = drush_sql_get_version();
304  return $sqlVersion->getAll();
305  }
306  else {
307  $sql = drush_sql_get_class();
308  return $sql->db_spec();
309  }
310 }
311 
312 /**
313  * Command callback. Emits a connect string.
314  */
315 function drush_sql_connect() {
317  $sql = drush_sql_get_class();
318  return $sql->connect(FALSE);
319 }
320 
321 /**
322  * Command callback. Create a database.
323  */
324 function drush_sql_create() {
326  $sql = drush_sql_get_class();
327  $db_spec = $sql->db_spec();
328  // Prompt for confirmation.
329  if (!drush_get_context('DRUSH_SIMULATE')) {
330  // @todo odd - maybe for sql-sync.
331  $txt_destination = (isset($db_spec['remote-host']) ? $db_spec['remote-host'] . '/' : '') . $db_spec['database'];
332  drush_print(dt("Creating database !target. Any possible existing database will be dropped!", array('!target' => $txt_destination)));
333 
334  if (!drush_confirm(dt('Do you really want to continue?'))) {
335  return drush_user_abort();
336  }
337  }
338 
339  return $sql->createdb();
340 }
341 
342 
343 /**
344  * Command callback. Outputs the entire Drupal database in SQL format using mysqldump or equivalent.
345  */
346 function drush_sql_dump() {
348  $sql = drush_sql_get_class();
349  return $sql->dump(drush_get_option('result-file', FALSE));
350 }
351 
352 /**
353  * Construct an array that places table names in appropriate
354  * buckets based on whether the table is to be skipped, included
355  * for structure only, or have structure and data dumped.
356  * The keys of the array are:
357  * - skip: tables to be skipped completed in the dump
358  * - structure: tables to only have their structure i.e. DDL dumped
359  * - tables: tables to have structure and data dumped
360  *
361  * @return array
362  * An array of table names with each table name in the appropriate
363  * element of the array.
364  */
366  // Skip large core tables if instructed. Used by 'sql-drop/sql-dump/sql-sync' commands.
367  $skip_tables = _drush_sql_get_raw_table_list('skip-tables');
368  // Skip any structure-tables as well.
369  $structure_tables = _drush_sql_get_raw_table_list('structure-tables');
370  // Dump only the specified tables. Takes precedence over skip-tables and structure-tables.
371  $tables = _drush_sql_get_raw_table_list('tables');
372 
373  return array('skip' => $skip_tables, 'structure' => $structure_tables, 'tables' => $tables);
374 }
375 
376 /**
377  * Expand wildcard tables.
378  *
379  * @param array $tables
380  * An array of table names, some of which may contain wildcards (`*`).
381  * @param array $db_tables
382  * An array with all the existing table names in the current database.
383  * @return
384  * $tables array with wildcards resolved to real table names.
385  */
386 function drush_sql_expand_wildcard_tables($tables, $db_tables) {
387  // Table name expansion based on `*` wildcard.
388  $expanded_db_tables = array();
389  foreach ($tables as $k => $table) {
390  // Only deal with table names containing a wildcard.
391  if (strpos($table, '*') !== FALSE) {
392  $pattern = '/^' . str_replace('*', '.*', $table) . '$/i';
393  // Merge those existing tables which match the pattern with the rest of
394  // the expanded table names.
395  $expanded_db_tables += preg_grep($pattern, $db_tables);
396  }
397  }
398  return $expanded_db_tables;
399 }
400 
401 /**
402  * Filters tables.
403  *
404  * @param array $tables
405  * An array of table names to filter.
406  * @param array $db_tables
407  * An array with all the existing table names in the current database.
408  * @return
409  * An array with only valid table names (i.e. all of which actually exist in
410  * the database).
411  */
412 function drush_sql_filter_tables($tables, $db_tables) {
413  // Ensure all the tables actually exist in the database.
414  foreach ($tables as $k => $table) {
415  if (!in_array($table, $db_tables)) {
416  unset($tables[$k]);
417  }
418  }
419 
420  return $tables;
421 }
422 
423 /**
424  * Given the table names in the input array that may contain wildcards (`*`),
425  * expand the table names so that the array returned only contains table names
426  * that exist in the database.
427  *
428  * @param array $tables
429  * An array of table names where the table names may contain the
430  * `*` wildcard character.
431  * @param array $db_tables
432  * The list of tables present in a database.
433  * @return array
434  * An array of tables with non-existant tables removed.
435  */
436 function _drush_sql_expand_and_filter_tables($tables, $db_tables) {
437  $expanded_tables = drush_sql_expand_wildcard_tables($tables, $db_tables);
438  $tables = drush_sql_filter_tables(array_merge($tables, $expanded_tables), $db_tables);
439  $tables = array_unique($tables);
440  sort($tables);
441  return $tables;
442 }
443 
444 /**
445  * Consult the specified options and return the list of tables
446  * specified.
447  *
448  * @param option_name
449  * The option name to check: skip-tables, structure-tables
450  * or tables. This function will check both *-key and *-list,
451  * and, in the case of sql-sync, will also check target-*
452  * and source-*, to see if an alias set one of these options.
453  * @returns array
454  * Returns an array of tables based on the first option
455  * found, or an empty array if there were no matches.
456  */
457 function _drush_sql_get_raw_table_list($option_name) {
458  foreach(array('' => 'cli', 'target-,,source-' => NULL) as $prefix_list => $context) {
459  foreach(explode(',',$prefix_list) as $prefix) {
460  $key_list = drush_get_option($prefix . $option_name . '-key', NULL, $context);
461  foreach(explode(',', $key_list) as $key) {
462  $all_tables = drush_get_option($option_name, array());
463  if (array_key_exists($key, $all_tables)) {
464  return $all_tables[$key];
465  }
466  if ($option_name != 'tables') {
467  $all_tables = drush_get_option('tables', array());
468  if (array_key_exists($key, $all_tables)) {
469  return $all_tables[$key];
470  }
471  }
472  }
473  $table_list = drush_get_option($prefix . $option_name . '-list', NULL, $context);
474  if (isset($table_list)) {
475  return empty($table_list) ? array() : explode(',', $table_list);
476  }
477  }
478  }
479 
480  return array();
481 }
482 
483 /**
484  * Command callback. Executes the given SQL query on the Drupal database.
485  */
486 function drush_sql_query($query = NULL) {
488  $filename = drush_get_option('file', NULL);
489  // Enable prefix processing when db-prefix option is used.
490  if (drush_get_option('db-prefix')) {
492  }
493  if (drush_get_context('DRUSH_SIMULATE')) {
494  if ($query) {
495  drush_print(dt('Simulating sql-query: !q', array('!q' => $query)));
496  }
497  else {
498  drush_print(dt('Simulating sql-import from !f', array('!f' => drush_get_option('file'))));
499  }
500  }
501  else {
502  $sql = drush_sql_get_class(drush_get_option('db-spec'));
503  $result = $sql->query($query, $filename, FALSE, drush_get_option('result-file'));
504  if (!$result) {
505  return drush_set_error('DRUSH_SQL_NO_QUERY', dt('Query failed.'));
506  }
508  }
509  return TRUE;
510 }
511 
512 /**
513  * Drops all tables in the database.
514  */
515 function drush_sql_drop() {
517  $sql = drush_sql_get_class();
518  $db_spec = $sql->db_spec();
519  if (!drush_confirm(dt('Do you really want to drop all tables in the database !db?', array('!db' => $db_spec['database'])))) {
520  return drush_user_abort();
521  }
522  $tables = $sql->listTables();
523  $sql->drop($tables);
524 }
525 
526 function drush_sql_cli() {
528  $sql = drush_sql_get_class();
529  return !(bool)drush_shell_proc_open($sql->connect());
530 }
531 
532 /**
533  * Command callback. Run's the sanitization operations on the current database.
534  *
535  * @see hook_drush_sql_sync_sanitize() for adding custom sanitize routines.
536  */
537 function drush_sql_sanitize() {
539  if (drush_get_option('db-prefix')) {
541  }
542  drush_include(DRUSH_BASE_PATH . '/commands/sql', 'sync.sql');
543  drush_command_invoke_all('drush_sql_sync_sanitize', 'default');
544  $options = drush_get_context('post-sync-ops');
545  if (!empty($options)) {
546  if (!drush_get_context('DRUSH_SIMULATE')) {
547  $messages = _drush_sql_get_post_sync_messages();
548  if ($messages) {
549  drush_print();
550  drush_print($messages);
551  }
552  }
553  }
554  if (!drush_confirm(dt('Do you really want to sanitize the current database?'))) {
555  return drush_user_abort();
556  }
557 
558  $sanitize_query = '';
559  foreach($options as $id => $data) {
560  // Enable prefix processing when db-prefix option is used.
561  if (drush_get_option('db-prefix')) {
562  if (drush_drupal_major_version() >= 7) {
563  $data['query'] = Database::getConnection()->prefixTables($data['query']);
564  }
565  else {
566  $data['query'] = db_prefix_tables($data['query']);
567  }
568  }
569  $sanitize_query .= $data['query'] . " ";
570  }
571  if ($sanitize_query) {
572  $sql = drush_sql_get_class();
573  $result = $sql->query($sanitize_query);
574  }
575 }
576 
577 /**
578  * Call from a pre-sql-sync hook to register an sql
579  * query to be executed in the post-sql-sync hook.
580  * @see drush_sql_pre_sql_sync() and @see drush_sql_post_sql_sync().
581  *
582  * @param $id
583  * String containing an identifier representing this
584  * operation. This id is not actually used at the
585  * moment, it is just used to fufill the contract
586  * of drush contexts.
587  * @param $message
588  * String with the confirmation message that describes
589  * to the user what the post-sync operation is going
590  * to do. This confirmation message is printed out
591  * just before the user is asked whether or not the
592  * sql-sync operation should be continued.
593  * @param $query
594  * String containing the sql query to execute. If no
595  * query is provided, then the confirmation message will
596  * be displayed to the user, but no action will be taken
597  * in the post-sync hook. This is useful for drush modules
598  * that wish to provide their own post-sync hooks to fix
599  * up the target database in other ways (e.g. through
600  * Drupal APIs).
601  */
602 function drush_sql_register_post_sync_op($id, $message, $query = NULL) {
603  $options = drush_get_context('post-sync-ops');
604 
605  $options[$id] = array('message' => $message, 'query' => $query);
606 
607  drush_set_context('post-sync-ops', $options);
608 }
609 
610 /**
611  * Builds a confirmation message for all post-sync operations.
612  *
613  * @return string
614  * All post-sync operation messages concatenated together.
615  */
617  $messages = FALSE;
618 
619  $options = drush_get_context('post-sync-ops');
620  if (!empty($options)) {
621  $messages = dt('The following post-sync operations will be done on the destination:') . "\n";
622 
623  foreach($options as $id => $data) {
624  $messages .= " * " . $data['message'] . "\n";
625  }
626  }
627 
628  return $messages;
629 }
630 
631 /**
632  * Wrapper for drush_get_class; instantiates an driver-specific instance
633  * of SqlBase class.
634  *
635  * @param array $db_spec
636  * If known, specify a $db_spec that the class can operate with.
637  *
638  * @throws \Drush\Sql\SqlException
639  *
640  * @return Drush\Sql\SqlBase
641  */
642 function drush_sql_get_class($db_spec = NULL) {
643  $database = drush_get_option('database', 'default');
644  $target = drush_get_option('target', 'default');
645 
646  // Try a few times to quickly get $db_spec.
647  if ($db_spec) {
648  return drush_get_class('Drush\Sql\Sql', array($db_spec), array($db_spec['driver']));
649  }
650  elseif ($url = drush_get_option('db-url')) {
651  $url = is_array($url) ? $url[$database] : $url;
652  $db_spec = drush_convert_db_from_db_url($url);
653  $db_spec['db_prefix'] = drush_get_option('db-prefix');
654  return drush_sql_get_class($db_spec);
655  }
656  elseif (($databases = drush_get_option('databases')) && (array_key_exists($database, $databases)) && (array_key_exists($target, $databases[$database]))) {
657  $db_spec = $databases[$database][$target];
658  return drush_sql_get_class($db_spec);
659  }
660  else {
661  // No parameter or options provided. Determine $db_spec ourselves.
662  if ($sqlVersion = drush_sql_get_version()) {
663  if ($db_spec = $sqlVersion->get_db_spec()) {
664  return drush_sql_get_class($db_spec);
665  }
666  }
667  }
668 
669  throw new \Drush\Sql\SqlException('Unable to find a matching SQL Class. Drush cannot find your database connection details.');
670 }
671 
672 function drush_sql_get_version() {
673  return drush_get_class('Drush\Sql\Sql', array(), array(drush_drupal_major_version())) ?: NULL;
674 }
675 
676 /**
677  * Implements hook_sql_drush_sql_sync_sanitize.
678  *
679  * Sanitize usernames, passwords, and sessions when the --sanitize option is used.
680  * It is also an example of how to write a database sanitizer for sql sync.
681  *
682  * To write your own sync hook function, define mymodule_drush_sql_sync_sanitize()
683  * and follow the form of this function to add your own database
684  * sanitization operations via the register post-sync op function;
685  * @see drush_sql_register_post_sync_op(). This is the only thing that the
686  * sync hook function needs to do; sql-sync takes care of the rest.
687  *
688  * The function below has a lot of logic to process user preferences and
689  * generate the correct SQL regardless of whether Postgres, Mysql,
690  * Drupal 6/7/8 is in use. A simpler sanitize function that
691  * always used default values and only worked with Drupal 6 + mysql
692  * appears in the drush.api.php. @see hook_drush_sql_sync_sanitize().
693  */
695  $site_settings = drush_sitealias_get_record($site);
696  $databases = sitealias_get_databases_from_record($site_settings);
697  $prefix = $databases['default']['default']['prefix'];
698  $prefix = isset($databases['default']['default']['prefix']) ? $databases['default']['default']['prefix'] : '';
699  $user_table_updates = array();
700  $message_list = array();
701 
702  // Sanitize passwords.
703  $newpassword = drush_get_option(array('sanitize-password', 'destination-sanitize-password'), 'password');
704  if ($newpassword != 'no' && $newpassword !== 0) {
705  $major_version = drush_drupal_major_version();
706  $pw_op = "";
707 
708  // In Drupal 6, passwords are hashed via the MD5 algorithm.
709  if ($major_version == 6) {
710  $pw_op = "MD5('$newpassword')";
711  }
712  // In Drupal 7, passwords are hashed via a more complex algorithm,
713  // available via the user_hash_password function.
714  elseif ($major_version == 7) {
715  $core = DRUSH_DRUPAL_CORE;
716  include_once $core . '/includes/password.inc';
717  include_once $core . '/includes/bootstrap.inc';
718  $hash = user_hash_password($newpassword);
719  $pw_op = "'$hash'";
720  }
721  else {
722  // D8+. Mimic Drupal's /scripts/password-hash.sh
724  $password_hasher = \Drupal::service('password');
725  $hash = $password_hasher->hash($newpassword);
726  $pw_op = "'$hash'";
727  }
728  if (!empty($pw_op)) {
729  $user_table_updates[] = "pass = $pw_op";
730  $message_list[] = "passwords";
731  }
732  }
733 
734  // Sanitize email addresses.
735  $newemail = drush_get_option(array('sanitize-email', 'destination-sanitize-email'), 'user+%uid@localhost.localdomain');
736  if ($newemail != 'no' && $newemail !== 0) {
737  if (strpos($newemail, '%') !== FALSE) {
738  // We need a different sanitization query for Postgres and Mysql.
739 
740  $db_driver = $databases['default']['default']['driver'];
741  if ($db_driver == 'pgsql') {
742  $email_map = array('%uid' => "' || uid || '", '%mail' => "' || replace(mail, '@', '_') || '", '%name' => "' || replace(name, ' ', '_') || '");
743  $newmail = "'" . str_replace(array_keys($email_map), array_values($email_map), $newemail) . "'";
744  }
745  else {
746  $email_map = array('%uid' => "', uid, '", '%mail' => "', replace(mail, '@', '_'), '", '%name' => "', replace(name, ' ', '_'), '");
747  $newmail = "concat('" . str_replace(array_keys($email_map), array_values($email_map), $newemail) . "')";
748  }
749  $user_table_updates[] = "mail = $newmail, init = $newmail";
750  }
751  else {
752  $user_table_updates[] = "mail = '$newemail', init = '$newemail'";
753  }
754  $message_list[] = 'email addresses';
755  }
756 
757  if (!empty($user_table_updates)) {
758  $table = $major_version >= 8 ? 'users_field_data' : 'users';
759  $sanitize_query = "UPDATE {$prefix}{$table} SET " . implode(', ', $user_table_updates) . " WHERE uid > 0;";
760  drush_sql_register_post_sync_op('user-email', dt('Reset !message in !table table', array('!message' => implode(' and ', $message_list), '!table' => $table)), $sanitize_query);
761  }
762 
763  // Seems quite portable (SQLite?) - http://en.wikipedia.org/wiki/Truncate_(SQL)
764  $sql_sessions = "TRUNCATE TABLE {$prefix}sessions;";
765  drush_sql_register_post_sync_op('sessions', dt('Truncate Drupal\'s sessions table'), $sql_sessions);
766 }

File

doxygen/html/sql_8drush_8inc_source.html
View source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>Drush: commands/sql/sql.drush.inc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Drush
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_a58f00770bab6224494a64dcb760b840.html">sql</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">sql.drush.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="sql_8drush_8inc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;&lt;?php</div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * @file</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * Drush sql commands</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> * Implementation of hook_drush_help().</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a8a9ff7dfb06fb647e0536745e416cc4c">   11</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a8a9ff7dfb06fb647e0536745e416cc4c">sql_drush_help</a>($section) {</div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;  <span class="keywordflow">switch</span> ($section) {</div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:sql:title&#39;</span>:</div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;SQL commands&#39;</span>);</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;meta:sql:summary&#39;</span>:</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Examine and modify your Drupal database.&#39;</span>);</div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;drush:sql-sanitize&#39;</span>:</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Run sanitization operations on the current database. You can add more sanitization to this command by implementing hook_drush_sql_sync_sanitize().&#39;</span>);</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;  }</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;}</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * Implementation of hook_drush_command().</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a914168c58c63d217348013ba39f9c133">   25</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a914168c58c63d217348013ba39f9c133">sql_drush_command</a>() {</div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;  $options[<span class="stringliteral">&#39;database&#39;</span>] = array(</div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;The DB connection key if using multiple connections in settings.php.&#39;</span>,</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;key&#39;</span>,</div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;  );</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  $db_url[<span class="stringliteral">&#39;db-url&#39;</span>] = array(</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;A Drupal 6 style database URL.&#39;</span>,</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;mysql://root:pass@127.0.0.1/db&#39;</span>,</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;  );</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;  $options[<span class="stringliteral">&#39;target&#39;</span>] = array(</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;The name of a target within the specified database connection. Defaults to \&#39;default\&#39;.&#39;</span>,</div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;key&#39;</span>,</div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="comment">// Gets unhidden in help_alter(). We only want to show this to D7 users but have to</span></div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    <span class="comment">// declare it here since some commands do not bootstrap fully.</span></div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;  );</div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;  $items[<span class="stringliteral">&#39;sql-drop&#39;</span>] = array(</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Drop all tables in a given database.&#39;</span>,</div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    ),</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;      <span class="stringliteral">&#39;yes&#39;</span> =&gt; <span class="stringliteral">&#39;Skip confirmation and proceed.&#39;</span>,</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;      <span class="stringliteral">&#39;result-file&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Save to a file. The file should be relative to Drupal root. Recommended.&#39;</span>,</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;/path/to/file&#39;</span>,</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;      ),</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    ) + $options + $db_url,</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="stringliteral">&#39;topics&#39;</span> =&gt; array(<span class="stringliteral">&#39;docs-policy&#39;</span>),</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;  );</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;  $items[<span class="stringliteral">&#39;sql-conf&#39;</span>] = array(</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Print database connection details using print_r().&#39;</span>,</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;      <span class="stringliteral">&#39;all&#39;</span> =&gt; <span class="stringliteral">&#39;Show all database connections, instead of just one.&#39;</span>,</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;      <span class="stringliteral">&#39;show-passwords&#39;</span> =&gt; <span class="stringliteral">&#39;Show database password.&#39;</span>,</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    ) + $options,</div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    <span class="stringliteral">&#39;outputformat&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;      <span class="stringliteral">&#39;default&#39;</span> =&gt; <span class="stringliteral">&#39;print-r&#39;</span>,</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;      <span class="stringliteral">&#39;pipe-format&#39;</span> =&gt; <span class="stringliteral">&#39;var_export&#39;</span>,</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;      <span class="stringliteral">&#39;private-fields&#39;</span> =&gt; <span class="stringliteral">&#39;password&#39;</span>,</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    ),</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;  );</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;  $items[<span class="stringliteral">&#39;sql-connect&#39;</span>] = array(</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;A string for connecting to the DB.&#39;</span>,</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; $options + $db_url + array(</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        <span class="stringliteral">&#39;extra&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;          <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Add custom options to the mysql command.&#39;</span>,</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;          <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;--skip-column-names&#39;</span>,</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;        ),</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;      ),</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;      <span class="stringliteral">&#39;`drush sql-connect` &lt; example.sql&#39;</span> =&gt; <span class="stringliteral">&#39;Import sql statements from a file into the current database.&#39;</span>,</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    ),</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;  );</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  $items[<span class="stringliteral">&#39;sql-create&#39;</span>] = array(</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Create a database.&#39;</span>,</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;      <span class="stringliteral">&#39;drush sql-create&#39;</span> =&gt; <span class="stringliteral">&#39;Create the database for the current site.&#39;</span>,</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;      <span class="stringliteral">&#39;drush @site.test sql-create&#39;</span> =&gt; <span class="stringliteral">&#39;Create the database as specified for @site.test.&#39;</span>,</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;      <span class="stringliteral">&#39;drush sql-create --db-su=root --db-su-pw=rootpassword --db-url=&quot;mysql://drupal_db_user:drupal_db_password@127.0.0.1/drupal_db&quot;&#39;</span> =&gt;</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        <span class="stringliteral">&#39;Create the database as specified in the db-url option.&#39;</span></div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    ),</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;      <span class="stringliteral">&#39;db-su&#39;</span> =&gt; <span class="stringliteral">&#39;Account to use when creating a new database. Optional.&#39;</span>,</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;      <span class="stringliteral">&#39;db-su-pw&#39;</span> =&gt; <span class="stringliteral">&#39;Password for the &quot;db-su&quot; account. Optional.&#39;</span>,</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    ) + $options + $db_url,</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;  );</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  $items[<span class="stringliteral">&#39;sql-dump&#39;</span>] = array(</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Exports the Drupal DB as SQL using mysqldump or equivalent.&#39;</span>,</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;      <span class="stringliteral">&#39;drush sql-dump --result-file=../18.sql&#39;</span> =&gt; <span class="stringliteral">&#39;Save SQL dump to the directory above Drupal root.&#39;</span>,</div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;      <span class="stringliteral">&#39;drush sql-dump --skip-tables-key=common&#39;</span> =&gt; <span class="stringliteral">&#39;Skip standard tables. @see example.drushrc.php&#39;</span>,</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    ),</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;      <span class="stringliteral">&#39;result-file&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Save to a file. The file should be relative to Drupal root. If --result-file is provided with no value, then date based filename will be created under ~/drush-backups directory.&#39;</span>,</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;/path/to/file&#39;</span>,</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;        <span class="stringliteral">&#39;value&#39;</span> =&gt; <span class="stringliteral">&#39;optional&#39;</span>,</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;      ),</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;      <span class="stringliteral">&#39;skip-tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $skip_tables array. @see example.drushrc.php. Optional.&#39;</span>,</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      <span class="stringliteral">&#39;structure-tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $structure_tables array. @see example.drushrc.php. Optional.&#39;</span>,</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;      <span class="stringliteral">&#39;tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $tables array. Optional.&#39;</span>,</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;      <span class="stringliteral">&#39;skip-tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to exclude completely. Optional.&#39;</span>,</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;      <span class="stringliteral">&#39;structure-tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to include for structure, but not data. Optional.&#39;</span>,</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;      <span class="stringliteral">&#39;tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to transfer. Optional.&#39;</span>,</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;      <span class="stringliteral">&#39;create-db&#39;</span> =&gt; array(<span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE, <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Omit DROP TABLE statements. Postgres and Oracle only.  Used by sql-sync, since including the DROP TABLE statements interfere with the import when the database is created.&#39;</span>),</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;      <span class="stringliteral">&#39;data-only&#39;</span> =&gt; <span class="stringliteral">&#39;Dump data without statements to create any of the schema.&#39;</span>,</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;      <span class="stringliteral">&#39;ordered-dump&#39;</span> =&gt; <span class="stringliteral">&#39;Order by primary key and add line breaks for efficient diff in revision control. Slows down the dump. Mysql only.&#39;</span>,</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;      <span class="stringliteral">&#39;gzip&#39;</span> =&gt; <span class="stringliteral">&#39;Compress the dump using the gzip program which must be in your $PATH.&#39;</span>,</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    ) + $options + $db_url,</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;  );</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;  $items[<span class="stringliteral">&#39;sql-query&#39;</span>] = array(</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Execute a query against a database.&#39;</span>,</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;      <span class="stringliteral">&#39;drush sql-query &quot;SELECT * FROM users WHERE uid=1&quot;&#39;</span> =&gt; <span class="stringliteral">&#39;Browse user record. Table prefixes, if used, must be added to table names by hand.&#39;</span>,</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;      <span class="stringliteral">&#39;drush sql-query --db-prefix &quot;SELECT * FROM {users} WHERE uid=1&quot;&#39;</span> =&gt; <span class="stringliteral">&#39;Browse user record. Table prefixes are honored.  Caution: curly-braces will be stripped from all portions of the query.&#39;</span>,</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;      <span class="stringliteral">&#39;`drush sql-connect` &lt; example.sql&#39;</span> =&gt; <span class="stringliteral">&#39;Import sql statements from a file into the current database.&#39;</span>,</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;      <span class="stringliteral">&#39;drush sql-query --file=example.sql&#39;</span> =&gt; <span class="stringliteral">&#39;Alternate way to import sql statements from a file.&#39;</span>,</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    ),</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;       <span class="stringliteral">&#39;query&#39;</span> =&gt; <span class="stringliteral">&#39;An SQL query. Ignored if \&#39;file\&#39; is provided.&#39;</span>,</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    ),</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;      <span class="stringliteral">&#39;result-file&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Save to a file. The file should be relative to Drupal root. Optional.&#39;</span>,</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;/path/to/file&#39;</span>,</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;      ),</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;      <span class="stringliteral">&#39;file&#39;</span> =&gt; <span class="stringliteral">&#39;Path to a file containing the SQL to be run. Gzip files are accepted.&#39;</span>,</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;      <span class="stringliteral">&#39;extra&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Add custom options to the mysql command.&#39;</span>,</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;--skip-column-names&#39;</span>,</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;      ),</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;      <span class="stringliteral">&#39;db-prefix&#39;</span> =&gt; <span class="stringliteral">&#39;Enable replacement of braces in your query.&#39;</span>,</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;      <span class="stringliteral">&#39;db-spec&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;A database specification&#39;</span>,</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE, <span class="comment">// Hide since this is only used with --backend calls.</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;      )</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    ) + $options + $db_url,</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;sqlq&#39;</span>),</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;  );</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;  $items[<span class="stringliteral">&#39;sql-sync&#39;</span>] = array(</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Copies the database contents from a source site to a target site. Transfers the database dump via rsync.&#39;</span>,</div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="stringliteral">&#39;drush dependencies&#39;</span> =&gt; array(<span class="stringliteral">&#39;core&#39;</span>), <span class="comment">// core-rsync.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;      <span class="stringliteral">&#39;drush sql-sync @source @target&#39;</span> =&gt; <span class="stringliteral">&#39;Copy the database from the site with the alias &quot;source&quot; to the site with the alias &quot;target&quot;.&#39;</span>,</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;      <span class="stringliteral">&#39;drush sql-sync prod dev&#39;</span> =&gt; <span class="stringliteral">&#39;Copy the database from the site in /sites/prod to the site in /sites/dev (multisite installation).&#39;</span>,</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    ),</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    <span class="stringliteral">&#39;arguments&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;      <span class="stringliteral">&#39;source&#39;</span> =&gt; <span class="stringliteral">&#39;A site-alias or the name of a subdirectory within /sites whose database you want to copy from.&#39;</span>,</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;      <span class="stringliteral">&#39;target&#39;</span> =&gt; <span class="stringliteral">&#39;A site-alias or the name of a subdirectory within /sites whose database you want to replace.&#39;</span>,</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;    ),</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <span class="stringliteral">&#39;required-arguments&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;      <span class="stringliteral">&#39;skip-tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $skip_tables array. See example.drushrc.php. Optional.&#39;</span>,</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;      <span class="stringliteral">&#39;skip-tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to exclude completely. Optional.&#39;</span>,</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;      <span class="stringliteral">&#39;structure-tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $structure_tables array. See example.drushrc.php. Optional.&#39;</span>,</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;      <span class="stringliteral">&#39;structure-tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to include for structure, but not data. Optional.&#39;</span>,</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;      <span class="stringliteral">&#39;tables-key&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $tables array. Optional.&#39;</span>,</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;      <span class="stringliteral">&#39;tables-list&#39;</span> =&gt; <span class="stringliteral">&#39;A comma-separated list of tables to transfer. Optional.&#39;</span>,</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;      <span class="comment">// &#39;cache&#39; =&gt; &#39;Skip dump if result file exists and is less than &quot;cache&quot; hours old. Optional; default is 24 hours.&#39;,</span></div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;      <span class="comment">// &#39;no-cache&#39; =&gt; &#39;Do not cache the sql-dump file.&#39;,</span></div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;      <span class="stringliteral">&#39;no-dump&#39;</span> =&gt; <span class="stringliteral">&#39;Do not dump the sql database; always use an existing dump file.&#39;</span>,</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;      <span class="stringliteral">&#39;source-db-url&#39;</span> =&gt; <span class="stringliteral">&#39;Database specification for source system to dump from.&#39;</span>,</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;      <span class="stringliteral">&#39;source-remote-port&#39;</span> =&gt; <span class="stringliteral">&#39;Override sql database port number in source-db-url. Optional.&#39;</span>,</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;      <span class="stringliteral">&#39;source-remote-host&#39;</span> =&gt; <span class="stringliteral">&#39;Remote machine to run sql-dump file on. Optional; default is local machine.&#39;</span>,</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;      <span class="stringliteral">&#39;source-dump&#39;</span> =&gt; <span class="stringliteral">&#39;The destination for the dump file, or the path to the dump file when --no-dump is specified.&#39;</span>,</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;      <span class="stringliteral">&#39;source-database&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $db_url (D6) or $databases (D7+) array which provides the data.&#39;</span>,</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;      <span class="stringliteral">&#39;source-target&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;A key within the SOURCE database identifying a particular server in the database group.&#39;</span>,</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;key&#39;</span>,</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;        <span class="comment">// Gets unhidden in help_alter(). We only want to show to D7+ users but have to</span></div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;        <span class="comment">// declare it here since this command does not bootstrap fully.</span></div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;        <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      ),</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;      <span class="stringliteral">&#39;target-db-url&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;      <span class="stringliteral">&#39;target-remote-port&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;      <span class="stringliteral">&#39;target-remote-host&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;      <span class="stringliteral">&#39;target-dump&#39;</span> =&gt; <span class="stringliteral">&#39;A path for saving the dump file on target. Mandatory when using --no-sync.&#39;</span>,</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;      <span class="stringliteral">&#39;target-database&#39;</span> =&gt; <span class="stringliteral">&#39;A key in the $db_url (D6) or $databases (D7+) array which shall receive the data.&#39;</span>,</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;      <span class="stringliteral">&#39;target-target&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;          <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Oy. A key within the TARGET database identifying a particular server in the database group.&#39;</span>,</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;          <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;key&#39;</span>,</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;          <span class="comment">// Gets unhidden in help_alter(). We only want to show to D7+ users but have to</span></div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;          <span class="comment">// declare it here since this command does not bootstrap fully.</span></div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;          <span class="stringliteral">&#39;hidden&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;      ),</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;      <span class="comment">// &#39;temp&#39; =&gt; &#39;Use a temporary file to hold dump files.  Implies --no-cache.&#39;,</span></div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;      <span class="comment">// &#39;dump-dir&#39; =&gt; &#39;Directory to store sql dump files in when --source-dump or --target-dump are not used.&#39;,</span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;      <span class="stringliteral">&#39;create-db&#39;</span> =&gt; <span class="stringliteral">&#39;Create a new database before importing the database dump on the target machine.&#39;</span>,</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;      <span class="stringliteral">&#39;db-su&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Account to use when creating a new database. Optional.&#39;</span>,</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;root&#39;</span>,</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;      ),</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;      <span class="stringliteral">&#39;db-su-pw&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;        <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&#39;Password for the &quot;db-su&quot; account. Optional.&#39;</span>,</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;        <span class="stringliteral">&#39;example-value&#39;</span> =&gt; <span class="stringliteral">&#39;pass&#39;</span>,</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;      ),</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;      <span class="comment">// &#39;no-ordered-dump&#39; =&gt; &#39;Do not pass --ordered-dump to sql-dump.  sql-sync orders the dumpfile by default in order to increase the efficiency of rsync.&#39;,</span></div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;      <span class="stringliteral">&#39;sanitize&#39;</span> =&gt; <span class="stringliteral">&#39;Obscure email addresses and reset passwords in the user table post-sync.&#39;</span>,</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    ),</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <span class="stringliteral">&#39;sub-options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;      <span class="stringliteral">&#39;sanitize&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;        <span class="stringliteral">&#39;sanitize-password&#39;</span> =&gt; <span class="stringliteral">&#39;The password to assign to all accounts in the sanitization operation, or &quot;no&quot; to keep passwords unchanged.  Default is &quot;password&quot;.&#39;</span>,</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;        <span class="stringliteral">&#39;sanitize-email&#39;</span> =&gt; <span class="stringliteral">&#39;The pattern for test email addresses in the sanitization operation, or &quot;no&quot; to keep email addresses unchanged.  May contain replacement patterns %uid, %mail or %name.  Default is &quot;user+%uid@localhost&quot;.&#39;</span>,</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        <span class="stringliteral">&#39;confirm-sanitizations&#39;</span> =&gt; <span class="stringliteral">&#39;Prompt yes/no after importing the database, but before running the sanitizations&#39;</span>,</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;      ),</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    ),</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    <span class="stringliteral">&#39;topics&#39;</span> =&gt; array(<span class="stringliteral">&#39;docs-aliases&#39;</span>, <span class="stringliteral">&#39;docs-policy&#39;</span>, <span class="stringliteral">&#39;docs-example-sync-via-http&#39;</span>, <span class="stringliteral">&#39;docs-example-sync-extension&#39;</span>),</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;  );</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  $items[<span class="stringliteral">&#39;sql-cli&#39;</span>] = array(</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&quot;Open a SQL command-line interface using Drupal&#39;s credentials.&quot;</span>,</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    <span class="comment">// &#39;options&#39; =&gt; $options + $db_url,</span></div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    <span class="stringliteral">&#39;allow-additional-options&#39;</span> =&gt; array(<span class="stringliteral">&#39;sql-connect&#39;</span>),</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;sqlc&#39;</span>),</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="stringliteral">&#39;examples&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;      <span class="stringliteral">&#39;drush sql-cli&#39;</span> =&gt; <span class="stringliteral">&quot;Open a SQL command-line interface using Drupal&#39;s credentials.&quot;</span>,</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;      <span class="stringliteral">&#39;drush sql-cli --extra=-A&#39;</span> =&gt; <span class="stringliteral">&quot;Open a SQL CLI and skip reading table information.&quot;</span>,</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    ),</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="stringliteral">&#39;remote-tty&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;  );</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;  $items[<span class="stringliteral">&#39;sql-sanitize&#39;</span>] = array(</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="stringliteral">&#39;description&#39;</span> =&gt; <span class="stringliteral">&quot;Run sanitization operations on the current database.&quot;</span>,</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="stringliteral">&#39;bootstrap&#39;</span> =&gt; <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aaa7e693dd78d632c3d0f5baa3ba2d200">DRUSH_BOOTSTRAP_DRUSH</a>,</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="stringliteral">&#39;options&#39;</span> =&gt; array(</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;      <span class="stringliteral">&#39;db-prefix&#39;</span> =&gt; <span class="stringliteral">&#39;Enable replacement of braces in sanitize queries.&#39;</span>,</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;      <span class="stringliteral">&#39;sanitize-password&#39;</span> =&gt; <span class="stringliteral">&#39;The password to assign to all accounts in the sanitization operation, or &quot;no&quot; to keep passwords unchanged.  Default is &quot;password&quot;.&#39;</span>,</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;      <span class="stringliteral">&#39;sanitize-email&#39;</span> =&gt; <span class="stringliteral">&#39;The pattern for test email addresses in the sanitization operation, or &quot;no&quot; to keep email addresses unchanged.  May contain replacement patterns %uid, %mail or %name.  Default is &quot;user+%uid@localhost&quot;.&#39;</span>,</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;    ) + $db_url,</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;    <span class="stringliteral">&#39;aliases&#39;</span> =&gt; array(<span class="stringliteral">&#39;sqlsan&#39;</span>),</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;  );</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;  <span class="keywordflow">return</span> $items;</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;}</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="comment"> * Implements hook_drush_help_alter().</span></div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00250"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a848630530acc79df2b73d73df3feb131">  250</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a848630530acc79df2b73d73df3feb131">sql_drush_help_alter</a>(&amp;$command) {</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;  <span class="comment">// Drupal 7+ only options.</span></div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() &gt;= 7) {</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;    <span class="keywordflow">if</span> ($command[<span class="stringliteral">&#39;command&#39;</span>] == <span class="stringliteral">&#39;sql-sync&#39;</span>) {</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;      unset($command[<span class="stringliteral">&#39;options&#39;</span>][<span class="stringliteral">&#39;source-target&#39;</span>][<span class="stringliteral">&#39;hidden&#39;</span>], $command[<span class="stringliteral">&#39;options&#39;</span>][<span class="stringliteral">&#39;target-target&#39;</span>][<span class="stringliteral">&#39;hidden&#39;</span>]);</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    }</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    elseif ($command[<span class="stringliteral">&#39;commandfile&#39;</span>] == <span class="stringliteral">&#39;sql&#39;</span>) {</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;      unset($command[<span class="stringliteral">&#39;options&#39;</span>][<span class="stringliteral">&#39;target&#39;</span>][<span class="stringliteral">&#39;hidden&#39;</span>]);</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    }</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;  }</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;}</div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;<span class="comment"> * Command argument complete callback.</span></div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="comment"> *  Array of available site aliases.</span></div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a6c0438aa3afaa78282707b5165e386e4">  268</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a6c0438aa3afaa78282707b5165e386e4">sql_sql_sync_complete</a>() {</div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;  <span class="keywordflow">return</span> array(<span class="stringliteral">&#39;values&#39;</span> =&gt; array_keys(<a class="code" href="sitealias_8drush_8inc.html#ab84f25812ecd477686e6fa349503ed8d">_drush_sitealias_all_list</a>()));</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;}</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;<span class="comment"> * Safely bootstrap Drupal to the point where we can</span></div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;<span class="comment"> * access the database configuration.</span></div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#ab13f76971fb460582134a678eaec114c">  276</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#ab13f76971fb460582134a678eaec114c">drush_sql_bootstrap_database_configuration</a>() {</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="comment">// Under Drupal 7, if the database is configured but empty, then</span></div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;  <span class="comment">// DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION will throw an exception.</span></div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;  <span class="comment">// If this happens, we&#39;ll just catch it and continue.</span></div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;  <span class="comment">// TODO:  Fix this in the bootstrap, per http://drupal.org/node/1996004</span></div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;  <span class="keywordflow">try</span> {</div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#adb325e52092d83c685acdee827af1085">drush_bootstrap_max</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a2a8b6da6ee211bee51b64b4aed18db72">DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION</a>);</div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;  }</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;  <span class="keywordflow">catch</span> (Exception $e) {</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;  }</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;}</div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;<span class="comment"> * Check whether further bootstrap is needed. If so, do it.</span></div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">  291</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>() {</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(array(<span class="stringliteral">&#39;db-url&#39;</span>, <span class="stringliteral">&#39;db-spec&#39;</span>))) {</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <a class="code" href="sql_8drush_8inc.html#ab13f76971fb460582134a678eaec114c">drush_sql_bootstrap_database_configuration</a>();</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;  }</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;}</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;<span class="comment"> * Command callback. Displays the Drupal site&#39;s database connection string.</span></div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00300"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#af98d2fe4af349cc28668b6f64a0975ec">  300</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#af98d2fe4af349cc28668b6f64a0975ec">drush_sql_conf</a>() {</div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;  <a class="code" href="sql_8drush_8inc.html#ab13f76971fb460582134a678eaec114c">drush_sql_bootstrap_database_configuration</a>();</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;all&#39;</span>)) {</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    $sqlVersion = drush_sql_get_version();</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    <span class="keywordflow">return</span> $sqlVersion-&gt;getAll();</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;  }</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;    <span class="keywordflow">return</span> $sql-&gt;db_spec();</div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  }</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;}</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;<span class="comment"> * Command callback. Emits a connect string.</span></div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00315"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a5744455db8f6228038e54def1d1d8fd7">  315</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a5744455db8f6228038e54def1d1d8fd7">drush_sql_connect</a>() {</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;  $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;  <span class="keywordflow">return</span> $sql-&gt;connect(FALSE);</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;}</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;<span class="comment"> * Command callback. Create a database.</span></div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#abf491ac1afcb96f58020dc2204094ebb">  324</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#abf491ac1afcb96f58020dc2204094ebb">drush_sql_create</a>() {</div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;  $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;  $db_spec = $sql-&gt;db_spec();</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;  <span class="comment">// Prompt for confirmation.</span></div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SIMULATE&#39;</span>)) {</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <span class="comment">// @todo odd - maybe for sql-sync.</span></div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;    $txt_destination = (isset($db_spec[<span class="stringliteral">&#39;remote-host&#39;</span>]) ? $db_spec[<span class="stringliteral">&#39;remote-host&#39;</span>] . <span class="charliteral">&#39;/&#39;</span> : <span class="stringliteral">&#39;&#39;</span>) . $db_spec[<span class="stringliteral">&#39;database&#39;</span>];</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Creating database !target. Any possible existing database will be dropped!&quot;</span>, array(<span class="stringliteral">&#39;!target&#39;</span> =&gt; $txt_destination)));</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Do you really want to continue?&#39;</span>))) {</div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga366aaafdf8c774a58653c64a65b6d91c">drush_user_abort</a>();</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    }</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;  }</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;  <span class="keywordflow">return</span> $sql-&gt;createdb();</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;}</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="comment"> * Command callback. Outputs the entire Drupal database in SQL format using mysqldump or equivalent.</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a12a61bf397d9e982f78d2af3711e153f">  346</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a12a61bf397d9e982f78d2af3711e153f">drush_sql_dump</a>() {</div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;  $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;  <span class="keywordflow">return</span> $sql-&gt;dump(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;result-file&#39;</span>, FALSE));</div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;}</div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;<span class="comment"> * Construct an array that places table names in appropriate</span></div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;<span class="comment"> * buckets based on whether the table is to be skipped, included</span></div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;<span class="comment"> * for structure only, or have structure and data dumped.</span></div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;<span class="comment"> * The keys of the array are:</span></div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;<span class="comment"> * - skip: tables to be skipped completed in the dump</span></div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;<span class="comment"> * - structure: tables to only have their structure i.e. DDL dumped</span></div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;<span class="comment"> * - tables: tables to have structure and data dumped</span></div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;<span class="comment"> *   An array of table names with each table name in the appropriate</span></div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<span class="comment"> *   element of the array.</span></div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00365"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#ae314e0b6e40fe3207c1481649b760c26">  365</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#ae314e0b6e40fe3207c1481649b760c26">drush_sql_get_table_selection</a>() {</div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;  <span class="comment">// Skip large core tables if instructed.  Used by &#39;sql-drop/sql-dump/sql-sync&#39; commands.</span></div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;  $skip_tables = <a class="code" href="sql_8drush_8inc.html#ad45615d8733646465bac4234007f4bd6">_drush_sql_get_raw_table_list</a>(<span class="stringliteral">&#39;skip-tables&#39;</span>);</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;  <span class="comment">// Skip any structure-tables as well.</span></div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;  $structure_tables = <a class="code" href="sql_8drush_8inc.html#ad45615d8733646465bac4234007f4bd6">_drush_sql_get_raw_table_list</a>(<span class="stringliteral">&#39;structure-tables&#39;</span>);</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;  <span class="comment">// Dump only the specified tables.  Takes precedence over skip-tables and structure-tables.</span></div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;  $tables = <a class="code" href="sql_8drush_8inc.html#ad45615d8733646465bac4234007f4bd6">_drush_sql_get_raw_table_list</a>(<span class="stringliteral">&#39;tables&#39;</span>);</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;</div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;  <span class="keywordflow">return</span> array(<span class="stringliteral">&#39;skip&#39;</span> =&gt; $skip_tables, <span class="stringliteral">&#39;structure&#39;</span> =&gt; $structure_tables, <span class="stringliteral">&#39;tables&#39;</span> =&gt; $tables);</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;}</div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="comment"> * Expand wildcard tables.</span></div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;<span class="comment"> * @param array $tables</span></div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;<span class="comment"> *   An array of table names, some of which may contain wildcards (`*`).</span></div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;<span class="comment"> * @param array $db_tables</span></div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;<span class="comment"> *   An array with all the existing table names in the current database.</span></div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;<span class="comment"> *   $tables array with wildcards resolved to real table names.</span></div>
<div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00386"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a825e07c3e47e30d9febf381b814a92b0">  386</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a825e07c3e47e30d9febf381b814a92b0">drush_sql_expand_wildcard_tables</a>($tables, $db_tables) {</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;  <span class="comment">// Table name expansion based on `*` wildcard.</span></div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;  $expanded_db_tables = array();</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;  <span class="keywordflow">foreach</span> ($tables as $k =&gt; $table) {</div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="comment">// Only deal with table names containing a wildcard.</span></div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    <span class="keywordflow">if</span> (strpos($table, <span class="charliteral">&#39;*&#39;</span>) !== FALSE) {</div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;      $pattern = <span class="stringliteral">&#39;/^&#39;</span> . str_replace(<span class="charliteral">&#39;*&#39;</span>, <span class="stringliteral">&#39;.*&#39;</span>, $table) . <span class="stringliteral">&#39;$/i&#39;</span>;</div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;      <span class="comment">// Merge those existing tables which match the pattern with the rest of</span></div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;      <span class="comment">// the expanded table names.</span></div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;      $expanded_db_tables += preg_grep($pattern, $db_tables);</div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    }</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;  }</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;  <span class="keywordflow">return</span> $expanded_db_tables;</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;}</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment"> * Filters tables.</span></div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;<span class="comment"> * @param array $tables</span></div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="comment"> *   An array of table names to filter.</span></div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;<span class="comment"> * @param array $db_tables</span></div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;<span class="comment"> *   An array with all the existing table names in the current database.</span></div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="comment"> * @return</span></div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="comment"> *   An array with only valid table names (i.e. all of which actually exist in</span></div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment"> *   the database).</span></div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a860b4b13d2fbed8feddce016484d3068">  412</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a860b4b13d2fbed8feddce016484d3068">drush_sql_filter_tables</a>($tables, $db_tables) {</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;  <span class="comment">// Ensure all the tables actually exist in the database.</span></div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;  <span class="keywordflow">foreach</span> ($tables as $k =&gt; $table) {</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    <span class="keywordflow">if</span> (!in_array($table, $db_tables)) {</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;      unset($tables[$k]);</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    }</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;  }</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;  <span class="keywordflow">return</span> $tables;</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;}</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="comment"> * Given the table names in the input array that may contain wildcards (`*`),</span></div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;<span class="comment"> * expand the table names so that the array returned only contains table names</span></div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<span class="comment"> * that exist in the database.</span></div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="comment"> * @param array $tables</span></div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;<span class="comment"> *   An array of table names where the table names may contain the</span></div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;<span class="comment"> *   `*` wildcard character.</span></div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;<span class="comment"> * @param array $db_tables</span></div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;<span class="comment"> *   The list of tables present in a database.</span></div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;<span class="comment"> * @return array</span></div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;<span class="comment"> *   An array of tables with non-existant tables removed.</span></div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00436"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a69379e6e5cad1448ab76491b7c4cdd40">  436</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a69379e6e5cad1448ab76491b7c4cdd40">_drush_sql_expand_and_filter_tables</a>($tables, $db_tables) {</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;  $expanded_tables = <a class="code" href="sql_8drush_8inc.html#a825e07c3e47e30d9febf381b814a92b0">drush_sql_expand_wildcard_tables</a>($tables, $db_tables);</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;  $tables = <a class="code" href="sql_8drush_8inc.html#a860b4b13d2fbed8feddce016484d3068">drush_sql_filter_tables</a>(array_merge($tables, $expanded_tables), $db_tables);</div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;  $tables = array_unique($tables);</div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;  sort($tables);</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;  <span class="keywordflow">return</span> $tables;</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;}</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="comment"> * Consult the specified options and return the list of tables</span></div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;<span class="comment"> * specified.</span></div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;<span class="comment"> * @param option_name</span></div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;<span class="comment"> *   The option name to check: skip-tables, structure-tables</span></div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="comment"> *   or tables.  This function will check both *-key and *-list,</span></div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<span class="comment"> *   and, in the case of sql-sync, will also check target-*</span></div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="comment"> *   and source-*, to see if an alias set one of these options.</span></div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<span class="comment"> * @returns array</span></div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;<span class="comment"> *   Returns an array of tables based on the first option</span></div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="comment"> *   found, or an empty array if there were no matches.</span></div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00457"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#ad45615d8733646465bac4234007f4bd6">  457</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#ad45615d8733646465bac4234007f4bd6">_drush_sql_get_raw_table_list</a>($option_name) {</div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;  <span class="keywordflow">foreach</span>(array(<span class="stringliteral">&#39;&#39;</span> =&gt; <span class="stringliteral">&#39;cli&#39;</span>, <span class="stringliteral">&#39;target-,,source-&#39;</span> =&gt; NULL) as $prefix_list =&gt; $context) {</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    <span class="keywordflow">foreach</span>(explode(<span class="charliteral">&#39;,&#39;</span>,$prefix_list) as $prefix) {</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;      $key_list = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($prefix . $option_name . <span class="stringliteral">&#39;-key&#39;</span>, NULL, $context);</div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;      <span class="keywordflow">foreach</span>(explode(<span class="charliteral">&#39;,&#39;</span>, $key_list) as $key) {</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;        $all_tables = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($option_name, array());</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;        <span class="keywordflow">if</span> (array_key_exists($key, $all_tables)) {</div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;          <span class="keywordflow">return</span> $all_tables[$key];</div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;        }</div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;        <span class="keywordflow">if</span> ($option_name != <span class="stringliteral">&#39;tables&#39;</span>) {</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;          $all_tables = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;tables&#39;</span>, array());</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;          <span class="keywordflow">if</span> (array_key_exists($key, $all_tables)) {</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;            <span class="keywordflow">return</span> $all_tables[$key];</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;          }</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        }</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;      }</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;      $table_list = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>($prefix . $option_name . <span class="stringliteral">&#39;-list&#39;</span>, NULL, $context);</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;      <span class="keywordflow">if</span> (isset($table_list)) {</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;        <span class="keywordflow">return</span> empty($table_list) ? array() : explode(<span class="charliteral">&#39;,&#39;</span>, $table_list);</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;      }</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    }</div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;  }</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;</div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;  <span class="keywordflow">return</span> array();</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;}</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="comment"> * Command callback. Executes the given SQL query on the Drupal database.</span></div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00486"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a05194b55585f4faf2836070d11e55df5">  486</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a05194b55585f4faf2836070d11e55df5">drush_sql_query</a>($query = NULL) {</div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;  $filename = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;file&#39;</span>, NULL);</div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;  <span class="comment">// Enable prefix processing when db-prefix option is used.</span></div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-prefix&#39;</span>)) {</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#adb325e52092d83c685acdee827af1085">drush_bootstrap_max</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aa37a87c4821273e79353b5d4cb92900f">DRUSH_BOOTSTRAP_DRUPAL_DATABASE</a>);</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;  }</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SIMULATE&#39;</span>)) {</div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;    <span class="keywordflow">if</span> ($query) {</div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;      <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Simulating sql-query: !q&#39;</span>, array(<span class="stringliteral">&#39;!q&#39;</span> =&gt; $query)));</div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;    }</div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;      <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Simulating sql-import from !f&#39;</span>, array(<span class="stringliteral">&#39;!f&#39;</span> =&gt; <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;file&#39;</span>))));</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;    }</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;  }</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>(<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-spec&#39;</span>));</div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    $result = $sql-&gt;query($query, $filename, FALSE, <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;result-file&#39;</span>));</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <span class="keywordflow">if</span> (!$result) {</div>
<div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_SQL_NO_QUERY&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Query failed.&#39;</span>));</div>
<div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;    }</div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>(implode(<span class="stringliteral">&quot;\n&quot;</span>, <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>()));</div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;  }</div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;}</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;<span class="comment"> * Drops all tables in the database.</span></div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#ac538b2fa7b1421461139b1a420531cba">  515</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#ac538b2fa7b1421461139b1a420531cba">drush_sql_drop</a>() {</div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;  $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;  $db_spec = $sql-&gt;db_spec();</div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Do you really want to drop all tables in the database !db?&#39;</span>, array(<span class="stringliteral">&#39;!db&#39;</span> =&gt; $db_spec[<span class="stringliteral">&#39;database&#39;</span>])))) {</div>
<div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga366aaafdf8c774a58653c64a65b6d91c">drush_user_abort</a>();</div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;  }</div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;  $tables = $sql-&gt;listTables();</div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;  $sql-&gt;drop($tables);</div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;}</div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;</div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="keyword">function</span> drush_sql_cli() {</div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;  $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;  <span class="keywordflow">return</span> !(bool)<a class="code" href="group__commandwrappers.html#ga3a1bb3ae751f14749ce1dbe4ec9c3288">drush_shell_proc_open</a>($sql-&gt;connect());</div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;}</div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;<span class="comment"> * Command callback. Run&#39;s the sanitization operations on the current database.</span></div>
<div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;<span class="comment"> * @see hook_drush_sql_sync_sanitize() for adding custom sanitize routines.</span></div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00537"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a9e45958fb554a3f6049ee18c857207af">  537</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a9e45958fb554a3f6049ee18c857207af">drush_sql_sanitize</a>() {</div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;  <a class="code" href="sql_8drush_8inc.html#a9eaa40f9c67b33ac31e8fd74f707ea10">drush_sql_bootstrap_further</a>();</div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-prefix&#39;</span>)) {</div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;    <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#adb325e52092d83c685acdee827af1085">drush_bootstrap_max</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#aa37a87c4821273e79353b5d4cb92900f">DRUSH_BOOTSTRAP_DRUPAL_DATABASE</a>);</div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;  }</div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;  <a class="code" href="drush_8inc.html#a80ce43b30f833522f72180811dab5a3e">drush_include</a>(DRUSH_BASE_PATH . <span class="stringliteral">&#39;/commands/sql&#39;</span>, <span class="stringliteral">&#39;sync.sql&#39;</span>);</div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;  <a class="code" href="includes_2command_8inc.html#a19eba9666aba673a64fbd78a2c5ef4f9">drush_command_invoke_all</a>(<span class="stringliteral">&#39;drush_sql_sync_sanitize&#39;</span>, <span class="stringliteral">&#39;default&#39;</span>);</div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;  $options = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;post-sync-ops&#39;</span>);</div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;  <span class="keywordflow">if</span> (!empty($options)) {</div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_SIMULATE&#39;</span>)) {</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;      $messages = <a class="code" href="sql_8drush_8inc.html#a96b928aad1ddc72f4cfd2d3058baf123">_drush_sql_get_post_sync_messages</a>();</div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;      <span class="keywordflow">if</span> ($messages) {</div>
<div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;        <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>();</div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;        <a class="code" href="group__outputfunctions.html#ga63acbb94925d6d2693e235e966bba740">drush_print</a>($messages);</div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;      }</div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    }</div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;  }</div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__userinput.html#gaa4169b83ff9dc4222af95d376b21268b">drush_confirm</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Do you really want to sanitize the current database?&#39;</span>))) {</div>
<div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga366aaafdf8c774a58653c64a65b6d91c">drush_user_abort</a>();</div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;  }</div>
<div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;</div>
<div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;  $sanitize_query = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;  <span class="keywordflow">foreach</span>($options as $id =&gt; $data) {</div>
<div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    <span class="comment">// Enable prefix processing when db-prefix option is used.</span></div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-prefix&#39;</span>)) {</div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() &gt;= 7) {</div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;        $data[<span class="stringliteral">&#39;query&#39;</span>] = Database::getConnection()-&gt;prefixTables($data[<span class="stringliteral">&#39;query&#39;</span>]);</div>
<div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;      }</div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;        $data[<span class="stringliteral">&#39;query&#39;</span>] = db_prefix_tables($data[<span class="stringliteral">&#39;query&#39;</span>]);</div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;      }</div>
<div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;    }</div>
<div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    $sanitize_query .= $data[<span class="stringliteral">&#39;query&#39;</span>] . <span class="stringliteral">&quot; &quot;</span>;</div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;  }</div>
<div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;  <span class="keywordflow">if</span> ($sanitize_query) {</div>
<div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    $sql = <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>();</div>
<div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    $result = $sql-&gt;query($sanitize_query);</div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;  }</div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;}</div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;<span class="comment"> * Call from a pre-sql-sync hook to register an sql</span></div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;<span class="comment"> * query to be executed in the post-sql-sync hook.</span></div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;<span class="comment"> * @see drush_sql_pre_sql_sync() and @see drush_sql_post_sql_sync().</span></div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;<span class="comment"> * @param $id</span></div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;<span class="comment"> *   String containing an identifier representing this</span></div>
<div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;<span class="comment"> *   operation.  This id is not actually used at the</span></div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;<span class="comment"> *   moment, it is just used to fufill the contract</span></div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;<span class="comment"> *   of drush contexts.</span></div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;<span class="comment"> * @param $message</span></div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;<span class="comment"> *   String with the confirmation message that describes</span></div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;<span class="comment"> *   to the user what the post-sync operation is going</span></div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;<span class="comment"> *   to do.  This confirmation message is printed out</span></div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;<span class="comment"> *   just before the user is asked whether or not the</span></div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;<span class="comment"> *   sql-sync operation should be continued.</span></div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;<span class="comment"> * @param $query</span></div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;<span class="comment"> *   String containing the sql query to execute.  If no</span></div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;<span class="comment"> *   query is provided, then the confirmation message will</span></div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;<span class="comment"> *   be displayed to the user, but no action will be taken</span></div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;<span class="comment"> *   in the post-sync hook.  This is useful for drush modules</span></div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;<span class="comment"> *   that wish to provide their own post-sync hooks to fix</span></div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;<span class="comment"> *   up the target database in other ways (e.g. through</span></div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;<span class="comment"> *   Drupal APIs).</span></div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00602"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#aa235e973665b628a3301129a4967a351">  602</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#aa235e973665b628a3301129a4967a351">drush_sql_register_post_sync_op</a>($id, $message, $query = NULL) {</div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;  $options = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;post-sync-ops&#39;</span>);</div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;  $options[$id] = array(<span class="stringliteral">&#39;message&#39;</span> =&gt; $message, <span class="stringliteral">&#39;query&#39;</span> =&gt; $query);</div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;</div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;post-sync-ops&#39;</span>, $options);</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;}</div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;<span class="comment"> * Builds a confirmation message for all post-sync operations.</span></div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;<span class="comment"> *   All post-sync operation messages concatenated together.</span></div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00616"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a96b928aad1ddc72f4cfd2d3058baf123">  616</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a96b928aad1ddc72f4cfd2d3058baf123">_drush_sql_get_post_sync_messages</a>() {</div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;  $messages = FALSE;</div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;</div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;  $options = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;post-sync-ops&#39;</span>);</div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;  <span class="keywordflow">if</span> (!empty($options)) {</div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    $messages = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;The following post-sync operations will be done on the destination:&#39;</span>) . <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;</div>
<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    <span class="keywordflow">foreach</span>($options as $id =&gt; $data) {</div>
<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;      $messages .= <span class="stringliteral">&quot;  * &quot;</span> . $data[<span class="stringliteral">&#39;message&#39;</span>] . <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    }</div>
<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;  }</div>
<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;</div>
<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;  <span class="keywordflow">return</span> $messages;</div>
<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;}</div>
<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;<span class="comment"> * Wrapper for drush_get_class; instantiates an driver-specific instance</span></div>
<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;<span class="comment"> * of SqlBase class.</span></div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;<span class="comment"> * @param array $db_spec</span></div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;<span class="comment"> *   If known, specify a $db_spec that the class can operate with.</span></div>
<div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;<span class="comment"> * @throws \Drush\Sql\SqlException</span></div>
<div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;<span class="comment"> * @return Drush\Sql\SqlBase</span></div>
<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00642"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">  642</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>($db_spec = NULL) {</div>
<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;  $database = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;database&#39;</span>, <span class="stringliteral">&#39;default&#39;</span>);</div>
<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;  $target = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;target&#39;</span>, <span class="stringliteral">&#39;default&#39;</span>);</div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;</div>
<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;  <span class="comment">// Try a few times to quickly get $db_spec.</span></div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;  <span class="keywordflow">if</span> ($db_spec) {</div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="drush_8inc.html#ac0c5cc8dc02832fb068ca98efd0712c4">drush_get_class</a>(<span class="stringliteral">&#39;Drush\Sql\Sql&#39;</span>, array($db_spec), array($db_spec[<span class="stringliteral">&#39;driver&#39;</span>]));</div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;  }</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;  elseif ($url = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-url&#39;</span>)) {</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    $url =  is_array($url) ? $url[$database] : $url;</div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;    $db_spec = <a class="code" href="sitealias_8inc.html#a3e5b4e0099b3cf7ad4ec47fac20e4e54">drush_convert_db_from_db_url</a>($url);</div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    $db_spec[<span class="stringliteral">&#39;db_prefix&#39;</span>] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;db-prefix&#39;</span>);</div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>($db_spec);</div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;  }</div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;  elseif (($databases = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;databases&#39;</span>)) &amp;&amp; (array_key_exists($database, $databases)) &amp;&amp; (array_key_exists($target, $databases[$database]))) {</div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    $db_spec = $databases[$database][$target];</div>
<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>($db_spec);</div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;  }</div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;    <span class="comment">// No parameter or options provided. Determine $db_spec ourselves.</span></div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    <span class="keywordflow">if</span> ($sqlVersion = drush_sql_get_version()) {</div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;      <span class="keywordflow">if</span> ($db_spec = $sqlVersion-&gt;get_db_spec()) {</div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="sql_8drush_8inc.html#a828cf565e2e7e569e41c3fbe8a8e0cf0">drush_sql_get_class</a>($db_spec);</div>
<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;      }</div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;    }</div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  }</div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  <span class="keywordflow">throw</span> new \Drush\Sql\SqlException(<span class="stringliteral">&#39;Unable to find a matching SQL Class. Drush cannot find your database connection details.&#39;</span>);</div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;}</div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;</div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;<span class="keyword">function</span> drush_sql_get_version() {</div>
<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="drush_8inc.html#ac0c5cc8dc02832fb068ca98efd0712c4">drush_get_class</a>(<span class="stringliteral">&#39;Drush\Sql\Sql&#39;</span>, array(), array(<a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>())) ?: NULL;</div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;}</div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;<span class="comment"> * Implements hook_sql_drush_sql_sync_sanitize.</span></div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;<span class="comment"> * Sanitize usernames, passwords, and sessions when the --sanitize option is used.</span></div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;<span class="comment"> * It is also an example of how to write a database sanitizer for sql sync.</span></div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;<span class="comment"> * To write your own sync hook function, define mymodule_drush_sql_sync_sanitize()</span></div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;<span class="comment"> * and follow the form of this function to add your own database</span></div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;<span class="comment"> * sanitization operations via the register post-sync op function;</span></div>
<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;<span class="comment"> * @see drush_sql_register_post_sync_op().  This is the only thing that the</span></div>
<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;<span class="comment"> * sync hook function needs to do; sql-sync takes care of the rest.</span></div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;<span class="comment"> * The function below has a lot of logic to process user preferences and</span></div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;<span class="comment"> * generate the correct SQL regardless of whether Postgres, Mysql,</span></div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;<span class="comment"> * Drupal 6/7/8 is in use.  A simpler sanitize function that</span></div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;<span class="comment"> * always used default values and only worked with Drupal 6 + mysql</span></div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;<span class="comment"> * appears in the drush.api.php.  @see hook_drush_sql_sync_sanitize().</span></div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00694"></a><span class="lineno"><a class="code" href="sql_8drush_8inc.html#a31ea6e16a805e81fad22960a6325ec51">  694</a></span>&#160;<span class="keyword">function</span> <a class="code" href="sql_8drush_8inc.html#a31ea6e16a805e81fad22960a6325ec51">sql_drush_sql_sync_sanitize</a>($site) {</div>
<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;  $site_settings = <a class="code" href="sitealias_8inc.html#ac2f57b80441374522c4e4cdc3b7e0c2b">drush_sitealias_get_record</a>($site);</div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;  $databases = <a class="code" href="sitealias_8inc.html#a70da7111e390efcc4dab4f9ba52dbe8b">sitealias_get_databases_from_record</a>($site_settings);</div>
<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;  $prefix = $databases[<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;prefix&#39;</span>];</div>
<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;  $prefix = isset($databases[<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;prefix&#39;</span>]) ? $databases[<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;prefix&#39;</span>] : <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;  $user_table_updates = array();</div>
<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;  $message_list = array();</div>
<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;  <span class="comment">// Sanitize passwords.</span></div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;  $newpassword = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(array(<span class="stringliteral">&#39;sanitize-password&#39;</span>, <span class="stringliteral">&#39;destination-sanitize-password&#39;</span>), <span class="stringliteral">&#39;password&#39;</span>);</div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;  <span class="keywordflow">if</span> ($newpassword != <span class="stringliteral">&#39;no&#39;</span> &amp;&amp; $newpassword !== 0) {</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    $major_version = <a class="code" href="includes_2drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>();</div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    $pw_op = <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;</div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;    <span class="comment">// In Drupal 6, passwords are hashed via the MD5 algorithm.</span></div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    <span class="keywordflow">if</span> ($major_version == 6) {</div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;      $pw_op = <span class="stringliteral">&quot;MD5(&#39;$newpassword&#39;)&quot;</span>;</div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;    }</div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    <span class="comment">// In Drupal 7, passwords are hashed via a more complex algorithm,</span></div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    <span class="comment">// available via the user_hash_password function.</span></div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    elseif ($major_version == 7) {</div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;      $core = DRUSH_DRUPAL_CORE;</div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;      include_once $core . <span class="stringliteral">&#39;/includes/password.inc&#39;</span>;</div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;      include_once $core . <span class="stringliteral">&#39;/includes/bootstrap.inc&#39;</span>;</div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;      $hash = user_hash_password($newpassword);</div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;      $pw_op = <span class="stringliteral">&quot;&#39;$hash&#39;&quot;</span>;</div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;    }</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;      <span class="comment">// D8+. Mimic Drupal&#39;s /scripts/password-hash.sh</span></div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;      <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a504cc0d2dfbfa276957c1e02c8f8c900">drush_bootstrap</a>(<a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a6ea86b0ce6756b159a3fdef78fdff159">DRUSH_BOOTSTRAP_DRUPAL_FULL</a>);</div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;      $password_hasher = \Drupal::service(<span class="stringliteral">&#39;password&#39;</span>);</div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;      $hash = $password_hasher-&gt;hash($newpassword);</div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;      $pw_op = <span class="stringliteral">&quot;&#39;$hash&#39;&quot;</span>;</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;    }</div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    <span class="keywordflow">if</span> (!empty($pw_op)) {</div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;      $user_table_updates[] = <span class="stringliteral">&quot;pass = $pw_op&quot;</span>;</div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;      $message_list[] =  <span class="stringliteral">&quot;passwords&quot;</span>;</div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    }</div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;  }</div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;</div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  <span class="comment">// Sanitize email addresses.</span></div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;  $newemail = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(array(<span class="stringliteral">&#39;sanitize-email&#39;</span>, <span class="stringliteral">&#39;destination-sanitize-email&#39;</span>), <span class="stringliteral">&#39;user+%uid@localhost.localdomain&#39;</span>);</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;  <span class="keywordflow">if</span> ($newemail != <span class="stringliteral">&#39;no&#39;</span> &amp;&amp; $newemail !== 0) {</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;    <span class="keywordflow">if</span> (strpos($newemail, <span class="charliteral">&#39;%&#39;</span>) !== FALSE) {</div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;      <span class="comment">// We need a different sanitization query for Postgres and Mysql.</span></div>
<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;      $db_driver = $databases[<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;default&#39;</span>][<span class="stringliteral">&#39;driver&#39;</span>];</div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;      <span class="keywordflow">if</span> ($db_driver == <span class="stringliteral">&#39;pgsql&#39;</span>) {</div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;        $email_map = array(<span class="stringliteral">&#39;%uid&#39;</span> =&gt; <span class="stringliteral">&quot;&#39; || uid || &#39;&quot;</span>, <span class="stringliteral">&#39;%mail&#39;</span> =&gt; <span class="stringliteral">&quot;&#39; || replace(mail, &#39;@&#39;, &#39;_&#39;) || &#39;&quot;</span>, <span class="stringliteral">&#39;%name&#39;</span> =&gt; <span class="stringliteral">&quot;&#39; || replace(name, &#39; &#39;, &#39;_&#39;) || &#39;&quot;</span>);</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;        $newmail =  <span class="stringliteral">&quot;&#39;&quot;</span> . str_replace(array_keys($email_map), array_values($email_map), $newemail) . <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;      }</div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;        $email_map = array(<span class="stringliteral">&#39;%uid&#39;</span> =&gt; <span class="stringliteral">&quot;&#39;, uid, &#39;&quot;</span>, <span class="stringliteral">&#39;%mail&#39;</span> =&gt; <span class="stringliteral">&quot;&#39;, replace(mail, &#39;@&#39;, &#39;_&#39;), &#39;&quot;</span>, <span class="stringliteral">&#39;%name&#39;</span> =&gt; <span class="stringliteral">&quot;&#39;, replace(name, &#39; &#39;, &#39;_&#39;), &#39;&quot;</span>);</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;        $newmail =  <span class="stringliteral">&quot;concat(&#39;&quot;</span> . str_replace(array_keys($email_map), array_values($email_map), $newemail) . <span class="stringliteral">&quot;&#39;)&quot;</span>;</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;      }</div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;      $user_table_updates[] = <span class="stringliteral">&quot;mail = $newmail, init = $newmail&quot;</span>;</div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;    }</div>
<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;      $user_table_updates[] = <span class="stringliteral">&quot;mail = &#39;$newemail&#39;, init = &#39;$newemail&#39;&quot;</span>;</div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    }</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    $message_list[] = <span class="stringliteral">&#39;email addresses&#39;</span>;</div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;  }</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;</div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;  <span class="keywordflow">if</span> (!empty($user_table_updates)) {</div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;    $table = $major_version &gt;= 8 ? <span class="stringliteral">&#39;users_field_data&#39;</span> : <span class="stringliteral">&#39;users&#39;</span>;</div>
<div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;    $sanitize_query = <span class="stringliteral">&quot;UPDATE {$prefix}{$table} SET &quot;</span> . implode(<span class="stringliteral">&#39;, &#39;</span>, $user_table_updates) . <span class="stringliteral">&quot; WHERE uid &gt; 0;&quot;</span>;</div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;    <a class="code" href="sql_8drush_8inc.html#aa235e973665b628a3301129a4967a351">drush_sql_register_post_sync_op</a>(<span class="stringliteral">&#39;user-email&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Reset !message in !table table&#39;</span>, array(<span class="stringliteral">&#39;!message&#39;</span> =&gt; implode(<span class="stringliteral">&#39; and &#39;</span>, $message_list), <span class="stringliteral">&#39;!table&#39;</span> =&gt; $table)), $sanitize_query);</div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;  }</div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;  <span class="comment">// Seems quite portable (SQLite?) - http://en.wikipedia.org/wiki/Truncate_(SQL)</span></div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;  $sql_sessions = <span class="stringliteral">&quot;TRUNCATE TABLE {$prefix}sessions;&quot;</span>;</div>
<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;  <a class="code" href="sql_8drush_8inc.html#aa235e973665b628a3301129a4967a351">drush_sql_register_post_sync_op</a>(<span class="stringliteral">&#39;sessions&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Truncate Drupal\&#39;s sessions table&#39;</span>), $sql_sessions);</div>
<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Oct 8 2014 09:04:54 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>