Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402]

   1  <?php
   2  /**
   3   * Microsoft SQL Server ADO driver.
   4   *
   5   * Requires ADO and MSSQL client. Works only on MS Windows.
   6   *
   7   * This file is part of ADOdb, a Database Abstraction Layer library for PHP.
   8   *
   9   * @package ADOdb
  10   * @link https://adodb.org Project's web site and documentation
  11   * @link https://github.com/ADOdb/ADOdb Source code and issue tracker
  12   *
  13   * The ADOdb Library is dual-licensed, released under both the BSD 3-Clause
  14   * and the GNU Lesser General Public Licence (LGPL) v2.1 or, at your option,
  15   * any later version. This means you can use it in proprietary products.
  16   * See the LICENSE.md file distributed with this source code for details.
  17   * @license BSD-3-Clause
  18   * @license LGPL-2.1-or-later
  19   *
  20   * @copyright 2000-2013 John Lim
  21   * @copyright 2014 Damien Regad, Mark Newnham and the ADOdb community
  22   */
  23  
  24  // security - hide paths
  25  if (!defined('ADODB_DIR')) die();
  26  
  27  if (!defined('_ADODB_ADO_LAYER')) {
  28  	 include_once(ADODB_DIR . "/drivers/adodb-ado5.inc.php");
  29  }
  30  
  31  
  32  class  ADODB_ado_mssql extends ADODB_ado {
  33  	 var $databaseType = 'ado_mssql';
  34  	 var $hasTop = 'top';
  35  	 var $hasInsertID = true;
  36  	 var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
  37  	 var $sysTimeStamp = 'GetDate()';
  38  	 var $leftOuter = '*=';
  39  	 var $rightOuter = '=*';
  40  	 var $ansiOuter = true; // for mssql7 or later
  41  	 var $substr = "substring";
  42  	 var $length = 'len';
  43  	 var $_dropSeqSQL = "drop table %s";
  44  
  45  	 //var $_inTransaction = 1; // always open recordsets, so no transaction problems.
  46  
  47  	protected function _insertID($table = '', $column = '')
  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);
  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  }