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