[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/adodb/drivers/ -> adodb-db2.inc.php (source)

   1  <?php
   2  /*
   3    V5.19  23-Apr-2014  (c) 2000-2012 (jlim#natsoft.com). All rights reserved.
   4  
   5    This is a version of the ADODB driver for DB2.  It uses the 'ibm_db2' PECL extension
   6    for PHP (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2 or
   7    higher.
   8  
   9    Originally tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
  10    More recently tested with PHP 5.1.2 and Apache 2.0.55 on Windows XP SP2.
  11  
  12    This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard#rogers.com".
  13    I ripped out what I believed to be a lot of redundant or obsolete code, but there are
  14    probably still some remnants of the ODBC support in this file; I'm relying on reviewers
  15    of this code to point out any other things that can be removed.
  16  */
  17  
  18  // security - hide paths
  19  if (!defined('ADODB_DIR')) die();
  20  
  21    define("_ADODB_DB2_LAYER", 2 );
  22  
  23  /*--------------------------------------------------------------------------------------
  24  --------------------------------------------------------------------------------------*/
  25  
  26  
  27  
  28  
  29  
  30  class ADODB_db2 extends ADOConnection {
  31      var $databaseType = "db2";
  32      var $fmtDate = "'Y-m-d'";
  33      var $concat_operator = '||';
  34  
  35      var $sysTime = 'CURRENT TIME';
  36      var $sysDate = 'CURRENT DATE';
  37      var $sysTimeStamp = 'CURRENT TIMESTAMP';
  38  
  39      var $fmtTimeStamp = "'Y-m-d H:i:s'";
  40      var $replaceQuote = "''"; // string to use to replace quotes
  41      var $dataProvider = "db2";
  42      var $hasAffectedRows = true;
  43  
  44      var $binmode = DB2_BINARY;
  45  
  46      var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
  47                                  // breaking backward-compat
  48      var $_bindInputArray = false;
  49      var $_genIDSQL = "VALUES NEXTVAL FOR %s";
  50      var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s NO MAXVALUE NO CYCLE";
  51      var $_dropSeqSQL = "DROP SEQUENCE %s";
  52      var $_autocommit = true;
  53      var $_haserrorfunctions = true;
  54      var $_lastAffectedRows = 0;
  55      var $uCaseTables = true; // for meta* functions, uppercase table names
  56      var $hasInsertID = true;
  57  
  58  
  59      function _insertid()
  60      {
  61          return ADOConnection::GetOne('VALUES IDENTITY_VAL_LOCAL()');
  62      }
  63  
  64  	function ADODB_db2()
  65      {
  66          $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
  67      }
  68  
  69          // returns true or false
  70  	function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
  71      {
  72          global $php_errormsg;
  73  
  74          if (!function_exists('db2_connect')) {
  75              ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension which is not installed.");
  76              return null;
  77          }
  78          // This needs to be set before the connect().
  79          // Replaces the odbc_binmode() call that was in Execute()
  80          ini_set('ibm_db2.binmode', $this->binmode);
  81  
  82          if ($argDatabasename && empty($argDSN)) {
  83  
  84              if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_connect($argDatabasename,null,null);
  85              else $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
  86          } else {
  87              if ($argDatabasename) $schema = $argDatabasename;
  88              if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_connect($argDSN,null,null);
  89              else $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword);
  90          }
  91          if (isset($php_errormsg)) $php_errormsg = '';
  92  
  93          // For db2_connect(), there is an optional 4th arg.  If present, it must be
  94          // an array of valid options.  So far, we don't use them.
  95  
  96          $this->_errorMsg = @db2_conn_errormsg();
  97          if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
  98  
  99          if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema");
 100          return $this->_connectionID != false;
 101      }
 102  
 103      // returns true or false
 104  	function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
 105      {
 106          global $php_errormsg;
 107  
 108          if (!function_exists('db2_connect')) return null;
 109  
 110          // This needs to be set before the connect().
 111          // Replaces the odbc_binmode() call that was in Execute()
 112          ini_set('ibm_db2.binmode', $this->binmode);
 113  
 114          if (isset($php_errormsg)) $php_errormsg = '';
 115          $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
 116  
 117          if ($argDatabasename && empty($argDSN)) {
 118  
 119              if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_pconnect($argDatabasename,null,null);
 120              else $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
 121          } else {
 122              if ($argDatabasename) $schema = $argDatabasename;
 123              if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_pconnect($argDSN,null,null);
 124              else $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword);
 125          }
 126          if (isset($php_errormsg)) $php_errormsg = '';
 127  
 128          $this->_errorMsg = @db2_conn_errormsg();
 129          if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
 130          if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
 131  
 132          if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema");
 133          return $this->_connectionID != false;
 134      }
 135  
 136      // format and return date string in database timestamp format
 137  	function DBTimeStamp($ts)
 138      {
 139          if (empty($ts) && $ts !== 0) return 'null';
 140          if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
 141          return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')";
 142      }
 143  
 144      // Format date column in sql string given an input format that understands Y M D
 145  	function SQLDate($fmt, $col=false)
 146      {
 147      // use right() and replace() ?
 148          if (!$col) $col = $this->sysDate;
 149  
 150          /* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */
 151          if ($fmt== 'Y-m-d H:i:s')
 152              return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')";
 153  
 154          $s = '';
 155  
 156          $len = strlen($fmt);
 157          for ($i=0; $i < $len; $i++) {
 158              if ($s) $s .= $this->concat_operator;
 159              $ch = $fmt[$i];
 160              switch($ch) {
 161              case 'Y':
 162              case 'y':
 163                  if ($len==1) return "year($col)";
 164                  $s .= "char(year($col))";
 165                  break;
 166              case 'M':
 167                  if ($len==1) return "monthname($col)";
 168                  $s .= "substr(monthname($col),1,3)";
 169                  break;
 170              case 'm':
 171                  if ($len==1) return "month($col)";
 172                  $s .= "right(digits(month($col)),2)";
 173                  break;
 174              case 'D':
 175              case 'd':
 176                  if ($len==1) return "day($col)";
 177                  $s .= "right(digits(day($col)),2)";
 178                  break;
 179              case 'H':
 180              case 'h':
 181                  if ($len==1) return "hour($col)";
 182                  if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
 183                  else $s .= "''";
 184                  break;
 185              case 'i':
 186              case 'I':
 187                  if ($len==1) return "minute($col)";
 188                  if ($col != $this->sysDate)
 189                      $s .= "right(digits(minute($col)),2)";
 190                      else $s .= "''";
 191                  break;
 192              case 'S':
 193              case 's':
 194                  if ($len==1) return "second($col)";
 195                  if ($col != $this->sysDate)
 196                      $s .= "right(digits(second($col)),2)";
 197                  else $s .= "''";
 198                  break;
 199              default:
 200                  if ($ch == '\\') {
 201                      $i++;
 202                      $ch = substr($fmt,$i,1);
 203                  }
 204                  $s .= $this->qstr($ch);
 205              }
 206          }
 207          return $s;
 208      }
 209  
 210  
 211  	function ServerInfo()
 212      {
 213          $row = $this->GetRow("SELECT service_level, fixpack_num FROM TABLE(sysproc.env_get_inst_info())
 214              as INSTANCEINFO");
 215  
 216  
 217          if ($row) {
 218              $info['version'] = $row[0].':'.$row[1];
 219              $info['fixpack'] = $row[1];
 220              $info['description'] = '';
 221          } else {
 222              return ADOConnection::ServerInfo();
 223          }
 224  
 225          return $info;
 226      }
 227  
 228  	function CreateSequence($seqname='adodbseq',$start=1)
 229      {
 230          if (empty($this->_genSeqSQL)) return false;
 231          $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start));
 232          if (!$ok) return false;
 233          return true;
 234      }
 235  
 236  	function DropSequence($seqname)
 237      {
 238          if (empty($this->_dropSeqSQL)) return false;
 239          return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
 240      }
 241  
 242  	function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
 243      {
 244          $nrows = (integer) $nrows;
 245          if ($offset <= 0) {
 246          // could also use " OPTIMIZE FOR $nrows ROWS "
 247              if ($nrows >= 0) $sql .=  " FETCH FIRST $nrows ROWS ONLY ";
 248              $rs = $this->Execute($sql,$inputArr);
 249          } else {
 250              if ($offset > 0 && $nrows < 0);
 251              else {
 252                  $nrows += $offset;
 253                  $sql .=  " FETCH FIRST $nrows ROWS ONLY ";
 254              }
 255              $rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
 256          }
 257  
 258          return $rs;
 259      }
 260  
 261      /*
 262          This algorithm is not very efficient, but works even if table locking
 263          is not available.
 264  
 265          Will return false if unable to generate an ID after $MAXLOOPS attempts.
 266      */
 267  	function GenID($seq='adodbseq',$start=1)
 268      {
 269          // if you have to modify the parameter below, your database is overloaded,
 270          // or you need to implement generation of id's yourself!
 271                  $num = $this->GetOne("VALUES NEXTVAL FOR $seq");
 272                  return $num;
 273      }
 274  
 275  
 276  	function ErrorMsg()
 277      {
 278          if ($this->_haserrorfunctions) {
 279              if ($this->_errorMsg !== false) return $this->_errorMsg;
 280              if (empty($this->_connectionID)) return @db2_conn_errormsg();
 281              return @db2_conn_errormsg($this->_connectionID);
 282          } else return ADOConnection::ErrorMsg();
 283      }
 284  
 285  	function ErrorNo()
 286      {
 287  
 288          if ($this->_haserrorfunctions) {
 289              if ($this->_errorCode !== false) {
 290                  // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
 291                  return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
 292              }
 293  
 294              if (empty($this->_connectionID)) $e = @db2_conn_error();
 295              else $e = @db2_conn_error($this->_connectionID);
 296  
 297               // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
 298               // so we check and patch
 299              if (strlen($e)<=2) return 0;
 300              return $e;
 301          } else return ADOConnection::ErrorNo();
 302      }
 303  
 304  
 305  
 306  	function BeginTrans()
 307      {
 308          if (!$this->hasTransactions) return false;
 309          if ($this->transOff) return true;
 310          $this->transCnt += 1;
 311          $this->_autocommit = false;
 312          return db2_autocommit($this->_connectionID,false);
 313      }
 314  
 315  	function CommitTrans($ok=true)
 316      {
 317          if ($this->transOff) return true;
 318          if (!$ok) return $this->RollbackTrans();
 319          if ($this->transCnt) $this->transCnt -= 1;
 320          $this->_autocommit = true;
 321          $ret = db2_commit($this->_connectionID);
 322          db2_autocommit($this->_connectionID,true);
 323          return $ret;
 324      }
 325  
 326  	function RollbackTrans()
 327      {
 328          if ($this->transOff) return true;
 329          if ($this->transCnt) $this->transCnt -= 1;
 330          $this->_autocommit = true;
 331          $ret = db2_rollback($this->_connectionID);
 332          db2_autocommit($this->_connectionID,true);
 333          return $ret;
 334      }
 335  
 336  	function MetaPrimaryKeys($table)
 337      {
 338      global $ADODB_FETCH_MODE;
 339  
 340          if ($this->uCaseTables) $table = strtoupper($table);
 341          $schema = '';
 342          $this->_findschema($table,$schema);
 343  
 344          $savem = $ADODB_FETCH_MODE;
 345          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 346          $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table);
 347  
 348          if (!$qid) {
 349              $ADODB_FETCH_MODE = $savem;
 350              return false;
 351          }
 352          $rs = new ADORecordSet_db2($qid);
 353          $ADODB_FETCH_MODE = $savem;
 354  
 355          if (!$rs) return false;
 356  
 357          $arr = $rs->GetArray();
 358          $rs->Close();
 359          $arr2 = array();
 360          for ($i=0; $i < sizeof($arr); $i++) {
 361              if ($arr[$i][3]) $arr2[] = $arr[$i][3];
 362          }
 363          return $arr2;
 364      }
 365  
 366  	function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
 367      {
 368      global $ADODB_FETCH_MODE;
 369  
 370          if ($this->uCaseTables) $table = strtoupper($table);
 371          $schema = '';
 372          $this->_findschema($table,$schema);
 373  
 374          $savem = $ADODB_FETCH_MODE;
 375          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 376          $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table);
 377          if (!$qid) {
 378              $ADODB_FETCH_MODE = $savem;
 379              return false;
 380          }
 381          $rs = new ADORecordSet_db2($qid);
 382  
 383          $ADODB_FETCH_MODE = $savem;
 384          /*
 385          $rs->fields indices
 386          0 PKTABLE_CAT
 387          1 PKTABLE_SCHEM
 388          2 PKTABLE_NAME
 389          3 PKCOLUMN_NAME
 390          4 FKTABLE_CAT
 391          5 FKTABLE_SCHEM
 392          6 FKTABLE_NAME
 393          7 FKCOLUMN_NAME
 394          */
 395          if (!$rs) return false;
 396  
 397          $foreign_keys = array();
 398          while (!$rs->EOF) {
 399              if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
 400                  if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]]))
 401                      $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array();
 402                  $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3];
 403              }
 404              $rs->MoveNext();
 405          }
 406  
 407          $rs->Close();
 408          return $foreign_key;
 409      }
 410  
 411  
 412  	function MetaTables($ttype=false,$schema=false)
 413      {
 414      global $ADODB_FETCH_MODE;
 415  
 416          $savem = $ADODB_FETCH_MODE;
 417          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 418          $qid = db2_tables($this->_connectionID);
 419  
 420          $rs = new ADORecordSet_db2($qid);
 421  
 422          $ADODB_FETCH_MODE = $savem;
 423          if (!$rs) {
 424              $false = false;
 425              return $false;
 426          }
 427  
 428          $arr = $rs->GetArray();
 429          $rs->Close();
 430          $arr2 = array();
 431  
 432          if ($ttype) {
 433              $isview = strncmp($ttype,'V',1) === 0;
 434          }
 435          for ($i=0; $i < sizeof($arr); $i++) {
 436              if (!$arr[$i][2]) continue;
 437              $type = $arr[$i][3];
 438              $owner = $arr[$i][1];
 439              $schemaval = ($schema) ? $arr[$i][1].'.' : '';
 440              if ($ttype) {
 441                  if ($isview) {
 442                      if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
 443                  } else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
 444              } else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
 445          }
 446          return $arr2;
 447      }
 448  
 449  /*
 450  See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp
 451  / SQL data type codes /
 452  #define    SQL_UNKNOWN_TYPE    0
 453  #define SQL_CHAR            1
 454  #define SQL_NUMERIC         2
 455  #define SQL_DECIMAL         3
 456  #define SQL_INTEGER         4
 457  #define SQL_SMALLINT        5
 458  #define SQL_FLOAT           6
 459  #define SQL_REAL            7
 460  #define SQL_DOUBLE          8
 461  #if (DB2VER >= 0x0300)
 462  #define SQL_DATETIME        9
 463  #endif
 464  #define SQL_VARCHAR        12
 465  
 466  
 467  / One-parameter shortcuts for date/time data types /
 468  #if (DB2VER >= 0x0300)
 469  #define SQL_TYPE_DATE      91
 470  #define SQL_TYPE_TIME      92
 471  #define SQL_TYPE_TIMESTAMP 93
 472  
 473  #define SQL_UNICODE                             (-95)
 474  #define SQL_UNICODE_VARCHAR                     (-96)
 475  #define SQL_UNICODE_LONGVARCHAR                 (-97)
 476  */
 477  	function DB2Types($t)
 478      {
 479          switch ((integer)$t) {
 480          case 1:
 481          case 12:
 482          case 0:
 483          case -95:
 484          case -96:
 485              return 'C';
 486          case -97:
 487          case -1: //text
 488              return 'X';
 489          case -4: //image
 490              return 'B';
 491  
 492          case 9:
 493          case 91:
 494              return 'D';
 495  
 496          case 10:
 497          case 11:
 498          case 92:
 499          case 93:
 500              return 'T';
 501  
 502          case 4:
 503          case 5:
 504          case -6:
 505              return 'I';
 506  
 507          case -11: // uniqidentifier
 508              return 'R';
 509          case -7: //bit
 510              return 'L';
 511  
 512          default:
 513              return 'N';
 514          }
 515      }
 516  
 517  	function MetaColumns($table, $normalize=true)
 518      {
 519      global $ADODB_FETCH_MODE;
 520  
 521          $false = false;
 522          if ($this->uCaseTables) $table = strtoupper($table);
 523          $schema = '';
 524          $this->_findschema($table,$schema);
 525  
 526          $savem = $ADODB_FETCH_MODE;
 527          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 528  
 529              $colname = "%";
 530              $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname);
 531          if (empty($qid)) return $false;
 532  
 533          $rs = new ADORecordSet_db2($qid);
 534          $ADODB_FETCH_MODE = $savem;
 535  
 536          if (!$rs) return $false;
 537          $rs->_fetch();
 538  
 539          $retarr = array();
 540  
 541          /*
 542          $rs->fields indices
 543          0 TABLE_QUALIFIER
 544          1 TABLE_SCHEM
 545          2 TABLE_NAME
 546          3 COLUMN_NAME
 547          4 DATA_TYPE
 548          5 TYPE_NAME
 549          6 PRECISION
 550          7 LENGTH
 551          8 SCALE
 552          9 RADIX
 553          10 NULLABLE
 554          11 REMARKS
 555          */
 556          while (!$rs->EOF) {
 557              if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
 558                  $fld = new ADOFieldObject();
 559                  $fld->name = $rs->fields[3];
 560                  $fld->type = $this->DB2Types($rs->fields[4]);
 561  
 562                  // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
 563                  // access uses precision to store length for char/varchar
 564                  if ($fld->type == 'C' or $fld->type == 'X') {
 565                      if ($rs->fields[4] <= -95) // UNICODE
 566                          $fld->max_length = $rs->fields[7]/2;
 567                      else
 568                          $fld->max_length = $rs->fields[7];
 569                  } else
 570                      $fld->max_length = $rs->fields[7];
 571                  $fld->not_null = !empty($rs->fields[10]);
 572                  $fld->scale = $rs->fields[8];
 573                  $fld->primary_key = false;
 574                  $retarr[strtoupper($fld->name)] = $fld;
 575              } else if (sizeof($retarr)>0)
 576                  break;
 577              $rs->MoveNext();
 578          }
 579          $rs->Close();
 580          if (empty($retarr)) $retarr = false;
 581  
 582            $qid = db2_primary_keys($this->_connectionID, "", $schema, $table);
 583          if (empty($qid)) return $false;
 584  
 585          $rs = new ADORecordSet_db2($qid);
 586          $ADODB_FETCH_MODE = $savem;
 587  
 588          if (!$rs) return $retarr;
 589          $rs->_fetch();
 590  
 591          /*
 592          $rs->fields indices
 593          0 TABLE_CAT
 594          1 TABLE_SCHEM
 595          2 TABLE_NAME
 596          3 COLUMN_NAME
 597          4 KEY_SEQ
 598          5 PK_NAME
 599          */
 600          while (!$rs->EOF) {
 601              if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
 602                  $retarr[strtoupper($rs->fields[3])]->primary_key = true;
 603              } else if (sizeof($retarr)>0)
 604                  break;
 605              $rs->MoveNext();
 606          }
 607          $rs->Close();
 608  
 609          if (empty($retarr)) $retarr = false;
 610          return $retarr;
 611      }
 612  
 613  
 614  	function Prepare($sql)
 615      {
 616          if (! $this->_bindInputArray) return $sql; // no binding
 617          $stmt = db2_prepare($this->_connectionID,$sql);
 618          if (!$stmt) {
 619              // we don't know whether db2 driver is parsing prepared stmts, so just return sql
 620              return $sql;
 621          }
 622          return array($sql,$stmt,false);
 623      }
 624  
 625      /* returns queryID or false */
 626  	function _query($sql,$inputarr=false)
 627      {
 628      GLOBAL $php_errormsg;
 629          if (isset($php_errormsg)) $php_errormsg = '';
 630          $this->_error = '';
 631  
 632          if ($inputarr) {
 633              if (is_array($sql)) {
 634                  $stmtid = $sql[1];
 635              } else {
 636                  $stmtid = db2_prepare($this->_connectionID,$sql);
 637  
 638                  if ($stmtid == false) {
 639                      $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
 640                      return false;
 641                  }
 642              }
 643  
 644              if (! db2_execute($stmtid,$inputarr)) {
 645                  if ($this->_haserrorfunctions) {
 646                      $this->_errorMsg = db2_stmt_errormsg();
 647                      $this->_errorCode = db2_stmt_error();
 648                  }
 649                  return false;
 650              }
 651  
 652          } else if (is_array($sql)) {
 653              $stmtid = $sql[1];
 654              if (!db2_execute($stmtid)) {
 655                  if ($this->_haserrorfunctions) {
 656                      $this->_errorMsg = db2_stmt_errormsg();
 657                      $this->_errorCode = db2_stmt_error();
 658                  }
 659                  return false;
 660              }
 661          } else
 662              $stmtid = @db2_exec($this->_connectionID,$sql);
 663  
 664          $this->_lastAffectedRows = 0;
 665          if ($stmtid) {
 666              if (@db2_num_fields($stmtid) == 0) {
 667                  $this->_lastAffectedRows = db2_num_rows($stmtid);
 668                  $stmtid = true;
 669              } else {
 670                  $this->_lastAffectedRows = 0;
 671              }
 672  
 673              if ($this->_haserrorfunctions) {
 674                  $this->_errorMsg = '';
 675                  $this->_errorCode = 0;
 676              } else
 677                  $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
 678          } else {
 679              if ($this->_haserrorfunctions) {
 680                  $this->_errorMsg = db2_stmt_errormsg();
 681                  $this->_errorCode = db2_stmt_error();
 682              } else
 683                  $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
 684  
 685          }
 686          return $stmtid;
 687      }
 688  
 689      /*
 690          Insert a null into the blob field of the table first.
 691          Then use UpdateBlob to store the blob.
 692  
 693          Usage:
 694  
 695          $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
 696          $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
 697      */
 698  	function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
 699      {
 700          return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
 701      }
 702  
 703      // returns true or false
 704  	function _close()
 705      {
 706          $ret = @db2_close($this->_connectionID);
 707          $this->_connectionID = false;
 708          return $ret;
 709      }
 710  
 711  	function _affectedrows()
 712      {
 713          return $this->_lastAffectedRows;
 714      }
 715  
 716  }
 717  
 718  /*--------------------------------------------------------------------------------------
 719       Class Name: Recordset
 720  --------------------------------------------------------------------------------------*/
 721  
 722  class ADORecordSet_db2 extends ADORecordSet {
 723  
 724      var $bind = false;
 725      var $databaseType = "db2";
 726      var $dataProvider = "db2";
 727      var $useFetchArray;
 728  
 729  	function ADORecordSet_db2($id,$mode=false)
 730      {
 731          if ($mode === false) {
 732              global $ADODB_FETCH_MODE;
 733              $mode = $ADODB_FETCH_MODE;
 734          }
 735          $this->fetchMode = $mode;
 736  
 737          $this->_queryID = $id;
 738      }
 739  
 740  
 741      // returns the field object
 742  	function FetchField($offset = -1)
 743      {
 744          $o= new ADOFieldObject();
 745          $o->name = @db2_field_name($this->_queryID,$offset);
 746          $o->type = @db2_field_type($this->_queryID,$offset);
 747          $o->max_length = db2_field_width($this->_queryID,$offset);
 748          if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
 749          else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
 750          return $o;
 751      }
 752  
 753      /* Use associative array to get fields array */
 754  	function Fields($colname)
 755      {
 756          if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
 757          if (!$this->bind) {
 758              $this->bind = array();
 759              for ($i=0; $i < $this->_numOfFields; $i++) {
 760                  $o = $this->FetchField($i);
 761                  $this->bind[strtoupper($o->name)] = $i;
 762              }
 763          }
 764  
 765           return $this->fields[$this->bind[strtoupper($colname)]];
 766      }
 767  
 768  
 769  	function _initrs()
 770      {
 771      global $ADODB_COUNTRECS;
 772          $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1;
 773          $this->_numOfFields = @db2_num_fields($this->_queryID);
 774          // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
 775          if ($this->_numOfRows == 0) $this->_numOfRows = -1;
 776      }
 777  
 778  	function _seek($row)
 779      {
 780          return false;
 781      }
 782  
 783      // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
 784  	function GetArrayLimit($nrows,$offset=-1)
 785      {
 786          if ($offset <= 0) {
 787              $rs = $this->GetArray($nrows);
 788              return $rs;
 789          }
 790          $savem = $this->fetchMode;
 791          $this->fetchMode = ADODB_FETCH_NUM;
 792          $this->Move($offset);
 793          $this->fetchMode = $savem;
 794  
 795          if ($this->fetchMode & ADODB_FETCH_ASSOC) {
 796              $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
 797          }
 798  
 799          $results = array();
 800          $cnt = 0;
 801          while (!$this->EOF && $nrows != $cnt) {
 802              $results[$cnt++] = $this->fields;
 803              $this->MoveNext();
 804          }
 805  
 806          return $results;
 807      }
 808  
 809  
 810  	function MoveNext()
 811      {
 812          if ($this->_numOfRows != 0 && !$this->EOF) {
 813              $this->_currentRow++;
 814  
 815              $this->fields = @db2_fetch_array($this->_queryID);
 816              if ($this->fields) {
 817                  if ($this->fetchMode & ADODB_FETCH_ASSOC) {
 818                      $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
 819                  }
 820                  return true;
 821              }
 822          }
 823          $this->fields = false;
 824          $this->EOF = true;
 825          return false;
 826      }
 827  
 828  	function _fetch()
 829      {
 830  
 831          $this->fields = db2_fetch_array($this->_queryID);
 832          if ($this->fields) {
 833              if ($this->fetchMode & ADODB_FETCH_ASSOC) {
 834                  $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
 835              }
 836              return true;
 837          }
 838          $this->fields = false;
 839          return false;
 840      }
 841  
 842  	function _close()
 843      {
 844          return @db2_free_result($this->_queryID);
 845      }
 846  
 847  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1