Version 1
[yaffs-website] / vendor / drush / drush / lib / Drush / Sql / Sqlpgsql.php
diff --git a/vendor/drush/drush/lib/Drush/Sql/Sqlpgsql.php b/vendor/drush/drush/lib/Drush/Sql/Sqlpgsql.php
new file mode 100644 (file)
index 0000000..e8945c7
--- /dev/null
@@ -0,0 +1,153 @@
+<?php
+
+namespace Drush\Sql;
+
+define('PSQL_SHOW_TABLES', "SELECT tablename FROM pg_tables WHERE schemaname='public';");
+
+class Sqlpgsql extends SqlBase {
+
+  public $query_extra = "--no-align --field-separator=\"\t\" --pset tuples_only=on";
+
+  public $query_file = "--file";
+
+  private $password_file = NULL;
+
+  private function password_file() {
+    if (!isset($password_file) && isset($this->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;
+  }
+}