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  foreach ( $db->getCoreSchemas() as $schema ) {
41  $res = $db->query(
42  sprintf( $q,
43  $db->addQuotes( $schema ),
44  $db->addQuotes( $table ),
45  $db->addQuotes( $field )
46  ),
47  __METHOD__
48  );
49  $row = $res->fetchObject();
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 }
Postgres database abstraction layer.
getCoreSchemas()
Return schema names for temporary tables and core application tables.
addQuotes( $s)
Escape and quote a raw value string for use in a SQL query.stringStability: stableto override
query( $sql, $fname=__METHOD__, $flags=0)
Run an SQL query statement and return the result.
Definition: Database.php:658
tableName()
Name of table this field belongs to.
isNullable()
Whether this field can store NULL values.
static fromText(DatabasePostgres $db, $table, $field)
Base for all database-specific classes representing information about database fields.
Definition: Field.php:9