Updated adodb syysext to upstream version 5.0.8a.
[Packages/TYPO3.CMS.git] / typo3 / sysext / adodb / adodb / drivers / adodb-ado_mssql.inc.php
1 <?php
2 /*
3 V5.08 6 Apr 2009 (c) 2000-2009 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)
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 ?>