source: Dev/trunk/rdfapi/util/adodb/drivers/adodb-pdo.inc.php @ 12

Last change on this file since 12 was 12, checked in by basvannuland, 14 years ago

Added RAP RDF API
Added RDF reader writer for save and load survey

File size: 13.8 KB
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.