class DatabaseConnection_pgsql
Hierarchy
- class \DatabaseConnection- class \DatabaseConnection_pgsql extends \DatabaseConnection
 
Expanded class hierarchy of DatabaseConnection_pgsql
Related topics
File
- 
              includes/database/ pgsql/ database.inc, line 18 
View source
class DatabaseConnection_pgsql extends DatabaseConnection {
  public function __construct(array $connection_options = array()) {
    // This driver defaults to transaction support, except if explicitly passed FALSE.
    $this->transactionSupport = !isset($connection_options['transactions']) || $connection_options['transactions'] !== FALSE;
    // Transactional DDL is always available in PostgreSQL,
    // but we'll only enable it if standard transactions are.
    $this->transactionalDDLSupport = $this->transactionSupport;
    // Default to TCP connection on port 5432.
    if (empty($connection_options['port'])) {
      $connection_options['port'] = 5432;
    }
    // PostgreSQL in trust mode doesn't require a password to be supplied.
    if (empty($connection_options['password'])) {
      $connection_options['password'] = NULL;
    }
    else {
      $connection_options['password'] = str_replace('\\', '\\\\', $connection_options['password']);
    }
    $this->connectionOptions = $connection_options;
    $dsn = 'pgsql:host=' . $connection_options['host'] . ' dbname=' . $connection_options['database'] . ' port=' . $connection_options['port'];
    // Allow PDO options to be overridden.
    $connection_options += array(
      'pdo' => array(),
    );
    $connection_options['pdo'] += array(
      // Prepared statements are most effective for performance when queries
      // are recycled (used several times). However, if they are not re-used,
      // prepared statements become inefficient. Since most of Drupal's
      // prepared queries are not re-used, it should be faster to emulate
      // the preparation than to actually ready statements for re-use. If in
      // doubt, reset to FALSE and measure performance.
PDO::ATTR_EMULATE_PREPARES => TRUE,
      // Convert numeric values to strings when fetching.
PDO::ATTR_STRINGIFY_FETCHES => TRUE,
    );
    parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
    // Force PostgreSQL to use the UTF-8 character set by default.
    $this->connection
      ->exec("SET NAMES 'UTF8'");
    // Execute PostgreSQL init_commands.
    if (isset($connection_options['init_commands'])) {
      $this->connection
        ->exec(implode('; ', $connection_options['init_commands']));
    }
  }
  public function prepareQuery($query) {
    // mapConditionOperator converts LIKE operations to ILIKE for consistency
    // with MySQL. However, Postgres does not support ILIKE on bytea (blobs)
    // fields.
    // To make the ILIKE operator work, we type-cast bytea fields into text.
    // @todo This workaround only affects bytea fields, but the involved field
    //   types involved in the query are unknown, so there is no way to
    //   conditionally execute this for affected queries only.
    return parent::prepareQuery(preg_replace('/ ([^ ]+) +(I*LIKE|NOT +I*LIKE) /i', ' ${1}::text ${2} ', $query));
  }
  public function query($query, array $args = array(), $options = array()) {
    $options += $this->defaultOptions();
    // The PDO PostgreSQL driver has a bug which
    // doesn't type cast booleans correctly when
    // parameters are bound using associative
    // arrays.
    // See http://bugs.php.net/bug.php?id=48383
    foreach ($args as &$value) {
      if (is_bool($value)) {
        $value = (int) $value;
      }
    }
    try {
      if ($query instanceof DatabaseStatementInterface) {
        $stmt = $query;
        $stmt->execute(NULL, $options);
      }
      else {
        $this->expandArguments($query, $args);
        $stmt = $this->prepareQuery($query);
        $stmt->execute($args, $options);
      }
      switch ($options['return']) {
        case Database::RETURN_STATEMENT:
          return $stmt;
        case Database::RETURN_AFFECTED:
          return $stmt->rowCount();
        case Database::RETURN_INSERT_ID:
          $sequence_name = isset($options['sequence_name']) ? $options['sequence_name'] : NULL;
          return $this->connection
            ->lastInsertId($sequence_name);
        case Database::RETURN_NULL:
          return;
        default:
          throw new PDOException('Invalid return directive: ' . $options['return']);
      }
    } catch (PDOException $e) {
      if ($options['throw_exception']) {
        // Add additional debug information.
        if ($query instanceof DatabaseStatementInterface) {
          $e->errorInfo['query_string'] = $stmt->getQueryString();
        }
        else {
          $e->errorInfo['query_string'] = $query;
        }
        $e->errorInfo['args'] = $args;
        throw $e;
      }
      return NULL;
    }
  }
  public function queryRange($query, $from, $count, array $args = array(), array $options = array()) {
    return $this->query($query . ' LIMIT ' . (int) $count . ' OFFSET ' . (int) $from, $args, $options);
  }
  public function queryTemporary($query, array $args = array(), array $options = array()) {
    $tablename = $this->generateTemporaryTableName();
    $this->query('CREATE TEMPORARY TABLE {' . $tablename . '} AS ' . $query, $args, $options);
    return $tablename;
  }
  public function driver() {
    return 'pgsql';
  }
  public function databaseType() {
    return 'pgsql';
  }
  public function mapConditionOperator($operator) {
    static $specials;
    // Function calls not allowed in static declarations, thus this method.
    if (!isset($specials)) {
      $specials = array(
        // In PostgreSQL, 'LIKE' is case-sensitive. For case-insensitive LIKE
        // statements, we need to use ILIKE instead.
'LIKE' => array(
          'operator' => 'ILIKE',
        ),
        'NOT LIKE' => array(
          'operator' => 'NOT ILIKE',
        ),
      );
    }
    return isset($specials[$operator]) ? $specials[$operator] : NULL;
  }
  
  /**
   * Retrieve the next id in a sequence.
   *
   * PostgreSQL has built in sequences. We'll use these instead of inserting
   * and updating a sequences table.
   */
  public function nextId($existing = 0) {
    // Retrieve the name of the sequence. This information cannot be cached
    // because the prefix may change, for example, like it does in simpletests.
    $sequence_name = $this->makeSequenceName('sequences', 'value');
    // When PostgreSQL gets a value too small then it will lock the table,
    // retry the INSERT and if it's still too small then alter the sequence.
    $id = $this->query("SELECT nextval('" . $sequence_name . "')")
      ->fetchField();
    if ($id > $existing) {
      return $id;
    }
    // PostgreSQL advisory locks are simply locks to be used by an
    // application such as Drupal. This will prevent other Drupal processes
    // from altering the sequence while we are.
    $this->query("SELECT pg_advisory_lock(" . POSTGRESQL_NEXTID_LOCK . ")");
    // While waiting to obtain the lock, the sequence may have been altered
    // so lets try again to obtain an adequate value.
    $id = $this->query("SELECT nextval('" . $sequence_name . "')")
      ->fetchField();
    if ($id > $existing) {
      $this->query("SELECT pg_advisory_unlock(" . POSTGRESQL_NEXTID_LOCK . ")");
      return $id;
    }
    // Reset the sequence to a higher value than the existing id.
    $this->query("ALTER SEQUENCE " . $sequence_name . " RESTART WITH " . ($existing + 1));
    // Retrieve the next id. We know this will be as high as we want it.
    $id = $this->query("SELECT nextval('" . $sequence_name . "')")
      ->fetchField();
    $this->query("SELECT pg_advisory_unlock(" . POSTGRESQL_NEXTID_LOCK . ")");
    return $id;
  }
  public function utf8mb4IsActive() {
    return TRUE;
  }
  public function utf8mb4IsSupported() {
    return TRUE;
  }
}Members
| Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides | 
|---|---|---|---|---|---|
| DatabaseConnection::$connection | protected | property | The actual PDO connection. | ||
| DatabaseConnection::$connectionOptions | protected | property | The connection information for this connection object. | ||
| DatabaseConnection::$driverClasses | protected | property | Index of what driver-specific class to use for various operations. | ||
| DatabaseConnection::$escapedAliases | protected | property | List of escaped aliases names, keyed by unescaped aliases. | ||
| DatabaseConnection::$escapedNames | protected | property | List of escaped database, table, and field names, keyed by unescaped names. | ||
| DatabaseConnection::$key | protected | property | The key representing this connection. | ||
| DatabaseConnection::$logger | protected | property | The current database logging object for this connection. | ||
| DatabaseConnection::$prefixes | protected | property | The prefixes used by this database connection. | ||
| DatabaseConnection::$prefixReplace | protected | property | List of replacement values for use in prefixTables(). | ||
| DatabaseConnection::$prefixSearch | protected | property | List of search values for use in prefixTables(). | ||
| DatabaseConnection::$schema | protected | property | The schema object for this connection. | ||
| DatabaseConnection::$statementClass | protected | property | The name of the Statement class for this connection. | ||
| DatabaseConnection::$target | protected | property | The database target this connection is for. | ||
| DatabaseConnection::$temporaryNameIndex | protected | property | An index used to generate unique temporary table names. | ||
| DatabaseConnection::$transactionalDDLSupport | protected | property | Whether this database connection supports transactional DDL. | ||
| DatabaseConnection::$transactionLayers | protected | property | Tracks the number of "layers" of transactions currently active. | ||
| DatabaseConnection::$transactionSupport | protected | property | Whether this database connection supports transactions. | ||
| DatabaseConnection::$unprefixedTablesMap | protected | property | List of un-prefixed table names, keyed by prefixed table names. | ||
| DatabaseConnection::commit | public | function | Throws an exception to deny direct access to transaction commits. | ||
| DatabaseConnection::defaultOptions | protected | function | Returns the default query options for any given query. | ||
| DatabaseConnection::delete | public | function | Prepares and returns a DELETE query object. | ||
| DatabaseConnection::destroy | public | function | Destroys this Connection object. | ||
| DatabaseConnection::escapeAlias | public | function | Escapes an alias name string. | 1 | |
| DatabaseConnection::escapeField | public | function | Escapes a field name string. | 1 | |
| DatabaseConnection::escapeLike | public | function | Escapes characters that work as wildcard characters in a LIKE pattern. | ||
| DatabaseConnection::escapeTable | public | function | Escapes a table name string. | ||
| DatabaseConnection::expandArguments | protected | function | Expands out shorthand placeholders. | ||
| DatabaseConnection::filterComment | protected | function | Sanitize a query comment string. | ||
| DatabaseConnection::generateTemporaryTableName | protected | function | Generates a temporary table name. | ||
| DatabaseConnection::getConnectionOptions | public | function | Returns the connection information for this connection object. | ||
| DatabaseConnection::getDriverClass | public | function | Gets the driver-specific override class if any for the specified class. | ||
| DatabaseConnection::getKey | public | function | Returns the key this connection is associated with. | ||
| DatabaseConnection::getLogger | public | function | Gets the current logging object for this connection. | ||
| DatabaseConnection::getTarget | public | function | Returns the target this connection is associated with. | ||
| DatabaseConnection::getUnprefixedTablesMap | public | function | Gets a list of individually prefixed table names. | ||
| DatabaseConnection::insert | public | function | Prepares and returns an INSERT query object. | ||
| DatabaseConnection::inTransaction | public | function | Determines if there is an active transaction open. | ||
| DatabaseConnection::makeComment | public | function | Flatten an array of query comments into a single comment string. | ||
| DatabaseConnection::makeSequenceName | public | function | Creates the appropriate sequence name for a given table and serial field. | ||
| DatabaseConnection::merge | public | function | Prepares and returns a MERGE query object. | ||
| DatabaseConnection::popCommittableTransactions | protected | function | Internal function: commit all the transaction layers that can commit. | 1 | |
| DatabaseConnection::popTransaction | public | function | Decreases the depth of transaction nesting. | 1 | |
| DatabaseConnection::prefixTables | public | function | Appends a database prefix to all tables in a query. | ||
| DatabaseConnection::pushTransaction | public | function | Increases the depth of transaction nesting. | 1 | |
| DatabaseConnection::rollback | public | function | Rolls back the transaction entirely or to a named savepoint. | 2 | |
| DatabaseConnection::schema | public | function | Returns a DatabaseSchema object for manipulating the schema. | ||
| DatabaseConnection::select | public | function | Prepares and returns a SELECT query object. | ||
| DatabaseConnection::setKey | public | function | Tells this connection object what its key is. | ||
| DatabaseConnection::setLogger | public | function | Associates a logging object with this connection. | ||
| DatabaseConnection::setPrefix | protected | function | Set the list of prefixes used by this database connection. | 1 | |
| DatabaseConnection::setTarget | public | function | Tells this connection object what its target value is. | ||
| DatabaseConnection::startTransaction | public | function | Returns a new DatabaseTransaction object on this connection. | ||
| DatabaseConnection::supportsTransactionalDDL | public | function | Determines if this driver supports transactional DDL. | ||
| DatabaseConnection::supportsTransactions | public | function | Determines if this driver supports transactions. | ||
| DatabaseConnection::tablePrefix | public | function | Find the prefix for a table. | ||
| DatabaseConnection::transactionDepth | public | function | Determines current transaction depth. | ||
| DatabaseConnection::truncate | public | function | Prepares and returns a TRUNCATE query object. | ||
| DatabaseConnection::update | public | function | Prepares and returns an UPDATE query object. | ||
| DatabaseConnection::utf8mb4IsConfigurable | public | function | Checks whether utf8mb4 support is configurable in settings.php. | 1 | |
| DatabaseConnection::version | public | function | Returns the version of the database server. | ||
| DatabaseConnection::__call | public | function | Proxy possible direct calls to the \PDO methods. | ||
| DatabaseConnection_pgsql::databaseType | public | function | Returns the name of the PDO driver for this connection. | Overrides DatabaseConnection::databaseType | |
| DatabaseConnection_pgsql::driver | public | function | Returns the type of database driver. | Overrides DatabaseConnection::driver | |
| DatabaseConnection_pgsql::mapConditionOperator | public | function | Gets any special processing requirements for the condition operator. | Overrides DatabaseConnection::mapConditionOperator | |
| DatabaseConnection_pgsql::nextId | public | function | Retrieve the next id in a sequence. | Overrides DatabaseConnection::nextId | |
| DatabaseConnection_pgsql::prepareQuery | public | function | Prepares a query string and returns the prepared statement. | Overrides DatabaseConnection::prepareQuery | |
| DatabaseConnection_pgsql::query | public | function | Executes a query string against the database. | Overrides DatabaseConnection::query | |
| DatabaseConnection_pgsql::queryRange | public | function | Runs a limited-range query on this database object. | Overrides DatabaseConnection::queryRange | |
| DatabaseConnection_pgsql::queryTemporary | public | function | Runs a SELECT query and stores its results in a temporary table. | Overrides DatabaseConnection::queryTemporary | |
| DatabaseConnection_pgsql::utf8mb4IsActive | public | function | Checks whether utf8mb4 support is currently active. | Overrides DatabaseConnection::utf8mb4IsActive | |
| DatabaseConnection_pgsql::utf8mb4IsSupported | public | function | Checks whether utf8mb4 support is available on the current database system. | Overrides DatabaseConnection::utf8mb4IsSupported | |
| DatabaseConnection_pgsql::__construct | public | function | Overrides DatabaseConnection::__construct | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.
