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::ensureIdentifiersLength

Make sure to limit identifiers according to PostgreSQL compiled in length.

PostgreSQL allows in standard configuration identifiers no longer than 63 chars for table/relation names, indexes, primary keys, and constraints. So we map all identifiers that are too long to drupal_base64hash_tag, where tag is one of:

  • idx for indexes
  • key for constraints
  • pkey for primary keys
  • seq for sequences

Parameters

string $table_identifier_part: The first argument used to build the identifier string. This usually refers to a table/relation name.

string $column_identifier_part: The second argument used to build the identifier string. This usually refers to one or more column names.

string $tag: The identifier tag. It can be one of 'idx', 'key', 'pkey' or 'seq'.

Return value

string The index/constraint/pkey identifier.

10 calls to DatabaseSchema_pgsql::ensureIdentifiersLength()
DatabaseSchema_pgsql::addPrimaryKey in includes/database/pgsql/schema.inc
Add a primary key.
DatabaseSchema_pgsql::addUniqueKey in includes/database/pgsql/schema.inc
Add a unique key.
DatabaseSchema_pgsql::constraintExists in includes/database/pgsql/schema.inc
Helper function: check if a constraint (PK, FK, UK) exists.
DatabaseSchema_pgsql::createTableSql in includes/database/pgsql/schema.inc
Generate SQL to create a new table from a Drupal schema definition.
DatabaseSchema_pgsql::dropIndex in includes/database/pgsql/schema.inc
Drop an index.

... See full list

File

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

Class

DatabaseSchema_pgsql

Code

protected function ensureIdentifiersLength($table_identifier_part, $column_identifier_part, $tag) {
 $info = $this->getPrefixInfo ($table_identifier_part);
 $table_identifier_part = $info['table'];
 // Filters out potentially empty $column_identifier_part to ensure
 // compatibility with old naming convention (see prefixNonTable()).
 $identifiers = array_filter (array(
 $table_identifier_part,
 $column_identifier_part,
 $tag,
 ));
 $identifierName = implode ('_', $identifiers);
 // Retrieve the max identifier length which is usually 63 characters
 // but can be altered before PostgreSQL is compiled so we need to check.
 if (empty($this->maxIdentifierLength )) {
 $this->maxIdentifierLength  = $this->connection 
 ->query ("SHOW max_identifier_length")
 ->fetchField ();
 }
 if (strlen ($identifierName) > $this->maxIdentifierLength ) {
 $saveIdentifier = 'drupal_' . $this->hashBase64 ($identifierName) . '_' . $tag;
 }
 else {
 $saveIdentifier = $identifierName;
 }
 return $saveIdentifier;
}

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