00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 if (!defined('ADODB_DIR')) die();
00017
00018 class ADODB_oracle extends ADOConnection {
00019 var $databaseType = "oracle";
00020 var $replaceQuote = "''";
00021 var $concat_operator='||';
00022 var $_curs;
00023 var $_initdate = true;
00024 var $metaTablesSQL = 'select table_name from cat';
00025 var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
00026 var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')";
00027 var $sysTimeStamp = 'SYSDATE';
00028 var $connectSID = true;
00029
00030 function ADODB_oracle()
00031 {
00032 }
00033
00034
00035 function DBDate($d)
00036 {
00037 if (is_string($d)) $d = ADORecordSet::UnixDate($d);
00038 return 'TO_DATE('.adodb_date($this->fmtDate,$d).",'YYYY-MM-DD')";
00039 }
00040
00041
00042 function DBTimeStamp($ts)
00043 {
00044
00045 if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
00046 return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
00047 }
00048
00049
00050 function BindDate($d)
00051 {
00052 $d = ADOConnection::DBDate($d);
00053 if (strncmp($d,"'",1)) return $d;
00054
00055 return substr($d,1,strlen($d)-2);
00056 }
00057
00058 function BindTimeStamp($d)
00059 {
00060 $d = ADOConnection::DBTimeStamp($d);
00061 if (strncmp($d,"'",1)) return $d;
00062
00063 return substr($d,1,strlen($d)-2);
00064 }
00065
00066
00067
00068 function BeginTrans()
00069 {
00070 $this->autoCommit = false;
00071 ora_commitoff($this->_connectionID);
00072 return true;
00073 }
00074
00075
00076 function CommitTrans($ok=true)
00077 {
00078 if (!$ok) return $this->RollbackTrans();
00079 $ret = ora_commit($this->_connectionID);
00080 ora_commiton($this->_connectionID);
00081 return $ret;
00082 }
00083
00084
00085 function RollbackTrans()
00086 {
00087 $ret = ora_rollback($this->_connectionID);
00088 ora_commiton($this->_connectionID);
00089 return $ret;
00090 }
00091
00092
00093
00094 function ErrorMsg()
00095 {
00096 if ($this->_errorMsg !== false) return $this->_errorMsg;
00097
00098 if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs);
00099 if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID);
00100 return $this->_errorMsg;
00101 }
00102
00103
00104 function ErrorNo()
00105 {
00106 if ($this->_errorCode !== false) return $this->_errorCode;
00107
00108 if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs);
00109 if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID);
00110 return $this->_errorCode;
00111 }
00112
00113
00114
00115
00116 function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
00117 {
00118 if (!function_exists('ora_plogon')) return null;
00119
00120
00121 $this->_errorMsg = false;
00122 $this->_errorCode = false;
00123
00124
00125
00126
00127
00128 if($argHostname) {
00129 if (empty($argDatabasename)) $argDatabasename = $argHostname;
00130 else {
00131 if(strpos($argHostname,":")) {
00132 $argHostinfo=explode(":",$argHostname);
00133 $argHostname=$argHostinfo[0];
00134 $argHostport=$argHostinfo[1];
00135 } else {
00136 $argHostport="1521";
00137 }
00138
00139
00140 if ($this->connectSID) {
00141 $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
00142 .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
00143 } else
00144 $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
00145 .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
00146 }
00147
00148 }
00149
00150 if ($argDatabasename) $argUsername .= "@$argDatabasename";
00151
00152
00153 if ($mode = 1)
00154 $this->_connectionID = ora_plogon($argUsername,$argPassword);
00155 else
00156 $this->_connectionID = ora_logon($argUsername,$argPassword);
00157 if ($this->_connectionID === false) return false;
00158 if ($this->autoCommit) ora_commiton($this->_connectionID);
00159 if ($this->_initdate) {
00160 $rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'");
00161 if ($rs) ora_close($rs);
00162 }
00163
00164 return true;
00165 }
00166
00167
00168
00169 function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
00170 {
00171 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1);
00172 }
00173
00174
00175
00176 function _query($sql,$inputarr=false)
00177 {
00178
00179 $this->_errorMsg = false;
00180 $this->_errorCode = false;
00181
00182 $curs = ora_open($this->_connectionID);
00183
00184 if ($curs === false) return false;
00185 $this->_curs = $curs;
00186 if (!ora_parse($curs,$sql)) return false;
00187 if (ora_exec($curs)) return $curs;
00188
00189
00190 $this->_errorCode = @ora_errorcode($curs);
00191 $this->_errorMsg = @ora_error($curs);
00192
00193 @ora_close($curs);
00194 return false;
00195 }
00196
00197
00198
00199 function _close()
00200 {
00201 return @ora_logoff($this->_connectionID);
00202 }
00203
00204
00205
00206 }
00207
00208
00209
00210
00211
00212
00213 class ADORecordset_oracle extends ADORecordSet {
00214
00215 var $databaseType = "oracle";
00216 var $bind = false;
00217
00218 function ADORecordset_oracle($queryID,$mode=false)
00219 {
00220
00221 if ($mode === false) {
00222 global $ADODB_FETCH_MODE;
00223 $mode = $ADODB_FETCH_MODE;
00224 }
00225 $this->fetchMode = $mode;
00226
00227 $this->_queryID = $queryID;
00228
00229 $this->_inited = true;
00230 $this->fields = array();
00231 if ($queryID) {
00232 $this->_currentRow = 0;
00233 $this->EOF = !$this->_fetch();
00234 @$this->_initrs();
00235 } else {
00236 $this->_numOfRows = 0;
00237 $this->_numOfFields = 0;
00238 $this->EOF = true;
00239 }
00240
00241 return $this->_queryID;
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251 function &FetchField($fieldOffset = -1)
00252 {
00253 $fld = new ADOFieldObject;
00254 $fld->name = ora_columnname($this->_queryID, $fieldOffset);
00255 $fld->type = ora_columntype($this->_queryID, $fieldOffset);
00256 $fld->max_length = ora_columnsize($this->_queryID, $fieldOffset);
00257 return $fld;
00258 }
00259
00260
00261 function Fields($colname)
00262 {
00263 if (!$this->bind) {
00264 $this->bind = array();
00265 for ($i=0; $i < $this->_numOfFields; $i++) {
00266 $o = $this->FetchField($i);
00267 $this->bind[strtoupper($o->name)] = $i;
00268 }
00269 }
00270
00271 return $this->fields[$this->bind[strtoupper($colname)]];
00272 }
00273
00274 function _initrs()
00275 {
00276 $this->_numOfRows = -1;
00277 $this->_numOfFields = @ora_numcols($this->_queryID);
00278 }
00279
00280
00281 function _seek($row)
00282 {
00283 return false;
00284 }
00285
00286 function _fetch($ignore_fields=false) {
00287
00288 if ($this->fetchMode & ADODB_FETCH_ASSOC)
00289 return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC);
00290 else
00291 return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS);
00292 }
00293
00294
00295
00296
00297 function _close()
00298 {
00299 return @ora_close($this->_queryID);
00300 }
00301
00302 function MetaType($t,$len=-1)
00303 {
00304 if (is_object($t)) {
00305 $fieldobj = $t;
00306 $t = $fieldobj->type;
00307 $len = $fieldobj->max_length;
00308 }
00309
00310 switch (strtoupper($t)) {
00311 case 'VARCHAR':
00312 case 'VARCHAR2':
00313 case 'CHAR':
00314 case 'VARBINARY':
00315 case 'BINARY':
00316 if ($len <= $this->blobSize) return 'C';
00317 case 'LONG':
00318 case 'LONG VARCHAR':
00319 case 'CLOB':
00320 return 'X';
00321 case 'LONG RAW':
00322 case 'LONG VARBINARY':
00323 case 'BLOB':
00324 return 'B';
00325
00326 case 'DATE': return 'D';
00327
00328
00329
00330 case 'BIT': return 'L';
00331 case 'INT':
00332 case 'SMALLINT':
00333 case 'INTEGER': return 'I';
00334 default: return 'N';
00335 }
00336 }
00337 }
00338 ?>