[ Index ]
 

Code source de eGroupWare 1.2.106-2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/phpgwapi/inc/adodb/drivers/ -> adodb-sybase.inc.php (source)

   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  ?>


Généré le : Sun Feb 25 17:20:01 2007 par Balluche grâce à PHPXref 0.7