db_spec['password'])) { $pgpass_parts = array( empty($this->db_spec['host']) ? 'localhost' : $this->db_spec['host'], empty($this->db_spec['port']) ? '5432' : $this->db_spec['port'], // Database '*', $this->db_spec['username'], $this->db_spec['password'] ); // Escape colon and backslash characters in entries. // @see http://www.postgresql.org/docs/9.1/static/libpq-pgpass.html array_walk($pgpass_parts, function (&$part) { // The order of the replacements is important so that backslashes are // not replaced twice. $part = str_replace(array('\\', ':'), array('\\\\', '\:'), $part); }); $pgpass_contents = implode(':', $pgpass_parts); $password_file = drush_save_data_to_temp_file($pgpass_contents); chmod($password_file, 0600); } return $password_file; } public function command() { $environment = ""; $pw_file = $this->password_file(); if (isset($pw_file)) { $environment = "PGPASSFILE={$pw_file} "; } return "{$environment}psql -q"; } /* * @param $hide_password * Not used in postgres. Use .pgpass file instead. See http://drupal.org/node/438828. */ public function creds($hide_password = TRUE) { // Some drush commands (e.g. site-install) want to connect to the // server, but not the database. Connect to the built-in database. $parameters['dbname'] = empty($this->db_spec['database']) ? 'template1' : $this->db_spec['database']; // Host and port are optional but have defaults. $parameters['host'] = empty($this->db_spec['host']) ? 'localhost' : $this->db_spec['host']; $parameters['port'] = empty($this->db_spec['port']) ? '5432' : $this->db_spec['port']; // Username is required. $parameters['username'] = $this->db_spec['username']; // Don't set the password. // @see http://drupal.org/node/438828 return $this->params_to_options($parameters); } public function createdb_sql($dbname, $quoted = FALSE) { if ($quoted) { $dbname = '`' . $dbname . '`'; } $sql[] = sprintf('drop database if exists %s;', $dbname); $sql[] = sprintf("create database %s ENCODING 'UTF8';", $dbname); return implode(' ', $sql); } public function db_exists() { $database = $this->db_spec['database']; // Get a new class instance that has no 'database'. $db_spec_no_db = $this->db_spec; unset($db_spec_no_db['database']); $sql_no_db = drush_sql_get_class($db_spec_no_db); $query = "SELECT 1 AS result FROM pg_database WHERE datname='$database'"; drush_shell_exec($sql_no_db->connect() . ' -t -c %s', $query); $output = drush_shell_exec_output(); return (bool)$output[0]; } public function query_format($query) { if (strtolower($query) == 'show tables;') { return PSQL_SHOW_TABLES; } return $query; } public function listTables() { $return = $this->query(PSQL_SHOW_TABLES); $tables = drush_shell_exec_output(); if (!empty($tables)) { return $tables; } return array(); } public function dumpCmd($table_selection) { $parens = FALSE; $skip_tables = $table_selection['skip']; $structure_tables = $table_selection['structure']; $tables = $table_selection['tables']; $ignores = array(); $skip_tables = array_merge($structure_tables, $skip_tables); $data_only = drush_get_option('data-only'); $create_db = drush_get_option('create-db'); $exec = 'pg_dump '; // Unlike psql, pg_dump does not take a '--dbname=' before the database name. $extra = str_replace('--dbname=', ' ', $this->creds()); if (isset($data_only)) { $extra .= ' --data-only'; } if ($option = drush_get_option('extra', $this->query_extra)) { $extra .= " $option"; } $exec .= $extra; $exec .= (!isset($create_db) && !isset($data_only) ? ' --clean' : ''); if (!empty($tables)) { foreach ($tables as $table) { $exec .= " --table=$table"; } } else { foreach ($skip_tables as $table) { $ignores[] = "--exclude-table=$table"; } $exec .= ' '. implode(' ', $ignores); // Run pg_dump again and append output if we need some structure only tables. if (!empty($structure_tables)) { $parens = TRUE; $schemaonlies = array(); foreach ($structure_tables as $table) { $schemaonlies[] = "--table=$table"; } $exec .= " && pg_dump --schema-only " . implode(' ', $schemaonlies) . $extra; $exec .= (!isset($create_db) && !isset($data_only) ? ' --clean' : ''); } } return $parens ? "($exec)" : $exec; } }