Error message

You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).

class DatabaseConnection_pgsql

Hierarchy

Expanded class hierarchy of DatabaseConnection_pgsql

Related topics

Database abstraction layer
Allow the use of different database servers using the same code base.

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.