PageRenderTime 303ms CodeModel.GetById 70ms RepoModel.GetById 18ms app.codeStats 0ms

/concreteOLD/libraries/3rdparty/adodb/drivers/adodb-ado5.inc.php

https://bitbucket.org/selfeky/xclusivescardwebsite
PHP | 708 lines | 436 code | 101 blank | 171 comment | 100 complexity | 8b01c82423c0a6902aedaf7363d5d42f MD5 | raw file
  1. <?php
  2. /*
  3. V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). 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. Latest version is available at http://adodb.sourceforge.net
  9. Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version.
  10. */
  11. // security - hide paths
  12. if (!defined('ADODB_DIR')) die();
  13. define("_ADODB_ADO_LAYER", 1 );
  14. /*--------------------------------------------------------------------------------------
  15. --------------------------------------------------------------------------------------*/
  16. class ADODB_ado extends ADOConnection {
  17. var $databaseType = "ado";
  18. var $_bindInputArray = false;
  19. var $fmtDate = "'Y-m-d'";
  20. var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
  21. var $replaceQuote = "''"; // string to use to replace quotes
  22. var $dataProvider = "ado";
  23. var $hasAffectedRows = true;
  24. var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
  25. var $_affectedRows = false;
  26. var $_thisTransactions;
  27. var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
  28. var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
  29. var $_lock_type = -1;
  30. var $_execute_option = -1;
  31. var $poorAffectedRows = true;
  32. var $charPage;
  33. function ADODB_ado()
  34. {
  35. $this->_affectedRows = new VARIANT;
  36. }
  37. function ServerInfo()
  38. {
  39. if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
  40. return array('description' => $desc, 'version' => '');
  41. }
  42. function _affectedrows()
  43. {
  44. if (PHP_VERSION >= 5) return $this->_affectedRows;
  45. return $this->_affectedRows->value;
  46. }
  47. // you can also pass a connection string like this:
  48. //
  49. // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
  50. function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '')
  51. {
  52. // two modes
  53. // - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat
  54. // - if $argProvider is not empty, then $argDBorProvider holds db
  55. if ($argProvider) {
  56. $argDatabasename = $argDBorProvider;
  57. } else {
  58. $argDatabasename = '';
  59. if ($argDBorProvider) $argProvider = $argDBorProvider;
  60. else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */
  61. $argProvider = 'MSDASQL';
  62. }
  63. try {
  64. $u = 'UID';
  65. $p = 'PWD';
  66. if (!empty($this->charPage))
  67. $dbc = new COM('ADODB.Connection',null,$this->charPage);
  68. else
  69. $dbc = new COM('ADODB.Connection');
  70. if (! $dbc) return false;
  71. /* special support if provider is mssql or access */
  72. if ($argProvider=='mssql') {
  73. $u = 'User Id'; //User parameter name for OLEDB
  74. $p = 'Password';
  75. $argProvider = "SQLOLEDB"; // SQL Server Provider
  76. // not yet
  77. //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
  78. //use trusted conection for SQL if username not specified
  79. if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
  80. } else if ($argProvider=='access')
  81. $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
  82. if ($argProvider) $dbc->Provider = $argProvider;
  83. if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname";
  84. if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename";
  85. if ($argUsername) $argHostname .= ";$u=$argUsername";
  86. if ($argPassword)$argHostname .= ";$p=$argPassword";
  87. if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
  88. // @ added below for php 4.0.1 and earlier
  89. @$dbc->Open((string) $argHostname);
  90. $this->_connectionID = $dbc;
  91. $dbc->CursorLocation = $this->_cursor_location;
  92. return $dbc->State > 0;
  93. } catch (exception $e) {
  94. if ($this->debug);echo "<pre>",$argHostname,"\n",$e,"</pre>\n";
  95. }
  96. return false;
  97. }
  98. // returns true or false
  99. function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
  100. {
  101. return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
  102. }
  103. /*
  104. adSchemaCatalogs = 1,
  105. adSchemaCharacterSets = 2,
  106. adSchemaCollations = 3,
  107. adSchemaColumns = 4,
  108. adSchemaCheckConstraints = 5,
  109. adSchemaConstraintColumnUsage = 6,
  110. adSchemaConstraintTableUsage = 7,
  111. adSchemaKeyColumnUsage = 8,
  112. adSchemaReferentialContraints = 9,
  113. adSchemaTableConstraints = 10,
  114. adSchemaColumnsDomainUsage = 11,
  115. adSchemaIndexes = 12,
  116. adSchemaColumnPrivileges = 13,
  117. adSchemaTablePrivileges = 14,
  118. adSchemaUsagePrivileges = 15,
  119. adSchemaProcedures = 16,
  120. adSchemaSchemata = 17,
  121. adSchemaSQLLanguages = 18,
  122. adSchemaStatistics = 19,
  123. adSchemaTables = 20,
  124. adSchemaTranslations = 21,
  125. adSchemaProviderTypes = 22,
  126. adSchemaViews = 23,
  127. adSchemaViewColumnUsage = 24,
  128. adSchemaViewTableUsage = 25,
  129. adSchemaProcedureParameters = 26,
  130. adSchemaForeignKeys = 27,
  131. adSchemaPrimaryKeys = 28,
  132. adSchemaProcedureColumns = 29,
  133. adSchemaDBInfoKeywords = 30,
  134. adSchemaDBInfoLiterals = 31,
  135. adSchemaCubes = 32,
  136. adSchemaDimensions = 33,
  137. adSchemaHierarchies = 34,
  138. adSchemaLevels = 35,
  139. adSchemaMeasures = 36,
  140. adSchemaProperties = 37,
  141. adSchemaMembers = 38
  142. */
  143. function MetaTables()
  144. {
  145. $arr= array();
  146. $dbc = $this->_connectionID;
  147. $adors=@$dbc->OpenSchema(20);//tables
  148. if ($adors){
  149. $f = $adors->Fields(2);//table/view name
  150. $t = $adors->Fields(3);//table type
  151. while (!$adors->EOF){
  152. $tt=substr($t->value,0,6);
  153. if ($tt!='SYSTEM' && $tt !='ACCESS')
  154. $arr[]=$f->value;
  155. //print $f->value . ' ' . $t->value.'<br>';
  156. $adors->MoveNext();
  157. }
  158. $adors->Close();
  159. }
  160. return $arr;
  161. }
  162. function MetaColumns($table, $normalize=true)
  163. {
  164. $table = strtoupper($table);
  165. $arr= array();
  166. $dbc = $this->_connectionID;
  167. $adors=@$dbc->OpenSchema(4);//tables
  168. if ($adors){
  169. $t = $adors->Fields(2);//table/view name
  170. while (!$adors->EOF){
  171. if (strtoupper($t->Value) == $table) {
  172. $fld = new ADOFieldObject();
  173. $c = $adors->Fields(3);
  174. $fld->name = $c->Value;
  175. $fld->type = 'CHAR'; // cannot discover type in ADO!
  176. $fld->max_length = -1;
  177. $arr[strtoupper($fld->name)]=$fld;
  178. }
  179. $adors->MoveNext();
  180. }
  181. $adors->Close();
  182. }
  183. return $arr;
  184. }
  185. /* returns queryID or false */
  186. function _query($sql,$inputarr=false)
  187. {
  188. try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour...
  189. $dbc = $this->_connectionID;
  190. // return rs
  191. $false = false;
  192. if ($inputarr) {
  193. if (!empty($this->charPage))
  194. $oCmd = new COM('ADODB.Command',null,$this->charPage);
  195. else
  196. $oCmd = new COM('ADODB.Command');
  197. $oCmd->ActiveConnection = $dbc;
  198. $oCmd->CommandText = $sql;
  199. $oCmd->CommandType = 1;
  200. while(list(, $val) = each($inputarr)) {
  201. $type = gettype($val);
  202. $len=strlen($val);
  203. if ($type == 'boolean')
  204. $this->adoParameterType = 11;
  205. else if ($type == 'integer')
  206. $this->adoParameterType = 3;
  207. else if ($type == 'double')
  208. $this->adoParameterType = 5;
  209. elseif ($type == 'string')
  210. $this->adoParameterType = 202;
  211. else if (($val === null) || (!defined($val)))
  212. $len=1;
  213. else
  214. $this->adoParameterType = 130;
  215. // name, type, direction 1 = input, len,
  216. $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val);
  217. $oCmd->Parameters->Append($p);
  218. }
  219. $p = false;
  220. $rs = $oCmd->Execute();
  221. $e = $dbc->Errors;
  222. if ($dbc->Errors->Count > 0) return $false;
  223. return $rs;
  224. }
  225. $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
  226. if ($dbc->Errors->Count > 0) return $false;
  227. if (! $rs) return $false;
  228. if ($rs->State == 0) {
  229. $true = true;
  230. return $true; // 0 = adStateClosed means no records returned
  231. }
  232. return $rs;
  233. } catch (exception $e) {
  234. }
  235. return $false;
  236. }
  237. function BeginTrans()
  238. {
  239. if ($this->transOff) return true;
  240. if (isset($this->_thisTransactions))
  241. if (!$this->_thisTransactions) return false;
  242. else {
  243. $o = $this->_connectionID->Properties("Transaction DDL");
  244. $this->_thisTransactions = $o ? true : false;
  245. if (!$o) return false;
  246. }
  247. @$this->_connectionID->BeginTrans();
  248. $this->transCnt += 1;
  249. return true;
  250. }
  251. function CommitTrans($ok=true)
  252. {
  253. if (!$ok) return $this->RollbackTrans();
  254. if ($this->transOff) return true;
  255. @$this->_connectionID->CommitTrans();
  256. if ($this->transCnt) @$this->transCnt -= 1;
  257. return true;
  258. }
  259. function RollbackTrans() {
  260. if ($this->transOff) return true;
  261. @$this->_connectionID->RollbackTrans();
  262. if ($this->transCnt) @$this->transCnt -= 1;
  263. return true;
  264. }
  265. /* Returns: the last error message from previous database operation */
  266. function ErrorMsg()
  267. {
  268. if (!$this->_connectionID) return "No connection established";
  269. $errmsg = '';
  270. try {
  271. $errc = $this->_connectionID->Errors;
  272. if (!$errc) return "No Errors object found";
  273. if ($errc->Count == 0) return '';
  274. $err = $errc->Item($errc->Count-1);
  275. $errmsg = $err->Description;
  276. }catch(exception $e) {
  277. }
  278. return $errmsg;
  279. }
  280. function ErrorNo()
  281. {
  282. $errc = $this->_connectionID->Errors;
  283. if ($errc->Count == 0) return 0;
  284. $err = $errc->Item($errc->Count-1);
  285. return $err->NativeError;
  286. }
  287. // returns true or false
  288. function _close()
  289. {
  290. if ($this->_connectionID) $this->_connectionID->Close();
  291. $this->_connectionID = false;
  292. return true;
  293. }
  294. }
  295. /*--------------------------------------------------------------------------------------
  296. Class Name: Recordset
  297. --------------------------------------------------------------------------------------*/
  298. class ADORecordSet_ado extends ADORecordSet {
  299. var $bind = false;
  300. var $databaseType = "ado";
  301. var $dataProvider = "ado";
  302. var $_tarr = false; // caches the types
  303. var $_flds; // and field objects
  304. var $canSeek = true;
  305. var $hideErrors = true;
  306. function ADORecordSet_ado($id,$mode=false)
  307. {
  308. if ($mode === false) {
  309. global $ADODB_FETCH_MODE;
  310. $mode = $ADODB_FETCH_MODE;
  311. }
  312. $this->fetchMode = $mode;
  313. return $this->ADORecordSet($id,$mode);
  314. }
  315. // returns the field object
  316. function FetchField($fieldOffset = -1) {
  317. $off=$fieldOffset+1; // offsets begin at 1
  318. $o= new ADOFieldObject();
  319. $rs = $this->_queryID;
  320. if (!$rs) return false;
  321. $f = $rs->Fields($fieldOffset);
  322. $o->name = $f->Name;
  323. $t = $f->Type;
  324. $o->type = $this->MetaType($t);
  325. $o->max_length = $f->DefinedSize;
  326. $o->ado_type = $t;
  327. //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
  328. return $o;
  329. }
  330. /* Use associative array to get fields array */
  331. function Fields($colname)
  332. {
  333. if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
  334. if (!$this->bind) {
  335. $this->bind = array();
  336. for ($i=0; $i < $this->_numOfFields; $i++) {
  337. $o = $this->FetchField($i);
  338. $this->bind[strtoupper($o->name)] = $i;
  339. }
  340. }
  341. return $this->fields[$this->bind[strtoupper($colname)]];
  342. }
  343. function _initrs()
  344. {
  345. $rs = $this->_queryID;
  346. try {
  347. $this->_numOfRows = $rs->RecordCount;
  348. } catch (Exception $e) {
  349. $this->_numOfRows = -1;
  350. }
  351. $f = $rs->Fields;
  352. $this->_numOfFields = $f->Count;
  353. }
  354. // should only be used to move forward as we normally use forward-only cursors
  355. function _seek($row)
  356. {
  357. $rs = $this->_queryID;
  358. // absoluteposition doesn't work -- my maths is wrong ?
  359. // $rs->AbsolutePosition->$row-2;
  360. // return true;
  361. if ($this->_currentRow > $row) return false;
  362. @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
  363. return true;
  364. }
  365. /*
  366. OLEDB types
  367. enum DBTYPEENUM
  368. { DBTYPE_EMPTY = 0,
  369. DBTYPE_NULL = 1,
  370. DBTYPE_I2 = 2,
  371. DBTYPE_I4 = 3,
  372. DBTYPE_R4 = 4,
  373. DBTYPE_R8 = 5,
  374. DBTYPE_CY = 6,
  375. DBTYPE_DATE = 7,
  376. DBTYPE_BSTR = 8,
  377. DBTYPE_IDISPATCH = 9,
  378. DBTYPE_ERROR = 10,
  379. DBTYPE_BOOL = 11,
  380. DBTYPE_VARIANT = 12,
  381. DBTYPE_IUNKNOWN = 13,
  382. DBTYPE_DECIMAL = 14,
  383. DBTYPE_UI1 = 17,
  384. DBTYPE_ARRAY = 0x2000,
  385. DBTYPE_BYREF = 0x4000,
  386. DBTYPE_I1 = 16,
  387. DBTYPE_UI2 = 18,
  388. DBTYPE_UI4 = 19,
  389. DBTYPE_I8 = 20,
  390. DBTYPE_UI8 = 21,
  391. DBTYPE_GUID = 72,
  392. DBTYPE_VECTOR = 0x1000,
  393. DBTYPE_RESERVED = 0x8000,
  394. DBTYPE_BYTES = 128,
  395. DBTYPE_STR = 129,
  396. DBTYPE_WSTR = 130,
  397. DBTYPE_NUMERIC = 131,
  398. DBTYPE_UDT = 132,
  399. DBTYPE_DBDATE = 133,
  400. DBTYPE_DBTIME = 134,
  401. DBTYPE_DBTIMESTAMP = 135
  402. ADO Types
  403. adEmpty = 0,
  404. adTinyInt = 16,
  405. adSmallInt = 2,
  406. adInteger = 3,
  407. adBigInt = 20,
  408. adUnsignedTinyInt = 17,
  409. adUnsignedSmallInt = 18,
  410. adUnsignedInt = 19,
  411. adUnsignedBigInt = 21,
  412. adSingle = 4,
  413. adDouble = 5,
  414. adCurrency = 6,
  415. adDecimal = 14,
  416. adNumeric = 131,
  417. adBoolean = 11,
  418. adError = 10,
  419. adUserDefined = 132,
  420. adVariant = 12,
  421. adIDispatch = 9,
  422. adIUnknown = 13,
  423. adGUID = 72,
  424. adDate = 7,
  425. adDBDate = 133,
  426. adDBTime = 134,
  427. adDBTimeStamp = 135,
  428. adBSTR = 8,
  429. adChar = 129,
  430. adVarChar = 200,
  431. adLongVarChar = 201,
  432. adWChar = 130,
  433. adVarWChar = 202,
  434. adLongVarWChar = 203,
  435. adBinary = 128,
  436. adVarBinary = 204,
  437. adLongVarBinary = 205,
  438. adChapter = 136,
  439. adFileTime = 64,
  440. adDBFileTime = 137,
  441. adPropVariant = 138,
  442. adVarNumeric = 139
  443. */
  444. function MetaType($t,$len=-1,$fieldobj=false)
  445. {
  446. if (is_object($t)) {
  447. $fieldobj = $t;
  448. $t = $fieldobj->type;
  449. $len = $fieldobj->max_length;
  450. }
  451. if (!is_numeric($t)) return $t;
  452. switch ($t) {
  453. case 0:
  454. case 12: // variant
  455. case 8: // bstr
  456. case 129: //char
  457. case 130: //wc
  458. case 200: // varc
  459. case 202:// varWC
  460. case 128: // bin
  461. case 204: // varBin
  462. case 72: // guid
  463. if ($len <= $this->blobSize) return 'C';
  464. case 201:
  465. case 203:
  466. return 'X';
  467. case 128:
  468. case 204:
  469. case 205:
  470. return 'B';
  471. case 7:
  472. case 133: return 'D';
  473. case 134:
  474. case 135: return 'T';
  475. case 11: return 'L';
  476. case 16:// adTinyInt = 16,
  477. case 2://adSmallInt = 2,
  478. case 3://adInteger = 3,
  479. case 4://adBigInt = 20,
  480. case 17://adUnsignedTinyInt = 17,
  481. case 18://adUnsignedSmallInt = 18,
  482. case 19://adUnsignedInt = 19,
  483. case 20://adUnsignedBigInt = 21,
  484. return 'I';
  485. default: return 'N';
  486. }
  487. }
  488. // time stamp not supported yet
  489. function _fetch()
  490. {
  491. $rs = $this->_queryID;
  492. if (!$rs or $rs->EOF) {
  493. $this->fields = false;
  494. return false;
  495. }
  496. $this->fields = array();
  497. if (!$this->_tarr) {
  498. $tarr = array();
  499. $flds = array();
  500. for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
  501. $f = $rs->Fields($i);
  502. $flds[] = $f;
  503. $tarr[] = $f->Type;
  504. }
  505. // bind types and flds only once
  506. $this->_tarr = $tarr;
  507. $this->_flds = $flds;
  508. }
  509. $t = reset($this->_tarr);
  510. $f = reset($this->_flds);
  511. if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
  512. for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
  513. //echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
  514. switch($t) {
  515. case 135: // timestamp
  516. if (!strlen((string)$f->value)) $this->fields[] = false;
  517. else {
  518. if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
  519. // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
  520. $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
  521. else
  522. $val = $f->value;
  523. $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
  524. }
  525. break;
  526. case 133:// A date value (yyyymmdd)
  527. if ($val = $f->value) {
  528. $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
  529. } else
  530. $this->fields[] = false;
  531. break;
  532. case 7: // adDate
  533. if (!strlen((string)$f->value)) $this->fields[] = false;
  534. else {
  535. if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
  536. else $val = $f->value;
  537. if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
  538. else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
  539. }
  540. break;
  541. case 1: // null
  542. $this->fields[] = false;
  543. break;
  544. case 20:
  545. case 21: // bigint (64 bit)
  546. $this->fields[] = (float) $f->value; // if 64 bit PHP, could use (int)
  547. break;
  548. case 6: // currency is not supported properly;
  549. ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
  550. $this->fields[] = (float) $f->value;
  551. break;
  552. case 11: //BIT;
  553. $val = "";
  554. if(is_bool($f->value)) {
  555. if($f->value==true) $val = 1;
  556. else $val = 0;
  557. }
  558. if(is_null($f->value)) $val = null;
  559. $this->fields[] = $val;
  560. break;
  561. default:
  562. $this->fields[] = $f->value;
  563. break;
  564. }
  565. //print " $f->value $t, ";
  566. $f = next($this->_flds);
  567. $t = next($this->_tarr);
  568. } // for
  569. if ($this->hideErrors) error_reporting($olde);
  570. @$rs->MoveNext(); // @ needed for some versions of PHP!
  571. if ($this->fetchMode & ADODB_FETCH_ASSOC) {
  572. $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
  573. }
  574. return true;
  575. }
  576. function NextRecordSet()
  577. {
  578. $rs = $this->_queryID;
  579. $this->_queryID = $rs->NextRecordSet();
  580. //$this->_queryID = $this->_QueryId->NextRecordSet();
  581. if ($this->_queryID == null) return false;
  582. $this->_currentRow = -1;
  583. $this->_currentPage = -1;
  584. $this->bind = false;
  585. $this->fields = false;
  586. $this->_flds = false;
  587. $this->_tarr = false;
  588. $this->_inited = false;
  589. $this->Init();
  590. return true;
  591. }
  592. function _close() {
  593. $this->_flds = false;
  594. try {
  595. @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
  596. } catch (Exception $e) {
  597. }
  598. $this->_queryID = false;
  599. }
  600. }
  601. ?>