00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 if (!defined('ADODB_DIR')) die();
00020
00021 class ADODB_sybase extends ADOConnection {
00022 var $databaseType = "sybase";
00023 var $dataProvider = 'sybase';
00024 var $replaceQuote = "''";
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
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
00034
00035
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
00048 function _insertid()
00049 {
00050 return $this->GetOne('select @@identity');
00051 }
00052
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
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
00108
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
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
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
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
00154 function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
00155 {
00156 if ($secs2cache > 0) {
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
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
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
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
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
00300
00301
00302
00303 function &FetchField($fieldOffset = -1)
00304 {
00305 if ($fieldOffset != -1) {
00306 $o = @sybase_fetch_field($this->_queryID, $fieldOffset);
00307 }
00308 else if ($fieldOffset == -1) {
00309 $o = @sybase_fetch_field($this->_queryID);
00310 }
00311
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
00350
00351 function _close() {
00352 return @sybase_free_result($this->_queryID);
00353 }
00354
00355
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
00374 function UnixDate($v)
00375 {
00376 global $ADODB_sybase_mths;
00377
00378
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
00388 return mktime(0,0,0,$themth,$rr[2],$rr[3]);
00389 }
00390
00391 function UnixTimeStamp($v)
00392 {
00393 global $ADODB_sybase_mths;
00394
00395
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
00415 return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
00416 }
00417 }
00418 ?>