1<?php
2
3
4/*
5V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
6  Released under both BSD license and Lesser GPL library license.
7  Whenever there is any discrepancy between the two licenses,
8  the BSD license will take precedence.
9  Set tabs to 8.
10
11*/
12
13class ADODB_pdo_mysql extends ADODB_pdo {
14	var $metaTablesSQL = "SHOW TABLES";
15	var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
16	var $sysDate = 'CURDATE()';
17	var $sysTimeStamp = 'NOW()';
18	var $nameQuote = '`';
19
20	function _init($parentDriver)
21	{
22
23		$parentDriver->hasTransactions = false;
24		$parentDriver->_bindInputArray = false;
25		$parentDriver->hasInsertID = true;
26		$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
27	}
28
29		// dayFraction is a day in floating point
30	function OffsetDate($dayFraction,$date=false)
31	{
32		if (!$date) $date = $this->sysDate;
33
34		$fraction = $dayFraction * 24 * 3600;
35		return $date . ' + INTERVAL ' .	 $fraction.' SECOND';
36
37//		return "from_unixtime(unix_timestamp($date)+$fraction)";
38	}
39
40	function ServerInfo()
41	{
42		$arr['description'] = ADOConnection::GetOne("select version()");
43		$arr['version'] = ADOConnection::_findvers($arr['description']);
44		return $arr;
45	}
46
47	function &MetaTables($ttype=false,$showSchema=false,$mask=false)
48	{
49		$save = $this->metaTablesSQL;
50		if ($showSchema && is_string($showSchema)) {
51			$this->metaTablesSQL .= " from $showSchema";
52		}
53
54		if ($mask) {
55			$mask = $this->qstr($mask);
56			$this->metaTablesSQL .= " like $mask";
57		}
58		$ret =& ADOConnection::MetaTables($ttype,$showSchema);
59
60		$this->metaTablesSQL = $save;
61		return $ret;
62	}
63
64	function SetTransactionMode( $transaction_mode )
65	{
66		$this->_transmode  = $transaction_mode;
67		if (empty($transaction_mode)) {
68			$this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ');
69			return;
70		}
71		if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
72		$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
73	}
74
75 	function &MetaColumns($table)
76	{
77		$this->_findschema($table,$schema);
78		if ($schema) {
79			$dbName = $this->database;
80			$this->SelectDB($schema);
81		}
82		global $ADODB_FETCH_MODE;
83		$save = $ADODB_FETCH_MODE;
84		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
85
86		if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
87		$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
88
89		if ($schema) {
90			$this->SelectDB($dbName);
91		}
92
93		if (isset($savem)) $this->SetFetchMode($savem);
94		$ADODB_FETCH_MODE = $save;
95		if (!is_object($rs)) {
96			$false = false;
97			return $false;
98		}
99
100		$retarr = array();
101		while (!$rs->EOF){
102			$fld = new ADOFieldObject();
103			$fld->name = $rs->fields[0];
104			$type = $rs->fields[1];
105
106			// split type into type(length):
107			$fld->scale = null;
108			if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
109				$fld->type = $query_array[1];
110				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
111				$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
112			} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
113				$fld->type = $query_array[1];
114				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
115			} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
116				$fld->type = $query_array[1];
117				$arr = explode(",",$query_array[2]);
118				$fld->enums = $arr;
119				$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
120				$fld->max_length = ($zlen > 0) ? $zlen : 1;
121			} else {
122				$fld->type = $type;
123				$fld->max_length = -1;
124			}
125			$fld->not_null = ($rs->fields[2] != 'YES');
126			$fld->primary_key = ($rs->fields[3] == 'PRI');
127			$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
128			$fld->binary = (strpos($type,'blob') !== false);
129			$fld->unsigned = (strpos($type,'unsigned') !== false);
130
131			if (!$fld->binary) {
132				$d = $rs->fields[4];
133				if ($d != '' && $d != 'NULL') {
134					$fld->has_default = true;
135					$fld->default_value = $d;
136				} else {
137					$fld->has_default = false;
138				}
139			}
140
141			if ($save == ADODB_FETCH_NUM) {
142				$retarr[] = $fld;
143			} else {
144				$retarr[strtoupper($fld->name)] = $fld;
145			}
146				$rs->MoveNext();
147			}
148
149			$rs->Close();
150			return $retarr;
151	}
152
153
154	// parameters use PostgreSQL convention, not MySQL
155	function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
156	{
157		$offsetStr =($offset>=0) ? "$offset," : '';
158		// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
159		if ($nrows < 0) $nrows = '18446744073709551615';
160
161		if ($secs)
162			$rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
163		else
164			$rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
165		return $rs;
166	}
167}
168?>