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).

function DatabaseSchema_pgsql::queryTableInformation

Fetch the list of blobs and sequences used on a table.

We introspect the database to collect the information required by insert and update queries.

Parameters

$table_name: The non-prefixed name of the table.

Return value

An object with two member variables:

  • 'blob_fields' that lists all the blob fields in the table.
  • 'sequences' that lists the sequences used in that table.

File

includes/database/pgsql/schema.inc, line 104

Class

DatabaseSchema_pgsql

Code

public function queryTableInformation($table) {
 // Generate a key to reference this table's information on.
 $key = $this->connection 
 ->prefixTables ('{' . $table . '}');
 // Take into account that temporary tables are stored in a different schema.
 // \DatabaseConnection::generateTemporaryTableName() sets 'db_temporary_'
 // prefix to all temporary tables.
 if (strpos ($key, '.') === FALSE && strpos ($table, 'db_temporary_') === FALSE) {
 $key = 'public.' . $key;
 }
 else {
 $key = $this->getTempNamespaceName () . '.' . $key;
 }
 if (!isset($this->tableInformation [$key])) {
 $table_information = (object) array(
 'blob_fields' => array(),
 'sequences' => array(),
 );
 // The bytea columns and sequences for a table can be found in
 // pg_attribute, which is significantly faster than querying the
 // information_schema. The data type of a field can be found by lookup
 // of the attribute ID, and the default value must be extracted from the
 // node tree for the attribute definition instead of the historical
 // human-readable column, adsrc.
 $sql = <<<'EOD'
 SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type, pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) AS column_default
 FROM pg_attribute
 LEFT JOIN pg_attrdef ON pg_attrdef.adrelid = pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum
 WHERE pg_attribute.attnum > 0
 AND NOT pg_attribute.attisdropped
 AND pg_attribute.attrelid = :key::regclass
 AND (format_type(pg_attribute.atttypid, pg_attribute.atttypmod) = 'bytea'
 OR pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) LIKE 'nextval%')
 EOD;
 $result = $this->connection 
 ->query ($sql, array(
 ':key' => $key,
 ));
 if (empty($result)) {
 return $table_information;
 }
 foreach ($result as $column) {
 if ($column->data_type == 'bytea') {
 $table_information->blob_fields[$column->column_name] = TRUE;
 }
 elseif (preg_match ("/nextval\\('([^']+)'/", $column->column_default, $matches)) {
 // We must know of any sequences in the table structure to help us
 // return the last insert id. If there is more than 1 sequences the
 // first one (index 0 of the sequences array) will be used.
 $table_information->sequences[] = $matches[1];
 $table_information->serial_fields[] = $column->column_name;
 }
 }
 $this->tableInformation [$key] = $table_information;
 }
 return $this->tableInformation [$key];
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.