source: sandbox/trunk.old/phpgwapi/inc/adodb/drivers/adodb-pdo.inc.php @ 34

Revision 34, 13.2 KB checked in by niltonneto, 17 years ago (diff)

Versão nova do ADODB (4.5 para 4.95)

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2/*
3V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). 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.
7Set tabs to 4 for best viewing.
8 
9  Latest version is available at http://adodb.sourceforge.net
10 
11  Requires ODBC. Works on Windows and Unix.
12
13        Problems:
14                Where is float/decimal type in pdo_param_type
15                LOB handling for CLOB/BLOB differs significantly
16*/
17// security - hide paths
18if (!defined('ADODB_DIR')) die();
19
20
21/*
22enum pdo_param_type {
23PDO::PARAM_NULL, 0
24
25/* int as in long (the php native int type).
26 * If you mark a column as an int, PDO expects get_col to return
27 * a pointer to a long
28PDO::PARAM_INT, 1
29
30/* get_col ptr should point to start of the string buffer
31PDO::PARAM_STR, 2
32
33/* get_col: when len is 0 ptr should point to a php_stream *,
34 * otherwise it should behave like a string. Indicate a NULL field
35 * value by setting the ptr to NULL
36PDO::PARAM_LOB, 3
37
38/* get_col: will expect the ptr to point to a new PDOStatement object handle,
39 * but this isn't wired up yet
40PDO::PARAM_STMT, 4 /* hierarchical result set
41
42/* get_col ptr should point to a zend_bool
43PDO::PARAM_BOOL, 5
44
45
46/* magic flag to denote a parameter as being input/output
47PDO::PARAM_INPUT_OUTPUT = 0x80000000
48};
49*/
50       
51function adodb_pdo_type($t)
52{
53        switch($t) {
54        case 2: return 'VARCHAR';
55        case 3: return 'BLOB';
56        default: return 'NUMERIC';
57        }
58}
59         
60/*--------------------------------------------------------------------------------------
61--------------------------------------------------------------------------------------*/
62
63////////////////////////////////////////////////
64
65
66
67class ADODB_pdo_base extends ADODB_pdo {
68
69        var $sysDate = "'?'";
70        var $sysTimeStamp = "'?'";
71       
72
73        function _init($parentDriver)
74        {
75                $parentDriver->_bindInputArray = true;
76                #$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
77        }
78       
79        function ServerInfo()
80        {
81                return ADOConnection::ServerInfo();
82        }
83       
84        function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
85        {
86                $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
87                return $ret;
88        }
89       
90        function MetaTables()
91        {
92                return false;
93        }
94       
95        function MetaColumns()
96        {
97                return false;
98        }
99}
100
101
102class ADODB_pdo extends ADOConnection {
103        var $databaseType = "pdo";     
104        var $dataProvider = "pdo";
105        var $fmtDate = "'Y-m-d'";
106        var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
107        var $replaceQuote = "''"; // string to use to replace quotes
108        var $hasAffectedRows = true;
109        var $_bindInputArray = true;   
110        var $_genSeqSQL = "create table %s (id integer)";
111        var $_autocommit = true;
112        var $_haserrorfunctions = true;
113        var $_lastAffectedRows = 0;
114       
115        var $_errormsg = false;
116        var $_errorno = false;
117       
118        var $dsnType = '';
119        var $stmt = false;
120       
121        function ADODB_pdo()
122        {
123        }
124       
125        function _UpdatePDO()
126        {
127                $d = &$this->_driver;
128                $this->fmtDate = $d->fmtDate;
129                $this->fmtTimeStamp = $d->fmtTimeStamp;
130                $this->replaceQuote = $d->replaceQuote;
131                $this->sysDate = $d->sysDate;
132                $this->sysTimeStamp = $d->sysTimeStamp;
133                $this->random = $d->random;
134                $this->concat_operator = $d->concat_operator;
135                $this->nameQuote = $d->nameQuote;
136                               
137                $this->hasGenID = $d->hasGenID;
138                $this->_genIDSQL = $d->_genIDSQL;
139                $this->_genSeqSQL = $d->_genSeqSQL;
140                $this->_dropSeqSQL = $d->_dropSeqSQL;
141
142                $d->_init($this);
143        }
144       
145        function Time()
146        {
147                if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual";
148                else $sql = "select $this->sysTimeStamp";
149               
150                $rs =& $this->_Execute($sql);
151                if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
152               
153                return false;
154        }
155       
156        // returns true or false
157        function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
158        {
159                $at = strpos($argDSN,':');
160                $this->dsnType = substr($argDSN,0,$at);
161
162                if ($argDatabasename) {
163                        $argDSN .= ';dbname='.$argDatabasename;
164                }
165                try {
166                        $this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
167                } catch (Exception $e) {
168                        $this->_connectionID = false;
169                        $this->_errorno = -1;
170                        //var_dump($e);
171                        $this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
172                        return false;
173                }
174               
175                if ($this->_connectionID) {
176                        switch(ADODB_ASSOC_CASE){
177                        case 0: $m = PDO::CASE_LOWER; break;
178                        case 1: $m = PDO::CASE_UPPER; break;
179                        default:
180                        case 2: $m = PDO::CASE_NATURAL; break;
181                        }
182                       
183                        //$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
184                        $this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);
185                       
186                        $class = 'ADODB_pdo_'.$this->dsnType;
187                        //$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
188                        switch($this->dsnType) {
189                        case 'oci':
190                        case 'mysql':
191                        case 'pgsql':
192                        case 'mssql':
193                                include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
194                                break;
195                        }
196                        if (class_exists($class))
197                                $this->_driver = new $class();
198                        else
199                                $this->_driver = new ADODB_pdo_base();
200                       
201                        $this->_driver->_connectionID = $this->_connectionID;
202                        $this->_UpdatePDO();
203                        return true;
204                }
205                $this->_driver = new ADODB_pdo_base();
206                return false;
207        }
208       
209        // returns true or false
210        function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
211        {
212                return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
213        }
214       
215        /*------------------------------------------------------------------------------*/
216       
217       
218        function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
219        {       
220                $save = $this->_driver->fetchMode;
221                $this->_driver->fetchMode = $this->fetchMode;
222                $this->_driver->debug = $this->debug;
223                $ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
224                $this->_driver->fetchMode = $save;
225                return $ret;
226        }
227       
228       
229        function ServerInfo()
230        {
231                return $this->_driver->ServerInfo();
232        }
233       
234        function MetaTables($ttype=false,$showSchema=false,$mask=false)
235        {
236                return $this->_driver->MetaTables($ttype,$showSchema,$mask);
237        }
238       
239        function MetaColumns($table,$normalize=true)
240        {
241                return $this->_driver->MetaColumns($table,$normalize);
242        }
243       
244        function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
245        {
246                $obj = $stmt[1];
247                if ($type) $obj->bindParam($name,$var,$type,$maxLen);
248                else $obj->bindParam($name, $var);
249        }
250       
251       
252        function ErrorMsg()
253        {
254                if ($this->_errormsg !== false) return $this->_errormsg;
255                if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo();
256                else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo();
257                else return 'No Connection Established';
258               
259               
260                if ($arr) {
261                        if (sizeof($arr)<2) return '';
262                        if ((integer)$arr[1]) return $arr[2];
263                        else return '';
264                } else return '-1';
265        }
266       
267
268        function ErrorNo()
269        {
270                if ($this->_errorno !== false) return $this->_errorno;
271                if (!empty($this->_stmt)) $err = $this->_stmt->errorCode();
272                else if (!empty($this->_connectionID)) {
273                        $arr = $this->_connectionID->errorInfo();
274                        if (isset($arr[0])) $err = $arr[0];
275                        else $err = -1;
276                } else
277                        return 0;
278                       
279                if ($err == '00000') return 0; // allows empty check
280                return $err;
281        }
282
283        function BeginTrans()
284        {       
285                if (!$this->hasTransactions) return false;
286                if ($this->transOff) return true;
287                $this->transCnt += 1;
288                $this->_autocommit = false;
289                $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
290                return $this->_connectionID->beginTransaction();
291        }
292       
293        function CommitTrans($ok=true)
294        {
295                if (!$this->hasTransactions) return false;
296                if ($this->transOff) return true;
297                if (!$ok) return $this->RollbackTrans();
298                if ($this->transCnt) $this->transCnt -= 1;
299                $this->_autocommit = true;
300               
301                $ret = $this->_connectionID->commit();
302                $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
303                return $ret;
304        }
305       
306        function RollbackTrans()
307        {
308                if (!$this->hasTransactions) return false;
309                if ($this->transOff) return true;
310                if ($this->transCnt) $this->transCnt -= 1;
311                $this->_autocommit = true;
312               
313                $ret = $this->_connectionID->rollback();
314                $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
315                return $ret;
316        }
317       
318        function Prepare($sql)
319        {
320                $this->_stmt = $this->_connectionID->prepare($sql);
321                if ($this->_stmt) return array($sql,$this->_stmt);
322               
323                return false;
324        }
325       
326        function PrepareStmt($sql)
327        {
328                $stmt = $this->_connectionID->prepare($sql);
329                if (!$stmt) return false;
330                $obj = new ADOPDOStatement($stmt,$this);
331                return $obj;
332        }
333       
334       
335        /* returns queryID or false */
336        function _query($sql,$inputarr=false)
337        {
338                if (is_array($sql)) {
339                        $stmt = $sql[1];
340                } else {
341                        $stmt = $this->_connectionID->prepare($sql);
342                }
343                #adodb_backtrace();
344                #var_dump($this->_bindInputArray);
345                if ($stmt) {
346                        $this->_driver->debug = $this->debug;
347                        if ($inputarr) $ok = $stmt->execute($inputarr);
348                        else $ok = $stmt->execute();
349                }
350               
351               
352                $this->_errormsg = false;
353                $this->_errorno = false;
354                       
355                if ($ok) {
356                        $this->_stmt = $stmt;
357                        return $stmt;
358                }
359               
360                if ($stmt) {
361                       
362                        $arr = $stmt->errorinfo();
363                        if ((integer)$arr[1]) {
364                                $this->_errormsg = $arr[2];
365                                $this->_errorno = $arr[1];
366                        }
367
368                } else {
369                        $this->_errormsg = false;
370                        $this->_errorno = false;
371                }
372                return false;
373        }
374
375        // returns true or false
376        function _close()
377        {
378                $this->_stmt = false;
379                return true;
380        }
381
382        function _affectedrows()
383        {
384                return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
385        }
386       
387        function _insertid()
388        {
389                return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
390        }
391}
392
393class ADOPDOStatement {
394
395        var $databaseType = "pdo";             
396        var $dataProvider = "pdo";
397        var $_stmt;
398        var $_connectionID;
399       
400        function ADOPDOStatement($stmt,$connection)
401        {
402                $this->_stmt = $stmt;
403                $this->_connectionID = $connection;
404        }
405       
406        function Execute($inputArr=false)
407        {
408                $savestmt = $this->_connectionID->_stmt;
409                $rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
410                $this->_connectionID->_stmt = $savestmt;
411                return $rs;
412        }
413       
414        function InParameter(&$var,$name,$maxLen=4000,$type=false)
415        {
416
417                if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen);
418                else $this->_stmt->bindParam($name, $var);
419        }
420       
421        function Affected_Rows()
422        {
423                return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
424        }
425       
426        function ErrorMsg()
427        {
428                if ($this->_stmt) $arr = $this->_stmt->errorInfo();
429                else $arr = $this->_connectionID->errorInfo();
430
431                if (is_array($arr)) {
432                        if ((integer) $arr[0] && isset($arr[2])) return $arr[2];
433                        else return '';
434                } else return '-1';
435        }
436       
437        function NumCols()
438        {
439                return ($this->_stmt) ? $this->_stmt->columnCount() : 0;
440        }
441       
442        function ErrorNo()
443        {
444                if ($this->_stmt) return $this->_stmt->errorCode();
445                else return $this->_connectionID->errorInfo();
446        }
447}
448
449/*--------------------------------------------------------------------------------------
450         Class Name: Recordset
451--------------------------------------------------------------------------------------*/
452
453class ADORecordSet_pdo extends ADORecordSet {   
454       
455        var $bind = false;
456        var $databaseType = "pdo";             
457        var $dataProvider = "pdo";
458       
459        function ADORecordSet_pdo($id,$mode=false)
460        {
461                if ($mode === false) { 
462                        global $ADODB_FETCH_MODE;
463                        $mode = $ADODB_FETCH_MODE;
464                }
465                $this->adodbFetchMode = $mode;
466                switch($mode) {
467                case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
468                case ADODB_FETCH_ASSOC:  $mode = PDO::FETCH_ASSOC; break;
469               
470                case ADODB_FETCH_BOTH:
471                default: $mode = PDO::FETCH_BOTH; break;
472                }
473                $this->fetchMode = $mode;
474               
475                $this->_queryID = $id;
476                $this->ADORecordSet($id);
477        }
478
479       
480        function Init()
481        {
482                if ($this->_inited) return;
483                $this->_inited = true;
484                if ($this->_queryID) @$this->_initrs();
485                else {
486                        $this->_numOfRows = 0;
487                        $this->_numOfFields = 0;
488                }
489                if ($this->_numOfRows != 0 && $this->_currentRow == -1) {
490                        $this->_currentRow = 0;
491                        if ($this->EOF = ($this->_fetch() === false)) {
492                                $this->_numOfRows = 0; // _numOfRows could be -1
493                        }
494                } else {
495                        $this->EOF = true;
496                }
497        }
498       
499        function _initrs()
500        {
501        global $ADODB_COUNTRECS;
502       
503                $this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
504                if (!$this->_numOfRows) $this->_numOfRows = -1;
505                $this->_numOfFields = $this->_queryID->columnCount();
506        }
507
508        // returns the field object
509        function &FetchField($fieldOffset = -1)
510        {
511                $off=$fieldOffset+1; // offsets begin at 1
512               
513                $o= new ADOFieldObject();
514                $arr = @$this->_queryID->getColumnMeta($fieldOffset);
515                if (!$arr) {
516                        $o->name = 'bad getColumnMeta()';
517                        $o->max_length = -1;
518                        $o->type = 'VARCHAR';
519                        $o->precision = 0;
520        #               $false = false;
521                        return $o;
522                }
523                //adodb_pr($arr);
524                $o->name = $arr['name'];
525                if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type'];
526                else $o->type = adodb_pdo_type($arr['pdo_type']);
527                $o->max_length = $arr['len'];
528                $o->precision = $arr['precision'];
529               
530                if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
531                else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
532                return $o;
533        }
534       
535        function _seek($row)
536        {
537                return false;
538        }
539       
540        function _fetch()
541        {
542                if (!$this->_queryID) return false;
543               
544                $this->fields = $this->_queryID->fetch($this->fetchMode);
545                return !empty($this->fields);
546        }
547       
548        function _close()
549        {
550                $this->_queryID = false;
551        }
552       
553        function Fields($colname)
554        {
555                if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname];
556               
557                if (!$this->bind) {
558                        $this->bind = array();
559                        for ($i=0; $i < $this->_numOfFields; $i++) {
560                                $o = $this->FetchField($i);
561                                $this->bind[strtoupper($o->name)] = $i;
562                        }
563                }
564                 return $this->fields[$this->bind[strtoupper($colname)]];
565        }
566
567}
568
569?>
Note: See TracBrowser for help on using the repository browser.