source: sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/drivers/adodb-ado5.inc.php @ 8222

Revision 8222, 17.1 KB checked in by angelo, 11 years ago (diff)

Ticket #3491 - Compatibilizar Expresso com novas versoes do PHP

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