"TYPO3 4.0.1: typo3_src-4.0.1/typo3/sysext/adodb/adodb/drivers/adodb-sybase.inc.php Source File", "datetime" => "Sat Dec 2 19:22:26 2006", "date" => "2 Dec 2006", "doxygenversion" => "1.4.6", "projectname" => "TYPO3 4.0.1", "projectnumber" => "4.0.1" ); get_header($doxygen_vars); ?>

adodb-sybase.inc.php

00001 <?php
00002 /* 
00003 V4.90 8 June 2006  (c) 2000-2006 John Lim. All rights reserved.
00004   Released under both BSD license and Lesser GPL library license. 
00005   Whenever there is any discrepancy between the two licenses, 
00006   the BSD license will take precedence. 
00007   Set tabs to 4 for best viewing.
00008   
00009   Latest version is available at http://adodb.sourceforge.net
00010   
00011   Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
00012   
00013   - MSSQL date patch applied.
00014   
00015   Date patch by Toni 15 Feb 2002
00016 */
00017  
00018  // security - hide paths
00019 if (!defined('ADODB_DIR')) die();
00020 
00021 class ADODB_sybase extends ADOConnection {
00022         var $databaseType = "sybase";   
00023         var $dataProvider = 'sybase';
00024         var $replaceQuote = "''"; // string to use to replace quotes
00025         var $fmtDate = "'Y-m-d'";
00026         var $fmtTimeStamp = "'Y-m-d H:i:s'";
00027         var $hasInsertID = true;
00028         var $hasAffectedRows = true;
00029         var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
00030         // see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
00031         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'";
00032         /*
00033         "select c.name,t.name,c.length from 
00034         syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id 
00035         where o.name='%s'";
00036         */
00037         var $concat_operator = '+'; 
00038         var $arrayClass = 'ADORecordSet_array_sybase';
00039         var $sysDate = 'GetDate()';
00040         var $leftOuter = '*=';
00041         var $rightOuter = '=*';
00042         
00043         function ADODB_sybase() 
00044         {                       
00045         }
00046  
00047         // might require begintrans -- committrans
00048         function _insertid()
00049         {
00050                 return $this->GetOne('select @@identity');
00051         }
00052           // might require begintrans -- committrans
00053         function _affectedrows()
00054         {
00055            return $this->GetOne('select @@rowcount');
00056         }
00057 
00058                           
00059         function BeginTrans()
00060         {       
00061         
00062                 if ($this->transOff) return true;
00063                 $this->transCnt += 1;
00064                    
00065                 $this->Execute('BEGIN TRAN');
00066                 return true;
00067         }
00068         
00069         function CommitTrans($ok=true) 
00070         { 
00071                 if ($this->transOff) return true;
00072                 
00073                 if (!$ok) return $this->RollbackTrans();
00074         
00075                 $this->transCnt -= 1;
00076                 $this->Execute('COMMIT TRAN');
00077                 return true;
00078         }
00079         
00080         function RollbackTrans()
00081         {
00082                 if ($this->transOff) return true;
00083                 $this->transCnt -= 1;
00084                 $this->Execute('ROLLBACK TRAN');
00085                 return true;
00086         }
00087         
00088         // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
00089         function RowLock($tables,$where,$flds='top 1 null as ignore') 
00090         {
00091                 if (!$this->_hastrans) $this->BeginTrans();
00092                 $tables = str_replace(',',' HOLDLOCK,',$tables);
00093                 return $this->GetOne("select $flds from $tables HOLDLOCK where $where");
00094                 
00095         }       
00096                 
00097         function SelectDB($dbName) 
00098         {
00099                 $this->database = $dbName;
00100                 $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
00101                 if ($this->_connectionID) {
00102                         return @sybase_select_db($dbName);              
00103                 }
00104                 else return false;      
00105         }
00106 
00107         /*      Returns: the last error message from previous database operation
00108                 Note: This function is NOT available for Microsoft SQL Server.  */      
00109 
00110         
00111         function ErrorMsg()
00112         {
00113                 if ($this->_logsql) return $this->_errorMsg;
00114                 if (function_exists('sybase_get_last_message'))
00115                         $this->_errorMsg = sybase_get_last_message();
00116                 else
00117                         $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
00118                 return $this->_errorMsg;
00119         }
00120 
00121         // returns true or false
00122         function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
00123         {
00124                 if (!function_exists('sybase_connect')) return null;
00125                 
00126                 $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
00127                 if ($this->_connectionID === false) return false;
00128                 if ($argDatabasename) return $this->SelectDB($argDatabasename);
00129                 return true;    
00130         }
00131         // returns true or false
00132         function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
00133         {
00134                 if (!function_exists('sybase_connect')) return null;
00135                 
00136                 $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
00137                 if ($this->_connectionID === false) return false;
00138                 if ($argDatabasename) return $this->SelectDB($argDatabasename);
00139                 return true;    
00140         }
00141         
00142         // returns query ID if successful, otherwise false
00143         function _query($sql,$inputarr)
00144         {
00145         global $ADODB_COUNTRECS;
00146         
00147                 if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
00148                         return sybase_unbuffered_query($sql,$this->_connectionID);
00149                 else
00150                         return sybase_query($sql,$this->_connectionID);
00151         }
00152         
00153         // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
00154         function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) 
00155         {
00156                 if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
00157                         $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
00158                         return $rs;
00159                 }
00160                 
00161                 $nrows = (integer) $nrows;
00162                 $offset = (integer) $offset;
00163                 
00164                 $cnt = ($nrows >= 0) ? $nrows : 999999999;
00165                 if ($offset > 0 && $cnt) $cnt += $offset;
00166                 
00167                 $this->Execute("set rowcount $cnt"); 
00168                 $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
00169                 $this->Execute("set rowcount 0");
00170                 
00171                 return $rs;
00172         }
00173 
00174         // returns true or false
00175         function _close()
00176         { 
00177                 return @sybase_close($this->_connectionID);
00178         }
00179         
00180         function UnixDate($v)
00181         {
00182                 return ADORecordSet_array_sybase::UnixDate($v);
00183         }
00184         
00185         function UnixTimeStamp($v)
00186         {
00187                 return ADORecordSet_array_sybase::UnixTimeStamp($v);
00188         }       
00189         
00190         
00191 
00192         # Added 2003-10-05 by Chris Phillipson
00193     # 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
00194     # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
00195     // Format date column in sql string given an input format that understands Y M D
00196     function SQLDate($fmt, $col=false)
00197     {
00198         if (!$col) $col = $this->sysTimeStamp;
00199         $s = '';
00200 
00201         $len = strlen($fmt);
00202         for ($i=0; $i < $len; $i++) {
00203             if ($s) $s .= '+';
00204             $ch = $fmt[$i];
00205             switch($ch) {
00206             case 'Y':
00207             case 'y':
00208                 $s .= "datename(yy,$col)";
00209                 break;
00210             case 'M':
00211                 $s .= "convert(char(3),$col,0)";
00212                 break;
00213             case 'm':
00214                 $s .= "replace(str(month($col),2),' ','0')";
00215                 break;
00216             case 'Q':
00217             case 'q':
00218                 $s .= "datename(qq,$col)";
00219                 break;
00220             case 'D':
00221             case 'd':
00222                 $s .= "replace(str(datepart(dd,$col),2),' ','0')";
00223                 break;
00224             case 'h':
00225                 $s .= "substring(convert(char(14),$col,0),13,2)";
00226                 break;
00227 
00228             case 'H':
00229                 $s .= "replace(str(datepart(hh,$col),2),' ','0')";
00230                 break;
00231 
00232             case 'i':
00233                 $s .= "replace(str(datepart(mi,$col),2),' ','0')";
00234                 break;
00235             case 's':
00236                 $s .= "replace(str(datepart(ss,$col),2),' ','0')";
00237                 break;
00238             case 'a':
00239             case 'A':
00240                 $s .= "substring(convert(char(19),$col,0),18,2)";
00241                 break;
00242 
00243             default:
00244                 if ($ch == '\\') {
00245                     $i++;
00246                     $ch = substr($fmt,$i,1);
00247                 }
00248                 $s .= $this->qstr($ch);
00249                 break;
00250             }
00251         }
00252         return $s;
00253     }
00254         
00255         # Added 2003-10-07 by Chris Phillipson
00256     # 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
00257     # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
00258     function MetaPrimaryKeys($table)
00259     {
00260         $sql = "SELECT c.column_name " .
00261                "FROM syscolumn c, systable t " .
00262                "WHERE t.table_name='$table' AND c.table_id=t.table_id " .
00263                "AND t.table_type='BASE' " .
00264                "AND c.pkey = 'Y' " .
00265                "ORDER BY c.column_id";
00266 
00267         $a = $this->GetCol($sql);
00268         if ($a && sizeof($a)>0) return $a;
00269         return false;
00270     }
00271 }
00272         
00273 /*--------------------------------------------------------------------------------------
00274          Class Name: Recordset
00275 --------------------------------------------------------------------------------------*/
00276 global $ADODB_sybase_mths;
00277 $ADODB_sybase_mths = array(
00278         'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
00279         'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
00280 
00281 class ADORecordset_sybase extends ADORecordSet {        
00282 
00283         var $databaseType = "sybase";
00284         var $canSeek = true;
00285         // _mths works only in non-localised system
00286         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);    
00287 
00288         function ADORecordset_sybase($id,$mode=false)
00289         {
00290                 if ($mode === false) { 
00291                         global $ADODB_FETCH_MODE;
00292                         $mode = $ADODB_FETCH_MODE;
00293                 }
00294                 if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
00295                 else $this->fetchMode = $mode;
00296                 $this->ADORecordSet($id,$mode);
00297         }
00298         
00299         /*      Returns: an object containing field information. 
00300                 Get column information in the Recordset object. fetchField() can be used in order to obtain information about
00301                 fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
00302                 fetchField() is retrieved.      */
00303         function &FetchField($fieldOffset = -1) 
00304         {
00305                 if ($fieldOffset != -1) {
00306                         $o = @sybase_fetch_field($this->_queryID, $fieldOffset);
00307                 }
00308                 else if ($fieldOffset == -1) {  /*      The $fieldOffset argument is not provided thus its -1   */
00309                         $o = @sybase_fetch_field($this->_queryID);
00310                 }
00311                 // older versions of PHP did not support type, only numeric
00312                 if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
00313                 return $o;
00314         }
00315         
00316         function _initrs()
00317         {
00318         global $ADODB_COUNTRECS;
00319                 $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
00320                 $this->_numOfFields = @sybase_num_fields($this->_queryID);
00321         }
00322         
00323         function _seek($row) 
00324         {
00325                 return @sybase_data_seek($this->_queryID, $row);
00326         }               
00327 
00328         function _fetch($ignore_fields=false) 
00329         {
00330                 if ($this->fetchMode == ADODB_FETCH_NUM) {
00331                         $this->fields = @sybase_fetch_row($this->_queryID);
00332                 } else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
00333                         $this->fields = @sybase_fetch_row($this->_queryID);
00334                         if (is_array($this->fields)) {
00335                                 $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
00336                                 return true;
00337                         }
00338                         return false;
00339                 }  else {
00340                         $this->fields = @sybase_fetch_array($this->_queryID);
00341                 }
00342                 if ( is_array($this->fields)) {
00343                         return true;
00344                 }
00345 
00346                 return false;
00347         }
00348         
00349         /*      close() only needs to be called if you are worried about using too much memory while your script
00350                 is running. All associated result memory for the specified result identifier will automatically be freed.       */
00351         function _close() {
00352                 return @sybase_free_result($this->_queryID);            
00353         }
00354         
00355         // sybase/mssql uses a default date like Dec 30 2000 12:00AM
00356         function UnixDate($v)
00357         {
00358                 return ADORecordSet_array_sybase::UnixDate($v);
00359         }
00360         
00361         function UnixTimeStamp($v)
00362         {
00363                 return ADORecordSet_array_sybase::UnixTimeStamp($v);
00364         }
00365 }
00366 
00367 class ADORecordSet_array_sybase extends ADORecordSet_array {
00368         function ADORecordSet_array_sybase($id=-1)
00369         {
00370                 $this->ADORecordSet_array($id);
00371         }
00372         
00373                 // sybase/mssql uses a default date like Dec 30 2000 12:00AM
00374         function UnixDate($v)
00375         {
00376         global $ADODB_sybase_mths;
00377         
00378                 //Dec 30 2000 12:00AM
00379                 if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})"
00380                         ,$v, $rr)) return parent::UnixDate($v);
00381                         
00382                 if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
00383                 
00384                 $themth = substr(strtoupper($rr[1]),0,3);
00385                 $themth = $ADODB_sybase_mths[$themth];
00386                 if ($themth <= 0) return false;
00387                 // h-m-s-MM-DD-YY
00388                 return  mktime(0,0,0,$themth,$rr[2],$rr[3]);
00389         }
00390         
00391         function UnixTimeStamp($v)
00392         {
00393         global $ADODB_sybase_mths;
00394                 //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
00395                 //Changed [0-9] to [0-9 ] in day conversion
00396                 if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})"
00397                         ,$v, $rr)) return parent::UnixTimeStamp($v);
00398                 if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
00399                 
00400                 $themth = substr(strtoupper($rr[1]),0,3);
00401                 $themth = $ADODB_sybase_mths[$themth];
00402                 if ($themth <= 0) return false;
00403                 
00404                 switch (strtoupper($rr[6])) {
00405                 case 'P':
00406                         if ($rr[4]<12) $rr[4] += 12;
00407                         break;
00408                 case 'A':
00409                         if ($rr[4]==12) $rr[4] = 0;
00410                         break;
00411                 default:
00412                         break;
00413                 }
00414                 // h-m-s-MM-DD-YY
00415                 return  mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
00416         }
00417 }
00418 ?>