]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-ado_mssql.inc.php
Upgrade adodb
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / drivers / adodb-ado_mssql.inc.php
1 <?php
2 /* 
3 V5.18 3 Sep 2012  (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved.
4   Released under both BSD license and Lesser GPL library license. 
5   Whenever there is any discrepancy between the two licenses, 
6   the BSD license will take precedence. 
7 Set tabs to 4 for best viewing.
8   
9   Latest version is available at http://adodb.sourceforge.net
10   
11   Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client. 
12   Works only on MS Windows.
13   
14   Warning: Some versions of PHP (esp PHP4) leak memory when ADO/COM is used. 
15   Please check http://bugs.php.net/ for more info.
16 */
17
18 // security - hide paths
19 if (!defined('ADODB_DIR')) die();
20
21 if (!defined('_ADODB_ADO_LAYER')) {
22         if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
23         else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
24 }
25
26
27 class  ADODB_ado_mssql extends ADODB_ado {        
28         var $databaseType = 'ado_mssql';
29         var $hasTop = 'top';
30         var $hasInsertID = true;
31         var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
32         var $sysTimeStamp = 'GetDate()';
33         var $leftOuter = '*=';
34         var $rightOuter = '=*';
35         var $ansiOuter = true; // for mssql7 or later
36         var $substr = "substring";
37         var $length = 'len';
38         var $_dropSeqSQL = "drop table %s";
39         
40         //var $_inTransaction = 1; // always open recordsets, so no transaction problems.
41         
42         function ADODB_ado_mssql()
43         {
44                 $this->ADODB_ado();
45         }
46         
47         function _insertid()
48         {
49                 return $this->GetOne('select SCOPE_IDENTITY()');
50         }
51         
52         function _affectedrows()
53         {
54                 return $this->GetOne('select @@rowcount');
55         }
56         
57         function SetTransactionMode( $transaction_mode ) 
58         {
59                 $this->_transmode  = $transaction_mode;
60                 if (empty($transaction_mode)) {
61                         $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
62                         return;
63                 }
64                 if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
65                 $this->Execute("SET TRANSACTION ".$transaction_mode);
66         }
67         
68         function qstr($s,$magic_quotes=false)
69         {
70                 $s = ADOConnection::qstr($s, $magic_quotes);
71                 return str_replace("\0", "\\\\000", $s);
72         }
73         
74         function MetaColumns($table, $normalize=true)
75         {
76         $table = strtoupper($table);
77         $arr= array();
78         $dbc = $this->_connectionID;
79         
80         $osoptions = array();
81         $osoptions[0] = null;
82         $osoptions[1] = null;
83         $osoptions[2] = $table;
84         $osoptions[3] = null;
85         
86         $adors=@$dbc->OpenSchema(4, $osoptions);//tables
87
88         if ($adors){
89                 while (!$adors->EOF){
90                         $fld = new ADOFieldObject();
91                         $c = $adors->Fields(3);
92                         $fld->name = $c->Value;
93                         $fld->type = 'CHAR'; // cannot discover type in ADO!
94                         $fld->max_length = -1;
95                         $arr[strtoupper($fld->name)]=$fld;
96         
97                         $adors->MoveNext();
98                 }
99                 $adors->Close();
100         }
101         $false = false;
102                 return empty($arr) ? $false : $arr;
103         }
104         
105         function CreateSequence($seq='adodbseq',$start=1)
106         {
107                 
108                 $this->Execute('BEGIN TRANSACTION adodbseq');
109                 $start -= 1;
110                 $this->Execute("create table $seq (id float(53))");
111                 $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
112                 if (!$ok) {
113                                 $this->Execute('ROLLBACK TRANSACTION adodbseq');
114                                 return false;
115                 }
116                 $this->Execute('COMMIT TRANSACTION adodbseq'); 
117                 return true;
118         }
119
120         function GenID($seq='adodbseq',$start=1)
121         {
122                 //$this->debug=1;
123                 $this->Execute('BEGIN TRANSACTION adodbseq');
124                 $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
125                 if (!$ok) {
126                         $this->Execute("create table $seq (id float(53))");
127                         $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
128                         if (!$ok) {
129                                 $this->Execute('ROLLBACK TRANSACTION adodbseq');
130                                 return false;
131                         }
132                         $this->Execute('COMMIT TRANSACTION adodbseq'); 
133                         return $start;
134                 }
135                 $num = $this->GetOne("select id from $seq");
136                 $this->Execute('COMMIT TRANSACTION adodbseq'); 
137                 return $num;
138                 
139                 // in old implementation, pre 1.90, we returned GUID...
140                 //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'");
141         }
142         
143         } // end class 
144         
145         class  ADORecordSet_ado_mssql extends ADORecordSet_ado {        
146         
147         var $databaseType = 'ado_mssql';
148         
149         function ADORecordSet_ado_mssql($id,$mode=false)
150         {
151                 return $this->ADORecordSet_ado($id,$mode);
152         }
153 }
154 ?>