]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-mysql.inc.php
new ADODB library 4.22 with multiple drivers (not only mysql as before), major change...
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / drivers / adodb-mysql.inc.php
1 <?php\r
2 /*\r
3 V4.22 15 Apr 2004  (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.\r
4   Released under both BSD license and Lesser GPL library license. \r
5   Whenever there is any discrepancy between the two licenses, \r
6   the BSD license will take precedence.\r
7   Set tabs to 8.\r
8   \r
9   MySQL code that does not support transactions. Use mysqlt if you need transactions.\r
10   Requires mysql client. Works on Windows and Unix.\r
11   \r
12  28 Feb 2001: MetaColumns bug fix - suggested by  Freek Dijkstra (phpeverywhere@macfreek.com)\r
13 */ \r
14 \r
15 if (! defined("_ADODB_MYSQL_LAYER")) {\r
16  define("_ADODB_MYSQL_LAYER", 1 );\r
17 \r
18 class ADODB_mysql extends ADOConnection {\r
19         var $databaseType = 'mysql';\r
20         var $dataProvider = 'mysql';\r
21         var $hasInsertID = true;\r
22         var $hasAffectedRows = true;    \r
23         var $metaTablesSQL = "SHOW TABLES";     \r
24         var $metaColumnsSQL = "SHOW COLUMNS FROM %s";\r
25         var $fmtTimeStamp = "'Y-m-d H:i:s'";\r
26         var $hasLimit = true;\r
27         var $hasMoveFirst = true;\r
28         var $hasGenID = true;\r
29         var $upperCase = 'upper';\r
30         var $isoDates = true; // accepts dates in ISO format\r
31         var $sysDate = 'CURDATE()';\r
32         var $sysTimeStamp = 'NOW()';\r
33         var $hasTransactions = false;\r
34         var $forceNewConnect = false;\r
35         var $poorAffectedRows = true;\r
36         var $clientFlags = 0;\r
37         var $substr = "substring";\r
38         var $nameQuote = '`';           /// string to use to quote identifiers and names\r
39         \r
40         function ADODB_mysql() \r
41         {                       \r
42         }\r
43         \r
44         function ServerInfo()\r
45         {\r
46                 $arr['description'] = ADOConnection::GetOne("select version()");\r
47                 $arr['version'] = ADOConnection::_findvers($arr['description']);\r
48                 return $arr;\r
49         }\r
50         \r
51         function IfNull( $field, $ifNull ) \r
52         {\r
53                 return " IFNULL($field, $ifNull) "; // if MySQL\r
54         }\r
55         \r
56         function &MetaTables($ttype=false,$showSchema=false,$mask=false) \r
57         {       \r
58                 if ($mask) {\r
59                         $save = $this->metaTablesSQL;\r
60                         $mask = $this->qstr($mask);\r
61                         $this->metaTablesSQL .= " like $mask";\r
62                 }\r
63                 $ret =& ADOConnection::MetaTables($ttype,$showSchema);\r
64                 \r
65                 if ($mask) {\r
66                         $this->metaTablesSQL = $save;\r
67                 }\r
68                 return $ret;\r
69         }\r
70         \r
71         \r
72         function &MetaIndexes ($table, $primary = FALSE, $owner=false)\r
73         {\r
74         // save old fetch mode\r
75         global $ADODB_FETCH_MODE;\r
76         \r
77         $save = $ADODB_FETCH_MODE;\r
78         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;\r
79         if ($this->fetchMode !== FALSE) {\r
80                $savem = $this->SetFetchMode(FALSE);\r
81         }\r
82         \r
83         // get index details\r
84         $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));\r
85         \r
86         // restore fetchmode\r
87         if (isset($savem)) {\r
88                 $this->SetFetchMode($savem);\r
89         }\r
90         $ADODB_FETCH_MODE = $save;\r
91         \r
92         if (!is_object($rs)) {\r
93                 return FALSE;\r
94         }\r
95         \r
96         $indexes = array ();\r
97         \r
98         // parse index data into array\r
99         while ($row = $rs->FetchRow()) {\r
100                 if ($primary == FALSE AND $row[2] == 'PRIMARY') {\r
101                         continue;\r
102                 }\r
103                 \r
104                 if (!isset($indexes[$row[2]])) {\r
105                         $indexes[$row[2]] = array(\r
106                                 'unique' => ($row[1] == 0),\r
107                                 'columns' => array()\r
108                         );\r
109                 }\r
110                 \r
111                 $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];\r
112         }\r
113         \r
114         // sort columns by order in the index\r
115         foreach ( array_keys ($indexes) as $index )\r
116         {\r
117                 ksort ($indexes[$index]['columns']);\r
118         }\r
119         \r
120         return $indexes;\r
121         }\r
122 \r
123         \r
124         // if magic quotes disabled, use mysql_real_escape_string()\r
125         function qstr($s,$magic_quotes=false)\r
126         {\r
127                 if (!$magic_quotes) {\r
128                 \r
129                         if (ADODB_PHPVER >= 0x4300) {\r
130                                 if (is_resource($this->_connectionID))\r
131                                         return "'".mysql_real_escape_string($s,$this->_connectionID)."'";\r
132                         }\r
133                         if ($this->replaceQuote[0] == '\\'){\r
134                                 $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);\r
135                         }\r
136                         return  "'".str_replace("'",$this->replaceQuote,$s)."'"; \r
137                 }\r
138                 \r
139                 // undo magic quotes for "\r
140                 $s = str_replace('\\"','"',$s);\r
141                 return "'$s'";\r
142         }\r
143         \r
144         function _insertid()\r
145         {\r
146                 return mysql_insert_id($this->_connectionID);\r
147         }\r
148         \r
149         function GetOne($sql,$inputarr=false)\r
150         {\r
151                 $rs =& $this->SelectLimit($sql,1,-1,$inputarr);\r
152                 if ($rs) {\r
153                         $rs->Close();\r
154                         if ($rs->EOF) return false;\r
155                         return reset($rs->fields);\r
156                 }\r
157                 \r
158                 return false;\r
159         }\r
160         \r
161         function _affectedrows()\r
162         {\r
163                         return mysql_affected_rows($this->_connectionID);\r
164         }\r
165   \r
166         // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html\r
167         // Reference on Last_Insert_ID on the recommended way to simulate sequences\r
168         var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";\r
169         var $_genSeqSQL = "create table %s (id int not null)";\r
170         var $_genSeq2SQL = "insert into %s values (%s)";\r
171         var $_dropSeqSQL = "drop table %s";\r
172         \r
173         function CreateSequence($seqname='adodbseq',$startID=1)\r
174         {\r
175                 if (empty($this->_genSeqSQL)) return false;\r
176                 $u = strtoupper($seqname);\r
177                 \r
178                 $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));\r
179                 if (!$ok) return false;\r
180                 return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));\r
181         }\r
182         \r
183 \r
184         function GenID($seqname='adodbseq',$startID=1)\r
185         {\r
186                 // post-nuke sets hasGenID to false\r
187                 if (!$this->hasGenID) return false;\r
188                 \r
189                 $savelog = $this->_logsql;\r
190                 $this->_logsql = false;\r
191                 $getnext = sprintf($this->_genIDSQL,$seqname);\r
192                 $holdtransOK = $this->_transOK; // save the current status\r
193                 $rs = @$this->Execute($getnext);\r
194                 if (!$rs) {\r
195                         if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset\r
196                         $u = strtoupper($seqname);\r
197                         $this->Execute(sprintf($this->_genSeqSQL,$seqname));\r
198                         $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));\r
199                         $rs = $this->Execute($getnext);\r
200                 }\r
201                 $this->genID = mysql_insert_id($this->_connectionID);\r
202                 \r
203                 if ($rs) $rs->Close();\r
204                 \r
205                 $this->_logsql = $savelog;\r
206                 return $this->genID;\r
207         }\r
208         \r
209         function &MetaDatabases()\r
210         {\r
211                 $qid = mysql_list_dbs($this->_connectionID);\r
212                 $arr = array();\r
213                 $i = 0;\r
214                 $max = mysql_num_rows($qid);\r
215                 while ($i < $max) {\r
216                         $db = mysql_tablename($qid,$i);\r
217                         if ($db != 'mysql') $arr[] = $db;\r
218                         $i += 1;\r
219                 }\r
220                 return $arr;\r
221         }\r
222         \r
223                 \r
224         // Format date column in sql string given an input format that understands Y M D\r
225         function SQLDate($fmt, $col=false)\r
226         {       \r
227                 if (!$col) $col = $this->sysTimeStamp;\r
228                 $s = 'DATE_FORMAT('.$col.",'";\r
229                 $concat = false;\r
230                 $len = strlen($fmt);\r
231                 for ($i=0; $i < $len; $i++) {\r
232                         $ch = $fmt[$i];\r
233                         switch($ch) {\r
234                         case 'Y':\r
235                         case 'y':\r
236                                 $s .= '%Y';\r
237                                 break;\r
238                         case 'Q':\r
239                         case 'q':\r
240                                 $s .= "'),Quarter($col)";\r
241                                 \r
242                                 if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";\r
243                                 else $s .= ",('";\r
244                                 $concat = true;\r
245                                 break;\r
246                         case 'M':\r
247                                 $s .= '%b';\r
248                                 break;\r
249                                 \r
250                         case 'm':\r
251                                 $s .= '%m';\r
252                                 break;\r
253                         case 'D':\r
254                         case 'd':\r
255                                 $s .= '%d';\r
256                                 break;\r
257                         \r
258                         case 'H': \r
259                                 $s .= '%H';\r
260                                 break;\r
261                                 \r
262                         case 'h':\r
263                                 $s .= '%I';\r
264                                 break;\r
265                                 \r
266                         case 'i':\r
267                                 $s .= '%i';\r
268                                 break;\r
269                                 \r
270                         case 's':\r
271                                 $s .= '%s';\r
272                                 break;\r
273                                 \r
274                         case 'a':\r
275                         case 'A':\r
276                                 $s .= '%p';\r
277                                 break;\r
278                                 \r
279                         default:\r
280                                 \r
281                                 if ($ch == '\\') {\r
282                                         $i++;\r
283                                         $ch = substr($fmt,$i,1);\r
284                                 }\r
285                                 $s .= $ch;\r
286                                 break;\r
287                         }\r
288                 }\r
289                 $s.="')";\r
290                 if ($concat) $s = "CONCAT($s)";\r
291                 return $s;\r
292         }\r
293         \r
294 \r
295         // returns concatenated string\r
296         // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator\r
297         function Concat()\r
298         {\r
299                 $s = "";\r
300                 $arr = func_get_args();\r
301                 \r
302                 // suggestion by andrew005@mnogo.ru\r
303                 $s = implode(',',$arr); \r
304                 if (strlen($s) > 0) return "CONCAT($s)";\r
305                 else return '';\r
306         }\r
307         \r
308         function OffsetDate($dayFraction,$date=false)\r
309         {               \r
310                 if (!$date) $date = $this->sysDate;\r
311                 return "from_unixtime(unix_timestamp($date)+($dayFraction)*24*3600)";\r
312         }\r
313         \r
314         // returns true or false\r
315         function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)\r
316         {\r
317                 if (ADODB_PHPVER >= 0x4300)\r
318                         $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,\r
319                                                                                                 $this->forceNewConnect,$this->clientFlags);\r
320                 else if (ADODB_PHPVER >= 0x4200)\r
321                         $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,\r
322                                                                                                 $this->forceNewConnect);\r
323                 else\r
324                         $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);\r
325         \r
326                 if ($this->_connectionID === false) return false;\r
327                 if ($argDatabasename) return $this->SelectDB($argDatabasename);\r
328                 return true;    \r
329         }\r
330         \r
331         // returns true or false\r
332         function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)\r
333         {\r
334                 if (ADODB_PHPVER >= 0x4300)\r
335                         $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);\r
336                 else\r
337                         $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);\r
338                 if ($this->_connectionID === false) return false;\r
339                 if ($this->autoRollback) $this->RollbackTrans();\r
340                 if ($argDatabasename) return $this->SelectDB($argDatabasename);\r
341                 return true;    \r
342         }\r
343         \r
344         function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)\r
345         {\r
346                 $this->forceNewConnect = true;\r
347                 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);\r
348         }\r
349         \r
350         function &MetaColumns($table) \r
351         {\r
352         \r
353                 if ($this->metaColumnsSQL) {\r
354                 global $ADODB_FETCH_MODE;\r
355                 \r
356                         $save = $ADODB_FETCH_MODE;\r
357                         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;\r
358                         if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);\r
359                         \r
360                         $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));\r
361                         \r
362                         if (isset($savem)) $this->SetFetchMode($savem);\r
363                         $ADODB_FETCH_MODE = $save;\r
364                         \r
365                         if ($rs === false) return false;\r
366                         \r
367                         $retarr = array();\r
368                         while (!$rs->EOF){\r
369                                 $fld = new ADOFieldObject();\r
370                                 $fld->name = $rs->fields[0];\r
371                                 $type = $rs->fields[1];\r
372                                 \r
373                                 \r
374                                 // split type into type(length):\r
375                                 $fld->scale = null;\r
376                                 if (strpos($type,',') && preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {\r
377                                         $fld->type = $query_array[1];\r
378                                         $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;\r
379                                         $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;\r
380                                 } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {\r
381                                         $fld->type = $query_array[1];\r
382                                         $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;\r
383                                 } else {\r
384                                         $fld->max_length = -1;\r
385                                         $fld->type = $type;\r
386                                 }\r
387                                 /*\r
388                                 // split type into type(length):\r
389                                 if (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {\r
390                                         $fld->type = $query_array[1];\r
391                                         $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;\r
392                                 } else {\r
393                                         $fld->max_length = -1;\r
394                                         $fld->type = $type;\r
395                                 }*/\r
396                                 $fld->not_null = ($rs->fields[2] != 'YES');\r
397                                 $fld->primary_key = ($rs->fields[3] == 'PRI');\r
398                                 $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);\r
399                                 $fld->binary = (strpos($fld->type,'blob') !== false);\r
400                                 \r
401                                 if (!$fld->binary) {\r
402                                         $d = $rs->fields[4];\r
403                                         if ($d != "" && $d != "NULL") {\r
404                                                 $fld->has_default = true;\r
405                                                 $fld->default_value = $d;\r
406                                         } else {\r
407                                                 $fld->has_default = false;\r
408                                         }\r
409                                 }\r
410                                 if ($save == ADODB_FETCH_NUM) $retarr[] = $fld; \r
411                                 else $retarr[strtoupper($fld->name)] = $fld;\r
412                                 $rs->MoveNext();\r
413                         }\r
414                         $rs->Close();\r
415                         return $retarr; \r
416                 }\r
417                 return false;\r
418         }\r
419                 \r
420         // returns true or false\r
421         function SelectDB($dbName) \r
422         {\r
423                 $this->databaseName = $dbName;\r
424                 if ($this->_connectionID) {\r
425                         return @mysql_select_db($dbName,$this->_connectionID);          \r
426                 }\r
427                 else return false;      \r
428         }\r
429         \r
430         // parameters use PostgreSQL convention, not MySQL\r
431         function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)\r
432         {\r
433                 $offsetStr =($offset>=0) ? "$offset," : '';\r
434                 \r
435                 if ($secs)\r
436                         $rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);\r
437                 else\r
438                         $rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);\r
439                 return $rs;\r
440         }\r
441         \r
442         \r
443         // returns queryID or false\r
444         function _query($sql,$inputarr)\r
445         {\r
446         //global $ADODB_COUNTRECS;\r
447                 //if($ADODB_COUNTRECS) \r
448                 return mysql_query($sql,$this->_connectionID);\r
449                 //else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6\r
450         }\r
451 \r
452         /*      Returns: the last error message from previous database operation        */      \r
453         function ErrorMsg() \r
454         {\r
455         \r
456                 if ($this->_logsql) return $this->_errorMsg;\r
457                 if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();\r
458                 else $this->_errorMsg = @mysql_error($this->_connectionID);\r
459                 return $this->_errorMsg;\r
460         }\r
461         \r
462         /*      Returns: the last error number from previous database operation */      \r
463         function ErrorNo() \r
464         {\r
465                 if ($this->_logsql) return $this->_errorCode;\r
466                 if (empty($this->_connectionID))  return @mysql_errno();\r
467                 else return @mysql_errno($this->_connectionID);\r
468         }\r
469         \r
470 \r
471         \r
472         // returns true or false\r
473         function _close()\r
474         {\r
475                 @mysql_close($this->_connectionID);\r
476                 $this->_connectionID = false;\r
477         }\r
478 \r
479         \r
480         /*\r
481         * Maximum size of C field\r
482         */\r
483         function CharMax()\r
484         {\r
485                 return 255; \r
486         }\r
487         \r
488         /*\r
489         * Maximum size of X field\r
490         */\r
491         function TextMax()\r
492         {\r
493                 return 4294967295; \r
494         }\r
495         \r
496 }\r
497         \r
498 /*--------------------------------------------------------------------------------------\r
499          Class Name: Recordset\r
500 --------------------------------------------------------------------------------------*/\r
501 \r
502 class ADORecordSet_mysql extends ADORecordSet{  \r
503         \r
504         var $databaseType = "mysql";\r
505         var $canSeek = true;\r
506         \r
507         function ADORecordSet_mysql($queryID,$mode=false) \r
508         {\r
509                 if ($mode === false) { \r
510                         global $ADODB_FETCH_MODE;\r
511                         $mode = $ADODB_FETCH_MODE;\r
512                 }\r
513                 switch ($mode)\r
514                 {\r
515                 case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;\r
516                 case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;\r
517                 default:\r
518                 case ADODB_FETCH_DEFAULT:\r
519                 case ADODB_FETCH_BOTH:$this->fetchMode = MYSQL_BOTH; break;\r
520                 }\r
521         \r
522                 $this->ADORecordSet($queryID);  \r
523         }\r
524         \r
525         function _initrs()\r
526         {\r
527         //GLOBAL $ADODB_COUNTRECS;\r
528         //      $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;\r
529                 $this->_numOfRows = @mysql_num_rows($this->_queryID);\r
530                 $this->_numOfFields = @mysql_num_fields($this->_queryID);\r
531         }\r
532         \r
533         function &FetchField($fieldOffset = -1) \r
534         {       \r
535         \r
536                 if ($fieldOffset != -1) {\r
537                         $o = @mysql_fetch_field($this->_queryID, $fieldOffset);\r
538                         $f = @mysql_field_flags($this->_queryID,$fieldOffset);\r
539                         $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich@att.com)\r
540                         //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable\r
541                         $o->binary = (strpos($f,'binary')!== false);\r
542                 }\r
543                 else if ($fieldOffset == -1) {  /*      The $fieldOffset argument is not provided thus its -1   */\r
544                         $o = @mysql_fetch_field($this->_queryID);\r
545                         $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich@att.com)\r
546                         //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable\r
547                 }\r
548                         \r
549                 return $o;\r
550         }\r
551 \r
552         function &GetRowAssoc($upper=true)\r
553         {\r
554                 if ($this->fetchMode == MYSQL_ASSOC && !$upper) return $this->fields;\r
555                 $row =& ADORecordSet::GetRowAssoc($upper);\r
556                 return $row;\r
557         }\r
558         \r
559         /* Use associative array to get fields array */\r
560         function Fields($colname)\r
561         {       \r
562                 // added @ by "Michael William Miller" <mille562@pilot.msu.edu>\r
563                 if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];\r
564                 \r
565                 if (!$this->bind) {\r
566                         $this->bind = array();\r
567                         for ($i=0; $i < $this->_numOfFields; $i++) {\r
568                                 $o = $this->FetchField($i);\r
569                                 $this->bind[strtoupper($o->name)] = $i;\r
570                         }\r
571                 }\r
572                  return $this->fields[$this->bind[strtoupper($colname)]];\r
573         }\r
574         \r
575         function _seek($row)\r
576         {\r
577                 if ($this->_numOfRows == 0) return false;\r
578                 return @mysql_data_seek($this->_queryID,$row);\r
579         }\r
580         \r
581         \r
582         // 10% speedup to move MoveNext to child class\r
583         function MoveNext() \r
584         {\r
585         //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return adodb_movenext($this);\r
586         \r
587                 if ($this->EOF) return false;\r
588                                 \r
589                 $this->_currentRow++;\r
590                 $this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode);\r
591                 if (is_array($this->fields)) return true;\r
592                 \r
593                 $this->EOF = true;\r
594                 \r
595                 /* -- tested raising an error -- appears pointless\r
596                 $conn = $this->connection;\r
597                 if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) {\r
598                         $fn = $conn->raiseErrorFn;\r
599                         $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database);\r
600                 }\r
601                 */\r
602                 return false;\r
603         }       \r
604         \r
605         function _fetch()\r
606         {\r
607                 $this->fields =  @mysql_fetch_array($this->_queryID,$this->fetchMode);\r
608                 return is_array($this->fields);\r
609         }\r
610         \r
611         function _close() {\r
612                 @mysql_free_result($this->_queryID);    \r
613                 $this->_queryID = false;        \r
614         }\r
615         \r
616         function MetaType($t,$len=-1,$fieldobj=false)\r
617         {\r
618                 if (is_object($t)) {\r
619                         $fieldobj = $t;\r
620                         $t = $fieldobj->type;\r
621                         $len = $fieldobj->max_length;\r
622                 }\r
623                 \r
624                 $len = -1; // mysql max_length is not accurate\r
625                 switch (strtoupper($t)) {\r
626                 case 'STRING': \r
627                 case 'CHAR':\r
628                 case 'VARCHAR': \r
629                 case 'TINYBLOB': \r
630                 case 'TINYTEXT': \r
631                 case 'ENUM': \r
632                 case 'SET': \r
633                         if ($len <= $this->blobSize) return 'C';\r
634                         \r
635                 case 'TEXT':\r
636                 case 'LONGTEXT': \r
637                 case 'MEDIUMTEXT':\r
638                         return 'X';\r
639                         \r
640                 // php_mysql extension always returns 'blob' even if 'text'\r
641                 // so we have to check whether binary...\r
642                 case 'IMAGE':\r
643                 case 'LONGBLOB': \r
644                 case 'BLOB':\r
645                 case 'MEDIUMBLOB':\r
646                         return !empty($fieldobj->binary) ? 'B' : 'X';\r
647                         \r
648                 case 'YEAR':\r
649                 case 'DATE': return 'D';\r
650                 \r
651                 case 'TIME':\r
652                 case 'DATETIME':\r
653                 case 'TIMESTAMP': return 'T';\r
654                 \r
655                 case 'INT': \r
656                 case 'INTEGER':\r
657                 case 'BIGINT':\r
658                 case 'TINYINT':\r
659                 case 'MEDIUMINT':\r
660                 case 'SMALLINT': \r
661                         \r
662                         if (!empty($fieldobj->primary_key)) return 'R';\r
663                         else return 'I';\r
664                 \r
665                 default: return 'N';\r
666                 }\r
667         }\r
668 \r
669 }\r
670 }\r
671 ?>