public function Schema::queryTableInformation in Zircon Profile 8
Same name and namespace in other branches
- 8.0 core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php \Drupal\Core\Database\Driver\pgsql\Schema::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.
2 calls to Schema::queryTableInformation()
- Schema::changeField in core/
lib/ Drupal/ Core/ Database/ Driver/ pgsql/ Schema.php - Change a field definition.
- Schema::renameTable in core/
lib/ Drupal/ Core/ Database/ Driver/ pgsql/ Schema.php - Rename a table.
File
- core/
lib/ Drupal/ Core/ Database/ Driver/ pgsql/ Schema.php, line 94 - Contains \Drupal\Core\Database\Driver\pgsql\Schema.
Class
- Schema
- PostgreSQL implementation of \Drupal\Core\Database\Schema.
Namespace
Drupal\Core\Database\Driver\pgsqlCode
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.
// \Drupal\Core\Database\Connection::generateTemporaryTableName() sets the
// 'db_temporary_' prefix to all temporary tables.
if (strpos($key, '.') === FALSE && strpos($table, 'db_temporary_') === FALSE) {
$key = 'public.' . $key;
}
else {
$schema = $this->connection
->query('SELECT nspname FROM pg_namespace WHERE oid = pg_my_temp_schema()')
->fetchField();
$key = $schema . '.' . $key;
}
if (!isset($this->tableInformation[$key])) {
// Split the key into schema and table for querying.
list($schema, $table_name) = explode('.', $key);
$table_information = (object) array(
'blob_fields' => array(),
'sequences' => array(),
);
// Don't use {} around information_schema.columns table.
$this->connection
->addSavepoint();
try {
// Check if the table information exists in the PostgreSQL metadata.
$table_information_exists = (bool) $this->connection
->query("SELECT 1 FROM pg_class WHERE relname = :table", array(
':table' => $table_name,
))
->fetchField();
// If the table information does not yet exist in the PostgreSQL
// metadata, then return the default table information here, so that it
// will not be cached.
if (!$table_information_exists) {
$this->connection
->releaseSavepoint();
return $table_information;
}
else {
$result = $this->connection
->query("SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_schema = :schema AND table_name = :table AND (data_type = 'bytea' OR (numeric_precision IS NOT NULL AND column_default LIKE :default))", array(
':schema' => $schema,
':table' => $table_name,
':default' => '%nextval%',
));
}
} catch (\Exception $e) {
$this->connection
->rollbackSavepoint();
throw $e;
}
$this->connection
->releaseSavepoint();
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];
}