X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fpgsqlschema.php;h=d50e35f660f65587c89809be2f85198d0c80b04f;hb=b53e1439969bfa2c0b551d8cc2fc8fe15652c62a;hp=a8ce21b3845346ba5c2b6c4dc30b064c79cbefe1;hpb=4101de7dd7cf059816c29c666c816f260a84c252;p=quix0rs-gnu-social.git diff --git a/lib/pgsqlschema.php b/lib/pgsqlschema.php index a8ce21b384..d50e35f660 100644 --- a/lib/pgsqlschema.php +++ b/lib/pgsqlschema.php @@ -81,13 +81,7 @@ class PgsqlSchema extends Schema $orderedFields[$row['ordinal_position']] = $name; $field = array(); - - // ?? - list($type, $size) = $this->reverseMapType($row['udt_name']); - $field['type'] = $type; - if ($size !== null) { - $field['size'] = $size; - } + $field['type'] = $row['udt_name']; if ($type == 'char' || $type == 'varchar') { if ($row['character_maximum_length'] !== null) { @@ -340,6 +334,20 @@ class PgsqlSchema extends Schema } } + /** + * Append an SQL statement to drop an index from a table. + * Note that in PostgreSQL, index names are DB-unique. + * + * @param array $statements + * @param string $table + * @param string $name + * @param array $def + */ + function appendDropIndex(array &$statements, $table, $name) + { + $statements[] = "DROP INDEX $name"; + } + /** * Quote a db/table/column identifier if necessary. * @@ -348,7 +356,7 @@ class PgsqlSchema extends Schema */ function quoteIdentifier($name) { - return '"' . $name . '"'; + return $this->conn->quoteIdentifier($name); } function mapType($column) @@ -363,12 +371,16 @@ class PgsqlSchema extends Schema $type = $map[$type]; } - if (!empty($column['size'])) { - $size = $column['size']; - if ($type == 'integer' && - in_array($size, array('small', 'big'))) { - $type = $size . 'int'; + if ($type == 'int') { + if (!empty($column['size'])) { + $size = $column['size']; + if ($size == 'small') { + return 'int2'; + } else if ($size == 'big') { + return 'int8'; + } } + return 'int4'; } return $type; @@ -386,24 +398,58 @@ class PgsqlSchema extends Schema } /** - * Map a native type back to an independent type + size + * Filter the given table definition array to match features available + * in this database. * - * @param string $type - * @return array ($type, $size) -- $size may be null + * This lets us strip out unsupported things like comments, foreign keys, + * or type variants that we wouldn't get back from getTableDef(). + * + * @param array $tableDef */ - protected function reverseMapType($type) + function filterDef(array $tableDef) { - $type = strtolower($type); - $map = array( - 'int4' => array('int', null), - 'int8' => array('int', 'big'), - 'bytea' => array('blob', null), - ); - if (isset($map[$type])) { - return $map[$type]; - } else { - return array($type, null); + foreach ($tableDef['fields'] as $name => &$col) { + // No convenient support for field descriptions + unset($col['description']); + + /* + if (isset($col['size'])) { + // Don't distinguish between tinyint and int. + if ($col['size'] == 'tiny' && $col['type'] == 'int') { + unset($col['size']); + } + } + */ + $col['type'] = $this->mapType($col); + unset($col['size']); + } + if (!empty($tableDef['primary key'])) { + $tableDef['primary key'] = $this->filterKeyDef($tableDef['primary key']); } + if (!empty($tableDef['unique keys'])) { + foreach ($tableDef['unique keys'] as $i => $def) { + $tableDef['unique keys'][$i] = $this->filterKeyDef($def); + } + } + return $tableDef; } + /** + * Filter the given key/index definition to match features available + * in this database. + * + * @param array $def + * @return array + */ + function filterKeyDef(array $def) + { + // PostgreSQL doesn't like prefix lengths specified on keys...? + foreach ($def as $i => $item) + { + if (is_array($item)) { + $def[$i] = $item[0]; + } + } + return $def; + } }