Merge "Handle missing namespace prefix in XML dumps more gracefully"
[lhc/web/wiklou.git] / includes / libs / rdbms / field / PostgresField.php
1 <?php
2
3 namespace Wikimedia\Rdbms;
4
5 use DatabasePostgres;
6
7 class PostgresField implements Field {
8 private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname,
9 $has_default, $default;
10
11 /**
12 * @param DatabasePostgres $db
13 * @param string $table
14 * @param string $field
15 * @return null|PostgresField
16 */
17 static function fromText( DatabasePostgres $db, $table, $field ) {
18 $q = <<<SQL
19 SELECT
20 attnotnull, attlen, conname AS conname,
21 atthasdef,
22 adsrc,
23 COALESCE(condeferred, 'f') AS deferred,
24 COALESCE(condeferrable, 'f') AS deferrable,
25 CASE WHEN typname = 'int2' THEN 'smallint'
26 WHEN typname = 'int4' THEN 'integer'
27 WHEN typname = 'int8' THEN 'bigint'
28 WHEN typname = 'bpchar' THEN 'char'
29 ELSE typname END AS typname
30 FROM pg_class c
31 JOIN pg_namespace n ON (n.oid = c.relnamespace)
32 JOIN pg_attribute a ON (a.attrelid = c.oid)
33 JOIN pg_type t ON (t.oid = a.atttypid)
34 LEFT JOIN pg_constraint o ON (o.conrelid = c.oid AND a.attnum = ANY(o.conkey) AND o.contype = 'f')
35 LEFT JOIN pg_attrdef d on c.oid=d.adrelid and a.attnum=d.adnum
36 WHERE relkind = 'r'
37 AND nspname=%s
38 AND relname=%s
39 AND attname=%s;
40 SQL;
41
42 $table = $db->remappedTableName( $table );
43 $res = $db->query(
44 sprintf( $q,
45 $db->addQuotes( $db->getCoreSchema() ),
46 $db->addQuotes( $table ),
47 $db->addQuotes( $field )
48 )
49 );
50 $row = $db->fetchObject( $res );
51 if ( !$row ) {
52 return null;
53 }
54 $n = new PostgresField;
55 $n->type = $row->typname;
56 $n->nullable = ( $row->attnotnull == 'f' );
57 $n->name = $field;
58 $n->tablename = $table;
59 $n->max_length = $row->attlen;
60 $n->deferrable = ( $row->deferrable == 't' );
61 $n->deferred = ( $row->deferred == 't' );
62 $n->conname = $row->conname;
63 $n->has_default = ( $row->atthasdef === 't' );
64 $n->default = $row->adsrc;
65
66 return $n;
67 }
68
69 function name() {
70 return $this->name;
71 }
72
73 function tableName() {
74 return $this->tablename;
75 }
76
77 function type() {
78 return $this->type;
79 }
80
81 function isNullable() {
82 return $this->nullable;
83 }
84
85 function maxLength() {
86 return $this->max_length;
87 }
88
89 function is_deferrable() {
90 return $this->deferrable;
91 }
92
93 function is_deferred() {
94 return $this->deferred;
95 }
96
97 function conname() {
98 return $this->conname;
99 }
100
101 /**
102 * @since 1.19
103 * @return bool|mixed
104 */
105 function defaultValue() {
106 if ( $this->has_default ) {
107 return $this->default;
108 } else {
109 return false;
110 }
111 }
112 }