| [ Index ] |
|
Code source de eGroupWare 1.2.106-2 |
1 <?php 2 /* 3 V4.65 22 July 2005 (c) 2000-2005 John Lim. 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 Sybase driver contributed by Toni (toni.tunkkari@finebyte.com) 12 13 - MSSQL date patch applied. 14 15 Date patch by Toni 15 Feb 2002 16 */ 17 18 // security - hide paths 19 if (!defined('ADODB_DIR')) die(); 20 21 class ADODB_sybase extends ADOConnection { 22 var $databaseType = "sybase"; 23 var $dataProvider = 'sybase'; 24 var $replaceQuote = "''"; // string to use to replace quotes 25 var $fmtDate = "'Y-m-d'"; 26 var $fmtTimeStamp = "'Y-m-d H:i:s'"; 27 var $hasInsertID = true; 28 var $hasAffectedRows = true; 29 var $metaTablesSQL="select name from sysobjects where type='U' or type='V'"; 30 // see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 31 var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'"; 32 /* 33 "select c.name,t.name,c.length from 34 syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id 35 where o.name='%s'"; 36 */ 37 var $concat_operator = '+'; 38 var $arrayClass = 'ADORecordSet_array_sybase'; 39 var $sysDate = 'GetDate()'; 40 var $leftOuter = '*='; 41 var $rightOuter = '=*'; 42 43 function ADODB_sybase() 44 { 45 } 46 47 // might require begintrans -- committrans 48 function _insertid() 49 { 50 return $this->GetOne('select @@identity'); 51 } 52 // might require begintrans -- committrans 53 function _affectedrows() 54 { 55 return $this->GetOne('select @@rowcount'); 56 } 57 58 59 function BeginTrans() 60 { 61 62 if ($this->transOff) return true; 63 $this->transCnt += 1; 64 65 $this->Execute('BEGIN TRAN'); 66 return true; 67 } 68 69 function CommitTrans($ok=true) 70 { 71 if ($this->transOff) return true; 72 73 if (!$ok) return $this->RollbackTrans(); 74 75 $this->transCnt -= 1; 76 $this->Execute('COMMIT TRAN'); 77 return true; 78 } 79 80 function RollbackTrans() 81 { 82 if ($this->transOff) return true; 83 $this->transCnt -= 1; 84 $this->Execute('ROLLBACK TRAN'); 85 return true; 86 } 87 88 // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4 89 function RowLock($tables,$where,$flds='top 1 null as ignore') 90 { 91 if (!$this->_hastrans) $this->BeginTrans(); 92 $tables = str_replace(',',' HOLDLOCK,',$tables); 93 return $this->GetOne("select $flds from $tables HOLDLOCK where $where"); 94 95 } 96 97 function SelectDB($dbName) 98 { 99 $this->databaseName = $dbName; 100 if ($this->_connectionID) { 101 return @sybase_select_db($dbName); 102 } 103 else return false; 104 } 105 106 /* Returns: the last error message from previous database operation 107 Note: This function is NOT available for Microsoft SQL Server. */ 108 109 110 function ErrorMsg() 111 { 112 if ($this->_logsql) return $this->_errorMsg; 113 if (function_exists('sybase_get_last_message')) 114 $this->_errorMsg = sybase_get_last_message(); 115 else 116 $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform'; 117 return $this->_errorMsg; 118 } 119 120 // returns true or false 121 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) 122 { 123 if (!function_exists('sybase_connect')) return null; 124 125 $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); 126 if ($this->_connectionID === false) return false; 127 if ($argDatabasename) return $this->SelectDB($argDatabasename); 128 return true; 129 } 130 // returns true or false 131 function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) 132 { 133 if (!function_exists('sybase_connect')) return null; 134 135 $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword); 136 if ($this->_connectionID === false) return false; 137 if ($argDatabasename) return $this->SelectDB($argDatabasename); 138 return true; 139 } 140 141 // returns query ID if successful, otherwise false 142 function _query($sql,$inputarr) 143 { 144 global $ADODB_COUNTRECS; 145 146 if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300) 147 return sybase_unbuffered_query($sql,$this->_connectionID); 148 else 149 return sybase_query($sql,$this->_connectionID); 150 } 151 152 // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12 153 function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) 154 { 155 if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset 156 $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); 157 return $rs; 158 } 159 $cnt = ($nrows >= 0) ? $nrows : 999999999; 160 if ($offset > 0 && $cnt) $cnt += $offset; 161 162 $this->Execute("set rowcount $cnt"); 163 $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0); 164 $this->Execute("set rowcount 0"); 165 166 return $rs; 167 } 168 169 // returns true or false 170 function _close() 171 { 172 return @sybase_close($this->_connectionID); 173 } 174 175 function UnixDate($v) 176 { 177 return ADORecordSet_array_sybase::UnixDate($v); 178 } 179 180 function UnixTimeStamp($v) 181 { 182 return ADORecordSet_array_sybase::UnixTimeStamp($v); 183 } 184 185 186 187 # Added 2003-10-05 by Chris Phillipson 188 # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25 189 # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version 190 // Format date column in sql string given an input format that understands Y M D 191 function SQLDate($fmt, $col=false) 192 { 193 if (!$col) $col = $this->sysTimeStamp; 194 $s = ''; 195 196 $len = strlen($fmt); 197 for ($i=0; $i < $len; $i++) { 198 if ($s) $s .= '+'; 199 $ch = $fmt[$i]; 200 switch($ch) { 201 case 'Y': 202 case 'y': 203 $s .= "datename(yy,$col)"; 204 break; 205 case 'M': 206 $s .= "convert(char(3),$col,0)"; 207 break; 208 case 'm': 209 $s .= "replace(str(month($col),2),' ','0')"; 210 break; 211 case 'Q': 212 case 'q': 213 $s .= "datename(qq,$col)"; 214 break; 215 case 'D': 216 case 'd': 217 $s .= "replace(str(datepart(dd,$col),2),' ','0')"; 218 break; 219 case 'h': 220 $s .= "substring(convert(char(14),$col,0),13,2)"; 221 break; 222 223 case 'H': 224 $s .= "replace(str(datepart(hh,$col),2),' ','0')"; 225 break; 226 227 case 'i': 228 $s .= "replace(str(datepart(mi,$col),2),' ','0')"; 229 break; 230 case 's': 231 $s .= "replace(str(datepart(ss,$col),2),' ','0')"; 232 break; 233 case 'a': 234 case 'A': 235 $s .= "substring(convert(char(19),$col,0),18,2)"; 236 break; 237 238 default: 239 if ($ch == '\\') { 240 $i++; 241 $ch = substr($fmt,$i,1); 242 } 243 $s .= $this->qstr($ch); 244 break; 245 } 246 } 247 return $s; 248 } 249 250 # Added 2003-10-07 by Chris Phillipson 251 # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 252 # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version 253 function MetaPrimaryKeys($table) 254 { 255 $sql = "SELECT c.column_name " . 256 "FROM syscolumn c, systable t " . 257 "WHERE t.table_name='$table' AND c.table_id=t.table_id " . 258 "AND t.table_type='BASE' " . 259 "AND c.pkey = 'Y' " . 260 "ORDER BY c.column_id"; 261 262 $a = $this->GetCol($sql); 263 if ($a && sizeof($a)>0) return $a; 264 return false; 265 } 266 } 267 268 /*-------------------------------------------------------------------------------------- 269 Class Name: Recordset 270 --------------------------------------------------------------------------------------*/ 271 global $ADODB_sybase_mths; 272 $ADODB_sybase_mths = array( 273 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, 274 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); 275 276 class ADORecordset_sybase extends ADORecordSet { 277 278 var $databaseType = "sybase"; 279 var $canSeek = true; 280 // _mths works only in non-localised system 281 var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); 282 283 function ADORecordset_sybase($id,$mode=false) 284 { 285 if ($mode === false) { 286 global $ADODB_FETCH_MODE; 287 $mode = $ADODB_FETCH_MODE; 288 } 289 if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC; 290 else $this->fetchMode = $mode; 291 $this->ADORecordSet($id,$mode); 292 } 293 294 /* Returns: an object containing field information. 295 Get column information in the Recordset object. fetchField() can be used in order to obtain information about 296 fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by 297 fetchField() is retrieved. */ 298 function &FetchField($fieldOffset = -1) 299 { 300 if ($fieldOffset != -1) { 301 $o = @sybase_fetch_field($this->_queryID, $fieldOffset); 302 } 303 else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ 304 $o = @sybase_fetch_field($this->_queryID); 305 } 306 // older versions of PHP did not support type, only numeric 307 if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar'; 308 return $o; 309 } 310 311 function _initrs() 312 { 313 global $ADODB_COUNTRECS; 314 $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1; 315 $this->_numOfFields = @sybase_num_fields($this->_queryID); 316 } 317 318 function _seek($row) 319 { 320 return @sybase_data_seek($this->_queryID, $row); 321 } 322 323 function _fetch($ignore_fields=false) 324 { 325 if ($this->fetchMode == ADODB_FETCH_NUM) { 326 $this->fields = @sybase_fetch_row($this->_queryID); 327 } else if ($this->fetchMode == ADODB_FETCH_ASSOC) { 328 $this->fields = @sybase_fetch_row($this->_queryID); 329 if (is_array($this->fields)) { 330 $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); 331 return true; 332 } 333 return false; 334 } else { 335 $this->fields = @sybase_fetch_array($this->_queryID); 336 } 337 if ( is_array($this->fields)) { 338 return true; 339 } 340 341 return false; 342 } 343 344 /* close() only needs to be called if you are worried about using too much memory while your script 345 is running. All associated result memory for the specified result identifier will automatically be freed. */ 346 function _close() { 347 return @sybase_free_result($this->_queryID); 348 } 349 350 // sybase/mssql uses a default date like Dec 30 2000 12:00AM 351 function UnixDate($v) 352 { 353 return ADORecordSet_array_sybase::UnixDate($v); 354 } 355 356 function UnixTimeStamp($v) 357 { 358 return ADORecordSet_array_sybase::UnixTimeStamp($v); 359 } 360 } 361 362 class ADORecordSet_array_sybase extends ADORecordSet_array { 363 function ADORecordSet_array_sybase($id=-1) 364 { 365 $this->ADORecordSet_array($id); 366 } 367 368 // sybase/mssql uses a default date like Dec 30 2000 12:00AM 369 function UnixDate($v) 370 { 371 global $ADODB_sybase_mths; 372 373 //Dec 30 2000 12:00AM 374 if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})" 375 ,$v, $rr)) return parent::UnixDate($v); 376 377 if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; 378 379 $themth = substr(strtoupper($rr[1]),0,3); 380 $themth = $ADODB_sybase_mths[$themth]; 381 if ($themth <= 0) return false; 382 // h-m-s-MM-DD-YY 383 return mktime(0,0,0,$themth,$rr[2],$rr[3]); 384 } 385 386 function UnixTimeStamp($v) 387 { 388 global $ADODB_sybase_mths; 389 //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com 390 //Changed [0-9] to [0-9 ] in day conversion 391 if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})" 392 ,$v, $rr)) return parent::UnixTimeStamp($v); 393 if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; 394 395 $themth = substr(strtoupper($rr[1]),0,3); 396 $themth = $ADODB_sybase_mths[$themth]; 397 if ($themth <= 0) return false; 398 399 switch (strtoupper($rr[6])) { 400 case 'P': 401 if ($rr[4]<12) $rr[4] += 12; 402 break; 403 case 'A': 404 if ($rr[4]==12) $rr[4] = 0; 405 break; 406 default: 407 break; 408 } 409 // h-m-s-MM-DD-YY 410 return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]); 411 } 412 } 413 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
| Généré le : Sun Feb 25 17:20:01 2007 | par Balluche grâce à PHPXref 0.7 |