You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							413 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							413 lines
						
					
					
						
							12 KiB
						
					
					
				
								<?php
							 | 
						|
								/* 
							 | 
						|
								V4.55 3 Jan 2005  (c) 2000-2005 John Lim. All rights reserved.
							 | 
						|
								  Released under both BSD license and Lesser GPL library license. 
							 | 
						|
								  Whenever there is any discrepancy between the two licenses, 
							 | 
						|
								  the BSD license will take precedence. 
							 | 
						|
								  Set tabs to 4 for best viewing.
							 | 
						|
								  
							 | 
						|
								  Latest version is available at http://adodb.sourceforge.net
							 | 
						|
								  
							 | 
						|
								  Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
							 | 
						|
								  
							 | 
						|
								  - MSSQL date patch applied.
							 | 
						|
								  
							 | 
						|
								  Date patch by Toni 15 Feb 2002
							 | 
						|
								*/
							 | 
						|
								 
							 | 
						|
								 // security - hide paths
							 | 
						|
								if (!defined('ADODB_DIR')) die();
							 | 
						|
								
							 | 
						|
								class ADODB_sybase extends ADOConnection {
							 | 
						|
									var $databaseType = "sybase";	
							 | 
						|
									var $dataProvider = 'sybase';
							 | 
						|
									var $replaceQuote = "''"; // string to use to replace quotes
							 | 
						|
									var $fmtDate = "'Y-m-d'";
							 | 
						|
									var $fmtTimeStamp = "'Y-m-d H:i:s'";
							 | 
						|
									var $hasInsertID = true;
							 | 
						|
									var $hasAffectedRows = true;
							 | 
						|
								  	var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
							 | 
						|
									// see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
							 | 
						|
									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'";
							 | 
						|
									/*
							 | 
						|
									"select c.name,t.name,c.length from 
							 | 
						|
									syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id 
							 | 
						|
									where o.name='%s'";
							 | 
						|
									*/
							 | 
						|
									var $concat_operator = '+'; 
							 | 
						|
									var $arrayClass = 'ADORecordSet_array_sybase';
							 | 
						|
									var $sysDate = 'GetDate()';
							 | 
						|
									var $leftOuter = '*=';
							 | 
						|
									var $rightOuter = '=*';
							 | 
						|
									
							 | 
						|
									function ADODB_sybase() 
							 | 
						|
									{			
							 | 
						|
									}
							 | 
						|
								 
							 | 
						|
									// might require begintrans -- committrans
							 | 
						|
									function _insertid()
							 | 
						|
									{
							 | 
						|
										return $this->GetOne('select @@identity');
							 | 
						|
									}
							 | 
						|
									  // might require begintrans -- committrans
							 | 
						|
									function _affectedrows()
							 | 
						|
									{
							 | 
						|
									   return $this->GetOne('select @@rowcount');
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
											  
							 | 
						|
									function BeginTrans()
							 | 
						|
									{	
							 | 
						|
									
							 | 
						|
										if ($this->transOff) return true;
							 | 
						|
										$this->transCnt += 1;
							 | 
						|
										   
							 | 
						|
										$this->Execute('BEGIN TRAN');
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function CommitTrans($ok=true) 
							 | 
						|
									{ 
							 | 
						|
										if ($this->transOff) return true;
							 | 
						|
										
							 | 
						|
										if (!$ok) return $this->RollbackTrans();
							 | 
						|
									
							 | 
						|
										$this->transCnt -= 1;
							 | 
						|
										$this->Execute('COMMIT TRAN');
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function RollbackTrans()
							 | 
						|
									{
							 | 
						|
										if ($this->transOff) return true;
							 | 
						|
										$this->transCnt -= 1;
							 | 
						|
										$this->Execute('ROLLBACK TRAN');
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									// http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
							 | 
						|
									function RowLock($tables,$where) 
							 | 
						|
									{
							 | 
						|
										if (!$this->_hastrans) $this->BeginTrans();
							 | 
						|
										$tables = str_replace(',',' HOLDLOCK,',$tables);
							 | 
						|
										return $this->GetOne("select top 1 null as ignore from $tables HOLDLOCK where $where");
							 | 
						|
										
							 | 
						|
									}	
							 | 
						|
										
							 | 
						|
									function SelectDB($dbName) 
							 | 
						|
									{
							 | 
						|
										$this->databaseName = $dbName;
							 | 
						|
										if ($this->_connectionID) {
							 | 
						|
											return @sybase_select_db($dbName);		
							 | 
						|
										}
							 | 
						|
										else return false;	
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									/*	Returns: the last error message from previous database operation
							 | 
						|
										Note: This function is NOT available for Microsoft SQL Server.	*/	
							 | 
						|
								
							 | 
						|
									
							 | 
						|
									function ErrorMsg()
							 | 
						|
									{
							 | 
						|
										if ($this->_logsql) return $this->_errorMsg;
							 | 
						|
										if (function_exists('sybase_get_last_message'))
							 | 
						|
											$this->_errorMsg = sybase_get_last_message();
							 | 
						|
										else
							 | 
						|
											$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
							 | 
						|
										return $this->_errorMsg;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// returns true or false
							 | 
						|
									function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
							 | 
						|
									{
							 | 
						|
										if (!function_exists('sybase_connect')) return null;
							 | 
						|
										
							 | 
						|
										$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
							 | 
						|
										if ($this->_connectionID === false) return false;
							 | 
						|
										if ($argDatabasename) return $this->SelectDB($argDatabasename);
							 | 
						|
										return true;	
							 | 
						|
									}
							 | 
						|
									// returns true or false
							 | 
						|
									function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
							 | 
						|
									{
							 | 
						|
										if (!function_exists('sybase_connect')) return null;
							 | 
						|
										
							 | 
						|
										$this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
							 | 
						|
										if ($this->_connectionID === false) return false;
							 | 
						|
										if ($argDatabasename) return $this->SelectDB($argDatabasename);
							 | 
						|
										return true;	
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									// returns query ID if successful, otherwise false
							 | 
						|
									function _query($sql,$inputarr)
							 | 
						|
									{
							 | 
						|
									global $ADODB_COUNTRECS;
							 | 
						|
									
							 | 
						|
										if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
							 | 
						|
											return sybase_unbuffered_query($sql,$this->_connectionID);
							 | 
						|
										else
							 | 
						|
											return sybase_query($sql,$this->_connectionID);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									// See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
							 | 
						|
									function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) 
							 | 
						|
									{
							 | 
						|
										if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
							 | 
						|
											$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
							 | 
						|
											return $rs;
							 | 
						|
										}
							 | 
						|
										$cnt = ($nrows >= 0) ? $nrows : 999999999;
							 | 
						|
										if ($offset > 0 && $cnt) $cnt += $offset;
							 | 
						|
										
							 | 
						|
										$this->Execute("set rowcount $cnt"); 
							 | 
						|
										$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
							 | 
						|
										$this->Execute("set rowcount 0");
							 | 
						|
										
							 | 
						|
										return $rs;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// returns true or false
							 | 
						|
									function _close()
							 | 
						|
									{ 
							 | 
						|
										return @sybase_close($this->_connectionID);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function UnixDate($v)
							 | 
						|
									{
							 | 
						|
										return ADORecordSet_array_sybase::UnixDate($v);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function UnixTimeStamp($v)
							 | 
						|
									{
							 | 
						|
										return ADORecordSet_array_sybase::UnixTimeStamp($v);
							 | 
						|
									}	
							 | 
						|
									
							 | 
						|
									
							 | 
						|
								
							 | 
						|
									# Added 2003-10-05 by Chris Phillipson
							 | 
						|
								    # 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
							 | 
						|
								    # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
							 | 
						|
								    // Format date column in sql string given an input format that understands Y M D
							 | 
						|
								    function SQLDate($fmt, $col=false)
							 | 
						|
								    {
							 | 
						|
								        if (!$col) $col = $this->sysTimeStamp;
							 | 
						|
								        $s = '';
							 | 
						|
								
							 | 
						|
								        $len = strlen($fmt);
							 | 
						|
								        for ($i=0; $i < $len; $i++) {
							 | 
						|
								            if ($s) $s .= '+';
							 | 
						|
								            $ch = $fmt[$i];
							 | 
						|
								            switch($ch) {
							 | 
						|
								            case 'Y':
							 | 
						|
								            case 'y':
							 | 
						|
								                $s .= "datename(yy,$col)";
							 | 
						|
								                break;
							 | 
						|
								            case 'M':
							 | 
						|
								                $s .= "convert(char(3),$col,0)";
							 | 
						|
								                break;
							 | 
						|
								            case 'm':
							 | 
						|
								                $s .= "replace(str(month($col),2),' ','0')";
							 | 
						|
								                break;
							 | 
						|
								            case 'Q':
							 | 
						|
								            case 'q':
							 | 
						|
								                $s .= "datename(qq,$col)";
							 | 
						|
								                break;
							 | 
						|
								            case 'D':
							 | 
						|
								            case 'd':
							 | 
						|
								                $s .= "replace(str(datepart(dd,$col),2),' ','0')";
							 | 
						|
								                break;
							 | 
						|
								            case 'h':
							 | 
						|
								                $s .= "substring(convert(char(14),$col,0),13,2)";
							 | 
						|
								                break;
							 | 
						|
								
							 | 
						|
								            case 'H':
							 | 
						|
								                $s .= "replace(str(datepart(hh,$col),2),' ','0')";
							 | 
						|
								                break;
							 | 
						|
								
							 | 
						|
								            case 'i':
							 | 
						|
								                $s .= "replace(str(datepart(mi,$col),2),' ','0')";
							 | 
						|
								                break;
							 | 
						|
								            case 's':
							 | 
						|
								                $s .= "replace(str(datepart(ss,$col),2),' ','0')";
							 | 
						|
								                break;
							 | 
						|
								            case 'a':
							 | 
						|
								            case 'A':
							 | 
						|
								                $s .= "substring(convert(char(19),$col,0),18,2)";
							 | 
						|
								                break;
							 | 
						|
								
							 | 
						|
								            default:
							 | 
						|
								                if ($ch == '\\') {
							 | 
						|
								                    $i++;
							 | 
						|
								                    $ch = substr($fmt,$i,1);
							 | 
						|
								                }
							 | 
						|
								                $s .= $this->qstr($ch);
							 | 
						|
								                break;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        return $s;
							 | 
						|
								    }
							 | 
						|
									
							 | 
						|
									# Added 2003-10-07 by Chris Phillipson
							 | 
						|
								    # 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
							 | 
						|
								    # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
							 | 
						|
								    function MetaPrimaryKeys($table)
							 | 
						|
								    {
							 | 
						|
								        $sql = "SELECT c.column_name " .
							 | 
						|
								               "FROM syscolumn c, systable t " .
							 | 
						|
								               "WHERE t.table_name='$table' AND c.table_id=t.table_id " .
							 | 
						|
								               "AND t.table_type='BASE' " .
							 | 
						|
								               "AND c.pkey = 'Y' " .
							 | 
						|
								               "ORDER BY c.column_id";
							 | 
						|
								
							 | 
						|
								        $a = $this->GetCol($sql);
							 | 
						|
								        if ($a && sizeof($a)>0) return $a;
							 | 
						|
								        return false;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
									
							 | 
						|
								/*--------------------------------------------------------------------------------------
							 | 
						|
									 Class Name: Recordset
							 | 
						|
								--------------------------------------------------------------------------------------*/
							 | 
						|
								global $ADODB_sybase_mths;
							 | 
						|
								$ADODB_sybase_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);
							 | 
						|
								
							 | 
						|
								class ADORecordset_sybase extends ADORecordSet {	
							 | 
						|
								
							 | 
						|
									var $databaseType = "sybase";
							 | 
						|
									var $canSeek = true;
							 | 
						|
									// _mths works only in non-localised system
							 | 
						|
									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);	
							 | 
						|
								
							 | 
						|
									function ADORecordset_sybase($id,$mode=false)
							 | 
						|
									{
							 | 
						|
										if ($mode === false) { 
							 | 
						|
											global $ADODB_FETCH_MODE;
							 | 
						|
											$mode = $ADODB_FETCH_MODE;
							 | 
						|
										}
							 | 
						|
										if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
							 | 
						|
										else $this->fetchMode = $mode;
							 | 
						|
										return $this->ADORecordSet($id,$mode);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									/*	Returns: an object containing field information. 
							 | 
						|
										Get column information in the Recordset object. fetchField() can be used in order to obtain information about
							 | 
						|
										fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
							 | 
						|
										fetchField() is retrieved.	*/
							 | 
						|
									function &FetchField($fieldOffset = -1) 
							 | 
						|
									{
							 | 
						|
										if ($fieldOffset != -1) {
							 | 
						|
											$o = @sybase_fetch_field($this->_queryID, $fieldOffset);
							 | 
						|
										}
							 | 
						|
										else if ($fieldOffset == -1) {	/*	The $fieldOffset argument is not provided thus its -1 	*/
							 | 
						|
											$o = @sybase_fetch_field($this->_queryID);
							 | 
						|
										}
							 | 
						|
										// older versions of PHP did not support type, only numeric
							 | 
						|
										if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
							 | 
						|
										return $o;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function _initrs()
							 | 
						|
									{
							 | 
						|
									global $ADODB_COUNTRECS;
							 | 
						|
										$this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
							 | 
						|
										$this->_numOfFields = @sybase_num_fields($this->_queryID);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function _seek($row) 
							 | 
						|
									{
							 | 
						|
										return @sybase_data_seek($this->_queryID, $row);
							 | 
						|
									}		
							 | 
						|
								
							 | 
						|
									function _fetch($ignore_fields=false) 
							 | 
						|
									{
							 | 
						|
										if ($this->fetchMode == ADODB_FETCH_NUM) {
							 | 
						|
											$this->fields = @sybase_fetch_row($this->_queryID);
							 | 
						|
										} else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
							 | 
						|
											$this->fields = @sybase_fetch_row($this->_queryID);
							 | 
						|
											if (is_array($this->fields)) {
							 | 
						|
												$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
							 | 
						|
												return true;
							 | 
						|
											}
							 | 
						|
											return false;
							 | 
						|
										}  else {
							 | 
						|
											$this->fields = @sybase_fetch_array($this->_queryID);
							 | 
						|
										}
							 | 
						|
										if ( is_array($this->fields)) {
							 | 
						|
											return true;
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										return false;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									/*	close() only needs to be called if you are worried about using too much memory while your script
							 | 
						|
										is running. All associated result memory for the specified result identifier will automatically be freed.	*/
							 | 
						|
									function _close() {
							 | 
						|
										return @sybase_free_result($this->_queryID);		
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									// sybase/mssql uses a default date like Dec 30 2000 12:00AM
							 | 
						|
									function UnixDate($v)
							 | 
						|
									{
							 | 
						|
										return ADORecordSet_array_sybase::UnixDate($v);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function UnixTimeStamp($v)
							 | 
						|
									{
							 | 
						|
										return ADORecordSet_array_sybase::UnixTimeStamp($v);
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								class ADORecordSet_array_sybase extends ADORecordSet_array {
							 | 
						|
									function ADORecordSet_array_sybase($id=-1)
							 | 
						|
									{
							 | 
						|
										$this->ADORecordSet_array($id);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
										// sybase/mssql uses a default date like Dec 30 2000 12:00AM
							 | 
						|
									function UnixDate($v)
							 | 
						|
									{
							 | 
						|
									global $ADODB_sybase_mths;
							 | 
						|
									
							 | 
						|
										//Dec 30 2000 12:00AM
							 | 
						|
										if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})"
							 | 
						|
											,$v, $rr)) return parent::UnixDate($v);
							 | 
						|
											
							 | 
						|
										if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
							 | 
						|
										
							 | 
						|
										$themth = substr(strtoupper($rr[1]),0,3);
							 | 
						|
										$themth = $ADODB_sybase_mths[$themth];
							 | 
						|
										if ($themth <= 0) return false;
							 | 
						|
										// h-m-s-MM-DD-YY
							 | 
						|
										return  mktime(0,0,0,$themth,$rr[2],$rr[3]);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function UnixTimeStamp($v)
							 | 
						|
									{
							 | 
						|
									global $ADODB_sybase_mths;
							 | 
						|
										//11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
							 | 
						|
										//Changed [0-9] to [0-9 ] in day conversion
							 | 
						|
										if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})"
							 | 
						|
											,$v, $rr)) return parent::UnixTimeStamp($v);
							 | 
						|
										if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
							 | 
						|
										
							 | 
						|
										$themth = substr(strtoupper($rr[1]),0,3);
							 | 
						|
										$themth = $ADODB_sybase_mths[$themth];
							 | 
						|
										if ($themth <= 0) return false;
							 | 
						|
										
							 | 
						|
										switch (strtoupper($rr[6])) {
							 | 
						|
										case 'P':
							 | 
						|
											if ($rr[4]<12) $rr[4] += 12;
							 | 
						|
											break;
							 | 
						|
										case 'A':
							 | 
						|
											if ($rr[4]==12) $rr[4] = 0;
							 | 
						|
											break;
							 | 
						|
										default:
							 | 
						|
											break;
							 | 
						|
										}
							 | 
						|
										// h-m-s-MM-DD-YY
							 | 
						|
										return  mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								?>
							 | 
						|
								
							 |