MediaWiki  master
PostgresField.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Wikimedia\Rdbms;
4 
5 class PostgresField implements Field {
8 
15  public static function fromText( DatabasePostgres $db, $table, $field ) {
16  $q = <<<SQL
17 SELECT
18  attnotnull, attlen, conname AS conname,
19  atthasdef,
20  pg_get_expr(adbin, adrelid) AS adsrc,
21  COALESCE(condeferred, 'f') AS deferred,
22  COALESCE(condeferrable, 'f') AS deferrable,
23  CASE WHEN typname = 'int2' THEN 'smallint'
24  WHEN typname = 'int4' THEN 'integer'
25  WHEN typname = 'int8' THEN 'bigint'
26  WHEN typname = 'bpchar' THEN 'char'
27  ELSE typname END AS typname
28 FROM pg_class c
29 JOIN pg_namespace n ON (n.oid = c.relnamespace)
30 JOIN pg_attribute a ON (a.attrelid = c.oid)
31 JOIN pg_type t ON (t.oid = a.atttypid)
32 LEFT JOIN pg_constraint o ON (o.conrelid = c.oid AND a.attnum = ANY(o.conkey) AND o.contype = 'f')
33 LEFT JOIN pg_attrdef d on c.oid=d.adrelid and a.attnum=d.adnum
34 WHERE relkind = 'r'
35 AND nspname=%s
36 AND relname=%s
37 AND attname=%s;
38 SQL;
39 
40  $table = $db->remappedTableName( $table );
41  foreach ( $db->getCoreSchemas() as $schema ) {
42  $res = $db->query(
43  sprintf( $q,
44  $db->addQuotes( $schema ),
45  $db->addQuotes( $table ),
46  $db->addQuotes( $field )
47  )
48  );
49  $row = $db->fetchObject( $res );
50  if ( !$row ) {
51  continue;
52  }
53  $n = new PostgresField;
54  $n->type = $row->typname;
55  $n->nullable = ( $row->attnotnull == 'f' );
56  $n->name = $field;
57  $n->tablename = $table;
58  $n->max_length = $row->attlen;
59  $n->deferrable = ( $row->deferrable == 't' );
60  $n->deferred = ( $row->deferred == 't' );
61  $n->conname = $row->conname;
62  $n->has_default = ( $row->atthasdef === 't' );
63  $n->default = $row->adsrc;
64 
65  return $n;
66  }
67 
68  return null;
69  }
70 
71  public function name() {
72  return $this->name;
73  }
74 
75  public function tableName() {
76  return $this->tablename;
77  }
78 
79  public function type() {
80  return $this->type;
81  }
82 
83  public function isNullable() {
84  return $this->nullable;
85  }
86 
87  public function maxLength() {
88  return $this->max_length;
89  }
90 
91  public function is_deferrable() {
92  return $this->deferrable;
93  }
94 
95  public function is_deferred() {
96  return $this->deferred;
97  }
98 
99  public function conname() {
100  return $this->conname;
101  }
102 
107  public function defaultValue() {
108  if ( $this->has_default ) {
109  return $this->default;
110  } else {
111  return false;
112  }
113  }
114 }
Wikimedia\Rdbms\PostgresField\conname
conname()
Definition: PostgresField.php:99
Wikimedia\Rdbms\PostgresField\tableName
tableName()
Name of table this field belongs to.
Definition: PostgresField.php:75
Wikimedia\Rdbms\PostgresField\$conname
$conname
Definition: PostgresField.php:6
Wikimedia\Rdbms\DatabasePostgres\remappedTableName
remappedTableName( $name)
Definition: DatabasePostgres.php:677
Wikimedia\Rdbms\DatabasePostgres\addQuotes
addQuotes( $s)
Escape and quote a raw value string for use in a SQL query.
Definition: DatabasePostgres.php:1262
Wikimedia\Rdbms\PostgresField\$name
$name
Definition: PostgresField.php:6
Wikimedia\Rdbms\DatabasePostgres\getCoreSchemas
getCoreSchemas()
Return schema names for temporary tables and core application tables.
Definition: DatabasePostgres.php:1039
n
while(( $__line=Maintenance::readconsole()) !==false) print n
Definition: eval.php:64
Wikimedia\Rdbms
Definition: ChronologyProtector.php:24
Wikimedia\Rdbms\DatabasePostgres
Definition: DatabasePostgres.php:33
Wikimedia\Rdbms\PostgresField\$default
$default
Definition: PostgresField.php:7
$res
$res
Definition: testCompression.php:57
Wikimedia\Rdbms\PostgresField\is_deferrable
is_deferrable()
Definition: PostgresField.php:91
Wikimedia\Rdbms\DatabasePostgres\fetchObject
fetchObject( $res)
Fetch the next row from the given result object, in object form.
Definition: DatabasePostgres.php:261
Wikimedia\Rdbms\PostgresField\name
name()
Field name.
Definition: PostgresField.php:71
Wikimedia\Rdbms\PostgresField\$deferred
$deferred
Definition: PostgresField.php:6
Wikimedia\Rdbms\PostgresField\fromText
static fromText(DatabasePostgres $db, $table, $field)
Definition: PostgresField.php:15
Wikimedia\Rdbms\PostgresField\$has_default
$has_default
Definition: PostgresField.php:7
Wikimedia\Rdbms\PostgresField\$type
$type
Definition: PostgresField.php:6
Wikimedia\Rdbms\PostgresField\maxLength
maxLength()
Definition: PostgresField.php:87
Wikimedia\Rdbms\PostgresField\$max_length
$max_length
Definition: PostgresField.php:6
Wikimedia\Rdbms\Database\query
query( $sql, $fname=__METHOD__, $flags=self::QUERY_NORMAL)
Run an SQL query and return the result.
Definition: Database.php:1152
Wikimedia\Rdbms\PostgresField\$deferrable
$deferrable
Definition: PostgresField.php:6
Wikimedia\Rdbms\PostgresField
Definition: PostgresField.php:5
Wikimedia\Rdbms\Field
Base for all database-specific classes representing information about database fields.
Definition: Field.php:9
Wikimedia\Rdbms\PostgresField\defaultValue
defaultValue()
Definition: PostgresField.php:107
Wikimedia\Rdbms\PostgresField\isNullable
isNullable()
Whether this field can store NULL values.
Definition: PostgresField.php:83
Wikimedia\Rdbms\PostgresField\type
type()
Database type.
Definition: PostgresField.php:79
Wikimedia\Rdbms\PostgresField\$tablename
$tablename
Definition: PostgresField.php:6
Wikimedia\Rdbms\PostgresField\is_deferred
is_deferred()
Definition: PostgresField.php:95
Wikimedia\Rdbms\PostgresField\$nullable
$nullable
Definition: PostgresField.php:6