source: branches/comu-ver2/data/module/adodb/drivers/adodb-db2.inc.php @ 18701

Revision 18701, 20.5 KB checked in by nanasess, 14 years ago (diff)

Copyright の更新(#601)

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