- Timestamp:
- 09/26/13 15:41:49 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/drivers/adodb-mssql.inc.php
r34 r8222 1 1 <?php 2 2 /* 3 V 4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.3 V5.18 3 Sep 2012 (c) 2000-2012 John Lim (jlim#natsoft.com). All rights reserved. 4 4 Released under both BSD license and Lesser GPL library license. 5 5 Whenever there is any discrepancy between the two licenses, … … 14 14 15 15 */ 16 16 17 17 18 // security - hide paths … … 84 85 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','dtproperties'))"; 85 86 var $metaColumnsSQL = # xtype==61 is datetime 86 "select c.name,t.name,c.length,87 (case when c.xusertype=61 then 0 else c.xprec end),88 (case when c.xusertype=61 then 0 else c.xscale end)87 "select c.name,t.name,c.length,c.isnullable, c.status, 88 (case when c.xusertype=61 then 0 else c.xprec end), 89 (case when c.xusertype=61 then 0 else c.xscale end) 89 90 from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; 90 91 var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE … … 100 101 var $ansiOuter = true; // for mssql7 or later 101 102 var $poorAffectedRows = true; 102 var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000103 var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 103 104 var $uniqueOrderBy = true; 104 105 var $_bindInputArray = true; 106 var $forceNewConnect = false; 105 107 106 108 function ADODB_mssql() … … 152 154 // function, or batch. Thus, two statements are in the same scope if 153 155 // they are in the same stored procedure, function, or batch. 156 if ($this->lastInsID !== false) { 157 return $this->lastInsID; // InsID from sp_executesql call 158 } else { 154 159 return $this->GetOne($this->identitySQL); 155 } 160 } 161 } 162 163 164 165 /** 166 * Correctly quotes a string so that all strings are escaped. We prefix and append 167 * to the string single-quotes. 168 * An example is $db->qstr("Don't bother",magic_quotes_runtime()); 169 * 170 * @param s the string to quote 171 * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). 172 * This undoes the stupidity of magic quotes for GPC. 173 * 174 * @return quoted string to be sent back to database 175 */ 176 function qstr($s,$magic_quotes=false) 177 { 178 if (!$magic_quotes) { 179 return "'".str_replace("'",$this->replaceQuote,$s)."'"; 180 } 181 182 // undo magic quotes for " unless sybase is on 183 $sybase = ini_get('magic_quotes_sybase'); 184 if (!$sybase) { 185 $s = str_replace('\\"','"',$s); 186 if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything 187 return "'$s'"; 188 else {// change \' to '' for sybase/mssql 189 $s = str_replace('\\\\','\\',$s); 190 return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; 191 } 192 } else { 193 return "'".$s."'"; 194 } 195 } 196 // moodle change end - see readme_moodle.txt 156 197 157 198 function _affectedrows() … … 201 242 202 243 203 function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)244 function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) 204 245 { 205 246 if ($nrows > 0 && $offset <= 0) { 206 247 $sql = preg_replace( 207 248 '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); 208 $rs =& $this->Execute($sql,$inputarr); 249 250 if ($secs2cache) 251 $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); 252 else 253 $rs = $this->Execute($sql,$inputarr); 209 254 } else 210 $rs = &ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);255 $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 211 256 212 257 return $rs; … … 279 324 if ($this->transOff) return true; 280 325 $this->transCnt += 1; 281 $ this->Execute('BEGIN TRAN');282 return true;326 $ok = $this->Execute('BEGIN TRAN'); 327 return $ok; 283 328 } 284 329 … … 288 333 if (!$ok) return $this->RollbackTrans(); 289 334 if ($this->transCnt) $this->transCnt -= 1; 290 $ this->Execute('COMMIT TRAN');291 return true;335 $ok = $this->Execute('COMMIT TRAN'); 336 return $ok; 292 337 } 293 338 function RollbackTrans() … … 295 340 if ($this->transOff) return true; 296 341 if ($this->transCnt) $this->transCnt -= 1; 297 $ this->Execute('ROLLBACK TRAN');298 return true;342 $ok = $this->Execute('ROLLBACK TRAN'); 343 return $ok; 299 344 } 300 345 … … 322 367 See http://www.swynk.com/friends/achigrik/SQL70Locks.asp 323 368 */ 324 function RowLock($tables,$where,$flds='top 1 null as ignore') 325 { 369 function RowLock($tables,$where,$col='1 as adodbignore') 370 { 371 if ($col == '1 as adodbignore') $col = 'top 1 null as ignore'; 326 372 if (!$this->transCnt) $this->BeginTrans(); 327 return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); 328 } 329 330 331 function &MetaIndexes($table,$primary=false) 373 return $this->GetOne("select $col from $tables with (ROWLOCK,HOLDLOCK) where $where"); 374 } 375 376 377 function MetaColumns($table, $normalize=true) 378 { 379 // $arr = ADOConnection::MetaColumns($table); 380 // return $arr; 381 382 $this->_findschema($table,$schema); 383 if ($schema) { 384 $dbName = $this->database; 385 $this->SelectDB($schema); 386 } 387 global $ADODB_FETCH_MODE; 388 $save = $ADODB_FETCH_MODE; 389 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 390 391 if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); 392 $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); 393 394 if ($schema) { 395 $this->SelectDB($dbName); 396 } 397 398 if (isset($savem)) $this->SetFetchMode($savem); 399 $ADODB_FETCH_MODE = $save; 400 if (!is_object($rs)) { 401 $false = false; 402 return $false; 403 } 404 405 $retarr = array(); 406 while (!$rs->EOF){ 407 $fld = new ADOFieldObject(); 408 $fld->name = $rs->fields[0]; 409 $fld->type = $rs->fields[1]; 410 411 $fld->not_null = (!$rs->fields[3]); 412 $fld->auto_increment = ($rs->fields[4] == 128); // sys.syscolumns status field. 0x80 = 128 ref: http://msdn.microsoft.com/en-us/library/ms186816.aspx 413 414 if (isset($rs->fields[5]) && $rs->fields[5]) { 415 if ($rs->fields[5]>0) $fld->max_length = $rs->fields[5]; 416 $fld->scale = $rs->fields[6]; 417 if ($fld->scale>0) $fld->max_length += 1; 418 } else 419 $fld->max_length = $rs->fields[2]; 420 421 if ($save == ADODB_FETCH_NUM) { 422 $retarr[] = $fld; 423 } else { 424 $retarr[strtoupper($fld->name)] = $fld; 425 } 426 $rs->MoveNext(); 427 } 428 429 $rs->Close(); 430 return $retarr; 431 432 } 433 434 435 function MetaIndexes($table,$primary=false, $owner=false) 332 436 { 333 437 $table = $this->qstr($table); … … 361 465 $indexes = array(); 362 466 while ($row = $rs->FetchRow()) { 363 if ( !$primary &&$row[5]) continue;467 if ($primary && !$row[5]) continue; 364 468 365 469 $indexes[$row[0]]['unique'] = $row[6]; … … 386 490 order by constraint_name, referenced_table_name, keyno"; 387 491 388 $constraints = &$this->GetArray($sql);492 $constraints = $this->GetArray($sql); 389 493 390 494 $ADODB_FETCH_MODE = $save; … … 432 536 // "Stein-Aksel Basma" <basma@accelero.no> 433 537 // tested with MSSQL 2000 434 function &MetaPrimaryKeys($table)538 function MetaPrimaryKeys($table, $owner=false) 435 539 { 436 540 global $ADODB_FETCH_MODE; … … 457 561 458 562 459 function &MetaTables($ttype=false,$showSchema=false,$mask=false)563 function MetaTables($ttype=false,$showSchema=false,$mask=false) 460 564 { 461 565 if ($mask) { … … 464 568 $this->metaTablesSQL .= " AND name like $mask"; 465 569 } 466 $ret = &ADOConnection::MetaTables($ttype,$showSchema);570 $ret = ADOConnection::MetaTables($ttype,$showSchema); 467 571 468 572 if ($mask) { … … 504 608 } 505 609 506 // returns true or false 507 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename )610 // returns true or false, newconnect supported since php 5.1.0. 611 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$newconnect=false) 508 612 { 509 613 if (!function_exists('mssql_pconnect')) return null; 510 $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword );614 $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword,$newconnect); 511 615 if ($this->_connectionID === false) return false; 512 616 if ($argDatabasename) return $this->SelectDB($argDatabasename); … … 531 635 } 532 636 637 function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) 638 { 639 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); 640 } 641 533 642 function Prepare($sql) 534 643 { … … 539 648 $sql2 .= '@P'.($i-1) . $sqlarr[$i]; 540 649 } 541 return array($sql,$this->qstr($sql2),$max );542 } 543 544 function PrepareSP($sql )650 return array($sql,$this->qstr($sql2),$max,$sql2); 651 } 652 653 function PrepareSP($sql,$param=true) 545 654 { 546 655 if (!$this->_has_mssql_init) { … … 607 716 switch(gettype($var)) { 608 717 default: 609 case 'string': $type = SQL CHAR; break;718 case 'string': $type = SQLVARCHAR; break; 610 719 case 'double': $type = SQLFLT8; break; 611 720 case 'integer': $type = SQLINT4; break; … … 655 764 656 765 // returns query ID if successful, otherwise false 657 function _query($sql,$inputarr )766 function _query($sql,$inputarr=false) 658 767 { 659 768 $this->_errorMsg = false; … … 663 772 # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm 664 773 # works only with sql server 7 and newer 774 $getIdentity = false; 775 if (!is_array($sql) && preg_match('/^\\s*insert/i', $sql)) { 776 $getIdentity = true; 777 $sql .= (preg_match('/;\\s*$/i', $sql) ? ' ' : '; ') . $this->identitySQL; 778 } 665 779 if (!is_array($sql)) $sql = $this->Prepare($sql); 666 780 $params = ''; … … 702 816 if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>"); 703 817 $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID); 818 if ($getIdentity) { 819 $arr = @mssql_fetch_row($rez); 820 $this->lastInsID = isset($arr[0]) ? $arr[0] : false; 821 @mssql_data_seek($rez, 0); 822 } 704 823 705 824 } else if (is_array($sql)) { 706 825 # PrepareSP() 707 826 $rez = mssql_execute($sql[1]); 827 $this->lastInsID = false; 708 828 709 829 } else { 710 830 $rez = mssql_query($sql,$this->_connectionID); 831 $this->lastInsID = false; 711 832 } 712 833 return $rez; … … 723 844 724 845 // mssql uses a default date like Dec 30 2000 12:00AM 725 function UnixDate($v)846 static function UnixDate($v) 726 847 { 727 848 return ADORecordSet_array_mssql::UnixDate($v); 728 849 } 729 850 730 function UnixTimeStamp($v)851 static function UnixTimeStamp($v) 731 852 { 732 853 return ADORecordSet_array_mssql::UnixTimeStamp($v); … … 800 921 fetchField() is retrieved. */ 801 922 802 function &FetchField($fieldOffset = -1)923 function FetchField($fieldOffset = -1) 803 924 { 804 925 if ($fieldOffset != -1) { … … 850 971 if (ADODB_ASSOC_CASE == 0) { 851 972 foreach($this->fields as $k=>$v) { 852 $this->fields[strtolower($k)] = $v; 973 $kn = strtolower($k); 974 if ($kn <> $k) { 975 unset($this->fields[$k]); 976 $this->fields[$kn] = $v; 977 } 853 978 } 854 979 } else if (ADODB_ASSOC_CASE == 1) { 855 980 foreach($this->fields as $k=>$v) { 856 $this->fields[strtoupper($k)] = $v; 981 $kn = strtoupper($k); 982 if ($kn <> $k) { 983 unset($this->fields[$k]); 984 $this->fields[$kn] = $v; 985 } 857 986 } 858 987 } … … 895 1024 } else if (ADODB_ASSOC_CASE == 0) { 896 1025 foreach($this->fields as $k=>$v) { 897 $this->fields[strtolower($k)] = $v; 1026 $kn = strtolower($k); 1027 if ($kn <> $k) { 1028 unset($this->fields[$k]); 1029 $this->fields[$kn] = $v; 1030 } 898 1031 } 899 1032 } else if (ADODB_ASSOC_CASE == 1) { 900 1033 foreach($this->fields as $k=>$v) { 901 $this->fields[strtoupper($k)] = $v; 1034 $kn = strtoupper($k); 1035 if ($kn <> $k) { 1036 unset($this->fields[$k]); 1037 $this->fields[$kn] = $v; 1038 } 902 1039 } 903 1040 } … … 918 1055 } 919 1056 // mssql uses a default date like Dec 30 2000 12:00AM 920 function UnixDate($v)1057 static function UnixDate($v) 921 1058 { 922 1059 return ADORecordSet_array_mssql::UnixDate($v); 923 1060 } 924 1061 925 function UnixTimeStamp($v)1062 static function UnixTimeStamp($v) 926 1063 { 927 1064 return ADORecordSet_array_mssql::UnixTimeStamp($v); … … 938 1075 939 1076 // mssql uses a default date like Dec 30 2000 12:00AM 940 function UnixDate($v)1077 static function UnixDate($v) 941 1078 { 942 1079 … … 969 1106 } 970 1107 971 function UnixTimeStamp($v)1108 static function UnixTimeStamp($v) 972 1109 { 973 1110
Note: See TracChangeset
for help on using the changeset viewer.