source: trunk/phpgwapi/inc/adodb/drivers/adodb-ado.inc.php @ 2

Revision 2, 15.1 KB checked in by niltonneto, 17 years ago (diff)

Removida todas as tags usadas pelo CVS ($Id, $Source).
Primeira versão no CVS externo.

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