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