00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 if (!defined('ADODB_DIR')) die();
00016
00017 define("_ADODB_ADO_LAYER", 1 );
00018
00019
00020
00021
00022 class ADODB_ado extends ADOConnection {
00023 var $databaseType = "ado";
00024 var $_bindInputArray = false;
00025 var $fmtDate = "'Y-m-d'";
00026 var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
00027 var $replaceQuote = "''";
00028 var $dataProvider = "ado";
00029 var $hasAffectedRows = true;
00030 var $adoParameterType = 201;
00031 var $_affectedRows = false;
00032 var $_thisTransactions;
00033 var $_cursor_type = 3;
00034 var $_cursor_location = 3;
00035 var $_lock_type = -1;
00036 var $_execute_option = -1;
00037 var $poorAffectedRows = true;
00038 var $charPage;
00039
00040 function ADODB_ado()
00041 {
00042 $this->_affectedRows = new VARIANT;
00043 }
00044
00045 function ServerInfo()
00046 {
00047 if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
00048 return array('description' => $desc, 'version' => '');
00049 }
00050
00051 function _affectedrows()
00052 {
00053 if (PHP_VERSION >= 5) return $this->_affectedRows;
00054
00055 return $this->_affectedRows->value;
00056 }
00057
00058
00059
00060
00061 function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
00062 {
00063 $u = 'UID';
00064 $p = 'PWD';
00065
00066 if (!empty($this->charPage))
00067 $dbc = new COM('ADODB.Connection',null,$this->charPage);
00068 else
00069 $dbc = new COM('ADODB.Connection');
00070
00071 if (! $dbc) return false;
00072
00073
00074 if ($argProvider=='mssql') {
00075 $u = 'User Id';
00076 $p = 'Password';
00077 $argProvider = "SQLOLEDB";
00078
00079
00080
00081
00082
00083 if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
00084 } else if ($argProvider=='access')
00085 $argProvider = "Microsoft.Jet.OLEDB.4.0";
00086
00087 if ($argProvider) $dbc->Provider = $argProvider;
00088
00089 if ($argUsername) $argHostname .= ";$u=$argUsername";
00090 if ($argPassword)$argHostname .= ";$p=$argPassword";
00091
00092 if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
00093
00094 @$dbc->Open((string) $argHostname);
00095
00096 $this->_connectionID = $dbc;
00097
00098 $dbc->CursorLocation = $this->_cursor_location;
00099 return $dbc->State > 0;
00100 }
00101
00102
00103 function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
00104 {
00105 return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 function &MetaTables()
00151 {
00152 $arr= array();
00153 $dbc = $this->_connectionID;
00154
00155 $adors=@$dbc->OpenSchema(20);
00156 if ($adors){
00157 $f = $adors->Fields(2);
00158 $t = $adors->Fields(3);
00159 while (!$adors->EOF){
00160 $tt=substr($t->value,0,6);
00161 if ($tt!='SYSTEM' && $tt !='ACCESS')
00162 $arr[]=$f->value;
00163
00164 $adors->MoveNext();
00165 }
00166 $adors->Close();
00167 }
00168
00169 return $arr;
00170 }
00171
00172 function &MetaColumns($table)
00173 {
00174 $table = strtoupper($table);
00175 $arr = array();
00176 $dbc = $this->_connectionID;
00177
00178 $adors=@$dbc->OpenSchema(4);
00179
00180 if ($adors){
00181 $t = $adors->Fields(2);
00182 while (!$adors->EOF){
00183
00184
00185 if (strtoupper($t->Value) == $table) {
00186
00187 $fld = new ADOFieldObject();
00188 $c = $adors->Fields(3);
00189 $fld->name = $c->Value;
00190 $fld->type = 'CHAR';
00191 $fld->max_length = -1;
00192 $arr[strtoupper($fld->name)]=$fld;
00193 }
00194
00195 $adors->MoveNext();
00196 }
00197 $adors->Close();
00198 }
00199 $false = false;
00200 return empty($arr) ? $false : $arr;
00201 }
00202
00203
00204
00205
00206
00207 function &_query($sql,$inputarr=false)
00208 {
00209
00210 $dbc = $this->_connectionID;
00211 $false = false;
00212
00213
00214 if ($inputarr) {
00215
00216 if (!empty($this->charPage))
00217 $oCmd = new COM('ADODB.Command',null,$this->charPage);
00218 else
00219 $oCmd = new COM('ADODB.Command');
00220 $oCmd->ActiveConnection = $dbc;
00221 $oCmd->CommandText = $sql;
00222 $oCmd->CommandType = 1;
00223
00224 foreach($inputarr as $val) {
00225
00226 $this->adoParameterType = 130;
00227 $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
00228
00229 $oCmd->Parameters->Append($p);
00230 }
00231 $p = false;
00232 $rs = $oCmd->Execute();
00233 $e = $dbc->Errors;
00234 if ($dbc->Errors->Count > 0) return $false;
00235 return $rs;
00236 }
00237
00238 $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
00239
00240 if ($dbc->Errors->Count > 0) return $false;
00241 if (! $rs) return $false;
00242
00243 if ($rs->State == 0) {
00244 $true = true;
00245 return $true;
00246 }
00247 return $rs;
00248 }
00249
00250
00251 function BeginTrans()
00252 {
00253 if ($this->transOff) return true;
00254
00255 if (isset($this->_thisTransactions))
00256 if (!$this->_thisTransactions) return false;
00257 else {
00258 $o = $this->_connectionID->Properties("Transaction DDL");
00259 $this->_thisTransactions = $o ? true : false;
00260 if (!$o) return false;
00261 }
00262 @$this->_connectionID->BeginTrans();
00263 $this->transCnt += 1;
00264 return true;
00265 }
00266
00267 function CommitTrans($ok=true)
00268 {
00269 if (!$ok) return $this->RollbackTrans();
00270 if ($this->transOff) return true;
00271
00272 @$this->_connectionID->CommitTrans();
00273 if ($this->transCnt) @$this->transCnt -= 1;
00274 return true;
00275 }
00276 function RollbackTrans() {
00277 if ($this->transOff) return true;
00278 @$this->_connectionID->RollbackTrans();
00279 if ($this->transCnt) @$this->transCnt -= 1;
00280 return true;
00281 }
00282
00283
00284
00285 function ErrorMsg()
00286 {
00287 if (!$this->_connectionID) return "No connection established";
00288 $errc = $this->_connectionID->Errors;
00289 if (!$errc) return "No Errors object found";
00290 if ($errc->Count == 0) return '';
00291 $err = $errc->Item($errc->Count-1);
00292 return $err->Description;
00293 }
00294
00295 function ErrorNo()
00296 {
00297 $errc = $this->_connectionID->Errors;
00298 if ($errc->Count == 0) return 0;
00299 $err = $errc->Item($errc->Count-1);
00300 return $err->NativeError;
00301 }
00302
00303
00304 function _close()
00305 {
00306 if ($this->_connectionID) $this->_connectionID->Close();
00307 $this->_connectionID = false;
00308 return true;
00309 }
00310
00311
00312 }
00313
00314
00315
00316
00317
00318 class ADORecordSet_ado extends ADORecordSet {
00319
00320 var $bind = false;
00321 var $databaseType = "ado";
00322 var $dataProvider = "ado";
00323 var $_tarr = false;
00324 var $_flds;
00325 var $canSeek = true;
00326 var $hideErrors = true;
00327
00328 function ADORecordSet_ado($id,$mode=false)
00329 {
00330 if ($mode === false) {
00331 global $ADODB_FETCH_MODE;
00332 $mode = $ADODB_FETCH_MODE;
00333 }
00334 $this->fetchMode = $mode;
00335 return $this->ADORecordSet($id,$mode);
00336 }
00337
00338
00339
00340 function &FetchField($fieldOffset = -1) {
00341 $off=$fieldOffset+1;
00342
00343 $o= new ADOFieldObject();
00344 $rs = $this->_queryID;
00345 $f = $rs->Fields($fieldOffset);
00346 $o->name = $f->Name;
00347 $t = $f->Type;
00348 $o->type = $this->MetaType($t);
00349 $o->max_length = $f->DefinedSize;
00350 $o->ado_type = $t;
00351
00352
00353 return $o;
00354 }
00355
00356
00357 function Fields($colname)
00358 {
00359 if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
00360 if (!$this->bind) {
00361 $this->bind = array();
00362 for ($i=0; $i < $this->_numOfFields; $i++) {
00363 $o = $this->FetchField($i);
00364 $this->bind[strtoupper($o->name)] = $i;
00365 }
00366 }
00367
00368 return $this->fields[$this->bind[strtoupper($colname)]];
00369 }
00370
00371
00372 function _initrs()
00373 {
00374 $rs = $this->_queryID;
00375 $this->_numOfRows = $rs->RecordCount;
00376
00377 $f = $rs->Fields;
00378 $this->_numOfFields = $f->Count;
00379 }
00380
00381
00382
00383 function _seek($row)
00384 {
00385 $rs = $this->_queryID;
00386
00387
00388
00389 if ($this->_currentRow > $row) return false;
00390 @$rs->Move((integer)$row - $this->_currentRow-1);
00391 return true;
00392 }
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476 function MetaType($t,$len=-1,$fieldobj=false)
00477 {
00478 if (is_object($t)) {
00479 $fieldobj = $t;
00480 $t = $fieldobj->type;
00481 $len = $fieldobj->max_length;
00482 }
00483
00484 if (!is_numeric($t)) return $t;
00485
00486 switch ($t) {
00487 case 0:
00488 case 12:
00489 case 8:
00490 case 129:
00491 case 130:
00492 case 200:
00493 case 202:
00494 case 128:
00495 case 204:
00496 case 72:
00497 if ($len <= $this->blobSize) return 'C';
00498
00499 case 201:
00500 case 203:
00501 return 'X';
00502 case 128:
00503 case 204:
00504 case 205:
00505 return 'B';
00506 case 7:
00507 case 133: return 'D';
00508
00509 case 134:
00510 case 135: return 'T';
00511
00512 case 11: return 'L';
00513
00514 case 16:
00515 case 2:
00516 case 3:
00517 case 4:
00518 case 17:
00519 case 18:
00520 case 19:
00521 case 20:
00522 return 'I';
00523 default: return 'N';
00524 }
00525 }
00526
00527
00528 function _fetch()
00529 {
00530 $rs = $this->_queryID;
00531 if (!$rs or $rs->EOF) {
00532 $this->fields = false;
00533 return false;
00534 }
00535 $this->fields = array();
00536
00537 if (!$this->_tarr) {
00538 $tarr = array();
00539 $flds = array();
00540 for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
00541 $f = $rs->Fields($i);
00542 $flds[] = $f;
00543 $tarr[] = $f->Type;
00544 }
00545
00546 $this->_tarr = $tarr;
00547 $this->_flds = $flds;
00548 }
00549 $t = reset($this->_tarr);
00550 $f = reset($this->_flds);
00551
00552 if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);
00553 for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
00554
00555 switch($t) {
00556 case 135:
00557 if (!strlen((string)$f->value)) $this->fields[] = false;
00558 else {
00559 if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
00560
00561 $val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
00562 else
00563 $val = $f->value;
00564 $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
00565 }
00566 break;
00567 case 133:
00568 if ($val = $f->value) {
00569 $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
00570 } else
00571 $this->fields[] = false;
00572 break;
00573 case 7:
00574 if (!strlen((string)$f->value)) $this->fields[] = false;
00575 else {
00576 if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
00577 else $val = $f->value;
00578
00579 if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
00580 else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
00581 }
00582 break;
00583 case 1:
00584 $this->fields[] = false;
00585 break;
00586 case 6:
00587 ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
00588 $this->fields[] = (float) $f->value;
00589 break;
00590 default:
00591 $this->fields[] = $f->value;
00592 break;
00593 }
00594
00595 $f = next($this->_flds);
00596 $t = next($this->_tarr);
00597 }
00598 if ($this->hideErrors) error_reporting($olde);
00599 @$rs->MoveNext();
00600
00601 if ($this->fetchMode & ADODB_FETCH_ASSOC) {
00602 $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
00603 }
00604 return true;
00605 }
00606
00607 function NextRecordSet()
00608 {
00609 $rs = $this->_queryID;
00610 $this->_queryID = $rs->NextRecordSet();
00611
00612 if ($this->_queryID == null) return false;
00613
00614 $this->_currentRow = -1;
00615 $this->_currentPage = -1;
00616 $this->bind = false;
00617 $this->fields = false;
00618 $this->_flds = false;
00619 $this->_tarr = false;
00620
00621 $this->_inited = false;
00622 $this->Init();
00623 return true;
00624 }
00625
00626 function _close() {
00627 $this->_flds = false;
00628 @$this->_queryID->Close();
00629 $this->_queryID = false;
00630 }
00631
00632 }
00633
00634 ?>