]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-odbc_mssql.inc.php
new ADODB library 4.22 with multiple drivers (not only mysql as before), major change...
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / drivers / adodb-odbc_mssql.inc.php
1 <?php\r
2 /* \r
3 V4.22 15 Apr 2004  (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.\r
4   Released under both BSD license and Lesser GPL library license. \r
5   Whenever there is any discrepancy between the two licenses, \r
6   the BSD license will take precedence. \r
7 Set tabs to 4 for best viewing.\r
8   \r
9   Latest version is available at http://php.weblogs.com/\r
10   \r
11   MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix. \r
12   For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3\r
13 */\r
14 \r
15 if (!defined('_ADODB_ODBC_LAYER')) {\r
16         include(ADODB_DIR."/drivers/adodb-odbc.inc.php");\r
17 }\r
18 \r
19  \r
20 class  ADODB_odbc_mssql extends ADODB_odbc {    \r
21         var $databaseType = 'odbc_mssql';\r
22         var $fmtDate = "'Y-m-d'";\r
23         var $fmtTimeStamp = "'Y-m-d h:i:sA'";\r
24         var $_bindInputArray = true;\r
25         var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))";\r
26         var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";\r
27         var $hasTop = 'top';            // support mssql/interbase SELECT TOP 10 * FROM TABLE\r
28         var $sysDate = 'GetDate()';\r
29         var $sysTimeStamp = 'GetDate()';\r
30         var $leftOuter = '*=';\r
31         var $rightOuter = '=*';\r
32         var $upperCase = 'upper';\r
33         var $substr = 'substring';\r
34         var $length = 'len';\r
35         var $ansiOuter = true; // for mssql7 or later\r
36         var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000\r
37         var $hasInsertID = true;\r
38         var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON, \r
39                                                                                                                   # concatenating a null value with a string yields a NULL result\r
40         \r
41         function ADODB_odbc_mssql()\r
42         {\r
43                 $this->ADODB_odbc();\r
44                 $this->curmode = SQL_CUR_USE_ODBC;      \r
45         }\r
46 \r
47         // crashes php...\r
48         function ServerInfo()\r
49         {\r
50         global $ADODB_FETCH_MODE;\r
51                 $save = $ADODB_FETCH_MODE;\r
52                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;\r
53                 $row = $this->GetRow("execute sp_server_info 2");\r
54                 $ADODB_FETCH_MODE = $save;\r
55                 if (!is_array($row)) return false;\r
56                 $arr['description'] = $row[2];\r
57                 $arr['version'] = ADOConnection::_findvers($arr['description']);\r
58                 return $arr;\r
59         }\r
60 \r
61         function IfNull( $field, $ifNull ) \r
62         {\r
63                 return " ISNULL($field, $ifNull) "; // if MS SQL Server\r
64         }\r
65         \r
66         function _insertid()\r
67         {\r
68         // SCOPE_IDENTITY()\r
69         // Returns the last IDENTITY value inserted into an IDENTITY column in \r
70         // the same scope. A scope is a module -- a stored procedure, trigger, \r
71         // function, or batch. Thus, two statements are in the same scope if \r
72         // they are in the same stored procedure, function, or batch.\r
73                         return $this->GetOne($this->identitySQL);\r
74         }\r
75         \r
76         \r
77         function MetaForeignKeys($table, $owner=false, $upper=false)\r
78         {\r
79         global $ADODB_FETCH_MODE;\r
80         \r
81                 $save = $ADODB_FETCH_MODE;\r
82                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;\r
83                 $table = $this->qstr(strtoupper($table));\r
84                 \r
85                 $sql = \r
86 "select object_name(constid) as constraint_name,\r
87         col_name(fkeyid, fkey) as column_name,\r
88         object_name(rkeyid) as referenced_table_name,\r
89         col_name(rkeyid, rkey) as referenced_column_name\r
90 from sysforeignkeys\r
91 where upper(object_name(fkeyid)) = $table\r
92 order by constraint_name, referenced_table_name, keyno";\r
93                 \r
94                 $constraints =& $this->GetArray($sql);\r
95                 \r
96                 $ADODB_FETCH_MODE = $save;\r
97                 \r
98                 $arr = false;\r
99                 foreach($constraints as $constr) {\r
100                         //print_r($constr);\r
101                         $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; \r
102                 }\r
103                 if (!$arr) return false;\r
104                 \r
105                 $arr2 = false;\r
106                 \r
107                 foreach($arr as $k => $v) {\r
108                         foreach($v as $a => $b) {\r
109                                 if ($upper) $a = strtoupper($a);\r
110                                 $arr2[$a] = $b;\r
111                         }\r
112                 }\r
113                 return $arr2;\r
114         }\r
115         \r
116         function &MetaTables($ttype=false,$showSchema=false,$mask=false) \r
117         {\r
118                 if ($mask) {$this->debug=1;\r
119                         $save = $this->metaTablesSQL;\r
120                         $mask = $this->qstr($mask);\r
121                         $this->metaTablesSQL .= " AND name like $mask";\r
122                 }\r
123                 $ret =& ADOConnection::MetaTables($ttype,$showSchema);\r
124                 \r
125                 if ($mask) {\r
126                         $this->metaTablesSQL = $save;\r
127                 }\r
128                 return $ret;\r
129         }\r
130         \r
131         function &MetaColumns($table)\r
132         {\r
133                 return ADOConnection::MetaColumns($table);\r
134         }\r
135         \r
136         function _query($sql,$inputarr)\r
137         {\r
138                 if (is_string($sql)) $sql = str_replace('||','+',$sql);\r
139                 return ADODB_odbc::_query($sql,$inputarr);\r
140         }\r
141         \r
142         // "Stein-Aksel Basma" <basma@accelero.no>\r
143         // tested with MSSQL 2000\r
144         function &MetaPrimaryKeys($table)\r
145         {\r
146                 $sql = "select k.column_name from information_schema.key_column_usage k,\r
147                 information_schema.table_constraints tc \r
148                 where tc.constraint_name = k.constraint_name and tc.constraint_type =\r
149                 'PRIMARY KEY' and k.table_name = '$table'";\r
150                 \r
151                 $a = $this->GetCol($sql);\r
152                 if ($a && sizeof($a)>0) return $a;\r
153                 return false;     \r
154         }\r
155         \r
156         function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)\r
157         {\r
158                 if ($nrows > 0 && $offset <= 0) {\r
159                         $sql = preg_replace(\r
160                                 '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);\r
161                         $rs =& $this->Execute($sql,$inputarr);\r
162                 } else\r
163                         $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);\r
164                         \r
165                 return $rs;\r
166         }\r
167         \r
168         // Format date column in sql string given an input format that understands Y M D\r
169         function SQLDate($fmt, $col=false)\r
170         {       \r
171                 if (!$col) $col = $this->sysTimeStamp;\r
172                 $s = '';\r
173                 \r
174                 $len = strlen($fmt);\r
175                 for ($i=0; $i < $len; $i++) {\r
176                         if ($s) $s .= '+';\r
177                         $ch = $fmt[$i];\r
178                         switch($ch) {\r
179                         case 'Y':\r
180                         case 'y':\r
181                                 $s .= "datename(yyyy,$col)";\r
182                                 break;\r
183                         case 'M':\r
184                                 $s .= "convert(char(3),$col,0)";\r
185                                 break;\r
186                         case 'm':\r
187                                 $s .= "replace(str(month($col),2),' ','0')";\r
188                                 break;\r
189                         case 'Q':\r
190                         case 'q':\r
191                                 $s .= "datename(quarter,$col)";\r
192                                 break;\r
193                         case 'D':\r
194                         case 'd':\r
195                                 $s .= "replace(str(day($col),2),' ','0')";\r
196                                 break;\r
197                         case 'h':\r
198                                 $s .= "substring(convert(char(14),$col,0),13,2)";\r
199                                 break;\r
200                         \r
201                         case 'H':\r
202                                 $s .= "replace(str(datepart(hh,$col),2),' ','0')";\r
203                                 break;\r
204                                 \r
205                         case 'i':\r
206                                 $s .= "replace(str(datepart(mi,$col),2),' ','0')";\r
207                                 break;\r
208                         case 's':\r
209                                 $s .= "replace(str(datepart(ss,$col),2),' ','0')";\r
210                                 break;\r
211                         case 'a':\r
212                         case 'A':\r
213                                 $s .= "substring(convert(char(19),$col,0),18,2)";\r
214                                 break;\r
215                                 \r
216                         default:\r
217                                 if ($ch == '\\') {\r
218                                         $i++;\r
219                                         $ch = substr($fmt,$i,1);\r
220                                 }\r
221                                 $s .= $this->qstr($ch);\r
222                                 break;\r
223                         }\r
224                 }\r
225                 return $s;\r
226         }\r
227 \r
228\r
229  \r
230 class  ADORecordSet_odbc_mssql extends ADORecordSet_odbc {      \r
231         \r
232         var $databaseType = 'odbc_mssql';\r
233         \r
234         function ADORecordSet_odbc_mssql($id,$mode=false)\r
235         {\r
236                 return $this->ADORecordSet_odbc($id,$mode);\r
237         }       \r
238 }\r
239 ?>