new capability union

This commit is contained in:
Ralf Becker 2006-03-29 06:58:56 +00:00
parent 3e19646bc1
commit c230fb81c4

View File

@ -62,12 +62,12 @@
* @var string $Database name of database to use * @var string $Database name of database to use
*/ */
var $Database = ''; var $Database = '';
/** /**
* @var string $User name of database user * @var string $User name of database user
*/ */
var $User = ''; var $User = '';
/** /**
* @var string $Password password for database user * @var string $Password password for database user
*/ */
@ -77,22 +77,22 @@
* @var int $Auto_Free automatically free results - 0 no, 1 yes * @var int $Auto_Free automatically free results - 0 no, 1 yes
*/ */
var $Auto_Free = 0; var $Auto_Free = 0;
/** /**
* @var int $Debug enable debuging - 0 no, 1 yes * @var int $Debug enable debuging - 0 no, 1 yes
*/ */
var $Debug = 0; var $Debug = 0;
/** /**
* @var string $Halt_On_Error "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning) * @var string $Halt_On_Error "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
*/ */
var $Halt_On_Error = 'yes'; var $Halt_On_Error = 'yes';
/** /**
* @var array $Record current record * @var array $Record current record
*/ */
var $Record = array(); var $Record = array();
/** /**
* @var int row number for current record * @var int row number for current record
*/ */
@ -102,7 +102,7 @@
* @var int $Errno internal rdms error number for last error * @var int $Errno internal rdms error number for last error
*/ */
var $Errno = 0; var $Errno = 0;
/** /**
* @var string descriptive text from last error * @var string descriptive text from last error
*/ */
@ -114,19 +114,20 @@
var $Link_ID = 0; var $Link_ID = 0;
var $privat_Link_ID = False; // do we use a privat Link_ID or a reference to the global ADOdb object var $privat_Link_ID = False; // do we use a privat Link_ID or a reference to the global ADOdb object
var $Query_ID = 0; var $Query_ID = 0;
/** /**
* @var array $capabilities, defaults will be changed be method set_capabilities($ado_driver,$db_version) * @var array $capabilities, defaults will be changed be method set_capabilities($ado_driver,$db_version)
*/ */
var $capabilities = array( var $capabilities = array(
'sub_queries' => true, // will be set to false for mysql < 4.1 'sub_queries' => true, // will be set to false for mysql < 4.1
'union' => true, // will be set to false for mysql < 4.0
'distinct_on_text' => true, // is the DB able to use DISTINCT with a text or blob column 'distinct_on_text' => true, // is the DB able to use DISTINCT with a text or blob column
'like_on_text' => true, // is the DB able to use LIKE with text columns 'like_on_text' => true, // is the DB able to use LIKE with text columns
'name_case' => 'upper', // case of returned column- and table-names: upper, lower(pgSql), preserv(MySQL) 'name_case' => 'upper', // case of returned column- and table-names: upper, lower(pgSql), preserv(MySQL)
'client_encoding' => false, // db uses a changeable clientencoding 'client_encoding' => false, // db uses a changeable clientencoding
'order_on_text' => true, // is the DB able to order by a given text column, boolean or 'order_on_text' => true, // is the DB able to order by a given text column, boolean or
); // string for sprintf for a cast (eg. 'CAST(%s AS varchar)') ); // string for sprintf for a cast (eg. 'CAST(%s AS varchar)')
var $prepared_sql = array(); // sql is the index var $prepared_sql = array(); // sql is the index
/** /**
@ -232,11 +233,11 @@
case 'sapdb': case 'sapdb':
$this->Type = 'maxdb'; $this->Type = 'maxdb';
// fall through // fall through
case 'maxdb': case 'maxdb':
$type ='sapdb'; // name in ADOdb $type ='sapdb'; // name in ADOdb
$php_extension = 'odbc'; $php_extension = 'odbc';
break; break;
case 'mysqlt': case 'mysqlt':
$php_extension = 'mysql'; // you can use $this->setupType to determine if it's mysqlt or mysql $php_extension = 'mysql'; // you can use $this->setupType to determine if it's mysqlt or mysql
// fall through // fall through
@ -255,7 +256,7 @@
$this->Host != $GLOBALS['egw']->db->Host || $this->Host != $GLOBALS['egw']->db->Host ||
$this->Port != $GLOBALS['egw']->db->Port))) $this->Port != $GLOBALS['egw']->db->Port)))
{ {
if (!extension_loaded($php_extension) && (!function_exists('dl') || if (!extension_loaded($php_extension) && (!function_exists('dl') ||
!dl(PHP_SHLIB_PREFIX.$php_extension.'.'.PHP_SHLIB_SUFFIX))) !dl(PHP_SHLIB_PREFIX.$php_extension.'.'.PHP_SHLIB_SUFFIX)))
{ {
$this->halt("Necessary php database support for $this->Type (".PHP_SHLIB_PREFIX.$php_extension.'.'.PHP_SHLIB_SUFFIX.") not loaded and can't be loaded, exiting !!!"); $this->halt("Necessary php database support for $this->Type (".PHP_SHLIB_PREFIX.$php_extension.'.'.PHP_SHLIB_SUFFIX.") not loaded and can't be loaded, exiting !!!");
@ -290,7 +291,7 @@
if ($this->Debug) if ($this->Debug)
{ {
echo function_backtrace(); echo function_backtrace();
echo "<p>new ADOdb connection to $this->Type://$this->Host/$this->Database: Link_ID".($this->Link_ID === $GLOBALS['egw']->ADOdb ? '===' : '!==')."\$GLOBALS[egw]->ADOdb</p>"; echo "<p>new ADOdb connection to $this->Type://$this->Host/$this->Database: Link_ID".($this->Link_ID === $GLOBALS['egw']->ADOdb ? '===' : '!==')."\$GLOBALS[egw]->ADOdb</p>";
//echo "<p>".print_r($this->Link_ID->ServerInfo(),true)."</p>\n"; //echo "<p>".print_r($this->Link_ID->ServerInfo(),true)."</p>\n";
_debug_array($this); _debug_array($this);
echo "\$GLOBALS[egw]->db="; _debug_array($GLOBALS[egw]->db); echo "\$GLOBALS[egw]->db="; _debug_array($GLOBALS[egw]->db);
@ -330,26 +331,27 @@
case 'mysqlt': case 'mysqlt':
case 'mysqli': case 'mysqli':
$this->capabilities['sub_queries'] = (float) $db_version >= 4.1; $this->capabilities['sub_queries'] = (float) $db_version >= 4.1;
$this->capabilities['union'] = (float) $db_version >= 4.0;
$this->capabilities['name_case'] = 'preserv'; $this->capabilities['name_case'] = 'preserv';
$this->capabilities['client_encoding'] = (float) $db_version >= 4.1; $this->capabilities['client_encoding'] = (float) $db_version >= 4.1;
break; break;
case 'postgres': case 'postgres':
$this->capabilities['name_case'] = 'lower'; $this->capabilities['name_case'] = 'lower';
$this->capabilities['client_encoding'] = (float) $db_version >= 7.4; $this->capabilities['client_encoding'] = (float) $db_version >= 7.4;
break; break;
case 'mssql': case 'mssql':
$this->capabilities['distinct_on_text'] = false; $this->capabilities['distinct_on_text'] = false;
$this->capabilities['order_on_text'] = 'CAST (%s AS varchar)'; $this->capabilities['order_on_text'] = 'CAST (%s AS varchar)';
break; break;
case 'maxdb': // if Lim ever changes it to maxdb ;-) case 'maxdb': // if Lim ever changes it to maxdb ;-)
case 'sapdb': case 'sapdb':
$this->capabilities['distinct_on_text'] = false; $this->capabilities['distinct_on_text'] = false;
$this->capabilities['like_on_text'] = (float) $db_version >= 7.6; $this->capabilities['like_on_text'] = (float) $db_version >= 7.6;
$this->capabilities['order_on_text'] = false; $this->capabilities['order_on_text'] = false;
break; break;
} }
//echo "db::set_capabilities('$adodb_driver',$db_version)"; _debug_array($this->capabilities); //echo "db::set_capabilities('$adodb_driver',$db_version)"; _debug_array($this->capabilities);
} }
@ -417,7 +419,7 @@
} }
return $this->Link_ID->UnixTimeStamp($timestamp); return $this->Link_ID->UnixTimeStamp($timestamp);
} }
/** /**
* convert a rdbms specific boolean value * convert a rdbms specific boolean value
* *
@ -488,7 +490,7 @@
if (! $this->Query_ID) if (! $this->Query_ID)
{ {
$this->halt("Invalid SQL: ".(is_array($Query_String)?$Query_String[0]:$Query_String). $this->halt("Invalid SQL: ".(is_array($Query_String)?$Query_String[0]:$Query_String).
($inputarr ? "<br>Parameters: '".implode("','",$inputarr)."'":''), ($inputarr ? "<br>Parameters: '".implode("','",$inputarr)."'":''),
$line, $file); $line, $file);
} }
return $this->Query_ID; return $this->Query_ID;
@ -536,7 +538,7 @@
++$this->Row; ++$this->Row;
$this->Record = $this->Query_ID->fields; $this->Record = $this->Query_ID->fields;
if ($this->Query_ID->EOF || !$this->Query_ID->RecordCount() || !is_array($this->Record)) if ($this->Query_ID->EOF || !$this->Query_ID->RecordCount() || !is_array($this->Record))
{ {
return False; return False;
@ -1078,7 +1080,7 @@
function quote($value,$type=False,$not_null=true) function quote($value,$type=False,$not_null=true)
{ {
if ($this->Debug) echo "<p>db::quote(".(is_null($value)?'NULL':"'$value'").",'$type','$not_null')</p>\n"; if ($this->Debug) echo "<p>db::quote(".(is_null($value)?'NULL':"'$value'").",'$type','$not_null')</p>\n";
if (!$not_null && is_null($value)) // writing unset php-variables and those set to NULL now as SQL NULL if (!$not_null && is_null($value)) // writing unset php-variables and those set to NULL now as SQL NULL
{ {
return 'NULL'; return 'NULL';
@ -1087,7 +1089,7 @@
{ {
case 'int': case 'int':
case 'auto': case 'auto':
return (int) $value; return (int) $value;
case 'bool': case 'bool':
if ($this->Type == 'mysql') // maybe it's not longer necessary with mysql5 if ($this->Type == 'mysql') // maybe it's not longer necessary with mysql5
{ {
@ -1109,7 +1111,7 @@
case 'I': case 'I':
return $this->Link_ID->BlobEncode($value); return $this->Link_ID->BlobEncode($value);
} }
break; // handled like strings break; // handled like strings
case 'date': case 'date':
return $this->Link_ID->DBDate($value); return $this->Link_ID->DBDate($value);
case 'timestamp': case 'timestamp':
@ -1155,11 +1157,11 @@
$keys = $values = array(); $keys = $values = array();
foreach($array as $key => $data) foreach($array as $key => $data)
{ {
if (is_int($key) || !$only || $only === True && isset($column_definitions[$key]) || if (is_int($key) || !$only || $only === True && isset($column_definitions[$key]) ||
is_array($only) && in_array($key,$only)) is_array($only) && in_array($key,$only))
{ {
$keys[] = $this->name_quote($key); $keys[] = $this->name_quote($key);
if (!is_int($key) && is_array($column_definitions) && !isset($column_definitions[$key])) if (!is_int($key) && is_array($column_definitions) && !isset($column_definitions[$key]))
{ {
// give a warning that we have no column-type // give a warning that we have no column-type
@ -1181,8 +1183,8 @@
} }
$data[$k] = $this->quote($v,$column_type,$not_null); $data[$k] = $this->quote($v,$column_type,$not_null);
} }
$values[] = ($or_null?'(':'').(!count($data) ? '' : $values[] = ($or_null?'(':'').(!count($data) ? '' :
($use_key===True ? $this->name_quote($key).' IN ' : '') . ($use_key===True ? $this->name_quote($key).' IN ' : '') .
'('.implode(',',$data).')'.($or_null ? ' OR ' : '')).$or_null; '('.implode(',',$data).')'.($or_null ? ' OR ' : '')).$or_null;
} }
elseif (is_int($key) && $use_key===True) elseif (is_int($key) && $use_key===True)
@ -1218,9 +1220,9 @@
} }
/** /**
* Sets the application in which the db-class looks for table-defintions * Sets the application in which the db-class looks for table-defintions
* *
* Used by table_definitions, insert, update, select, expression and delete. If the app is not set via set_app, * Used by table_definitions, insert, update, select, expression and delete. If the app is not set via set_app,
* it need to be set for these functions on every call * it need to be set for these functions on every call
* *
* @param string $app the app-name * @param string $app the app-name
@ -1327,12 +1329,12 @@
{ {
$data[$column] = $value; $data[$column] = $value;
} }
} }
} }
$inputarr = false; $inputarr = false;
if ($use_prepared_statement && $this->Link_ID->_bindInputArray) // eg. MaxDB if ($use_prepared_statement && $this->Link_ID->_bindInputArray) // eg. MaxDB
{ {
$this->Link_ID->Param(false); // reset param-counter $this->Link_ID->Param(false); // reset param-counter
$cols = array_keys($data); $cols = array_keys($data);
foreach($cols as $k => $col) foreach($cols as $k => $col)
{ {
@ -1379,9 +1381,9 @@
{ {
if ($this->Debug) echo "<p>db::update('$table',".print_r($data,true).','.print_r($where,true).",$line,$file,'$app')</p>\n"; if ($this->Debug) echo "<p>db::update('$table',".print_r($data,true).','.print_r($where,true).",$line,$file,'$app')</p>\n";
if (!$table_def) $table_def = $this->get_table_definitions($app,$table); if (!$table_def) $table_def = $this->get_table_definitions($app,$table);
$blobs2update = array(); $blobs2update = array();
// SapDB/MaxDB cant update LONG columns / blob's: if a blob-column is included in the update we remember it in $blobs2update // SapDB/MaxDB cant update LONG columns / blob's: if a blob-column is included in the update we remember it in $blobs2update
// and remove it from $data // and remove it from $data
switch ($this->Type) switch ($this->Type)
{ {
@ -1530,7 +1532,7 @@
* @param string $append string to append to the end of the query, eg. ORDER BY ... * @param string $append string to append to the end of the query, eg. ORDER BY ...
* @param string/boolean $app string with name of app or False to use the current-app * @param string/boolean $app string with name of app or False to use the current-app
* @param int $num_rows number of rows to return if offset set, default 0 = use default in user prefs * @param int $num_rows number of rows to return if offset set, default 0 = use default in user prefs
* @param string $join=null sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or * @param string $join=null sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join! * "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @param array/bool $table_def use this table definition. If False, the table definition will be read from tables_baseline * @param array/bool $table_def use this table definition. If False, the table definition will be read from tables_baseline
* @return ADORecordSet or false, if the query fails * @return ADORecordSet or false, if the query fails
@ -1549,7 +1551,7 @@
$where = $this->column_data_implode(' AND ',$where,True,False,$table_def['fd']); $where = $this->column_data_implode(' AND ',$where,True,False,$table_def['fd']);
} }
$sql = "SELECT $cols FROM $table $join"; $sql = "SELECT $cols FROM $table $join";
// if we have a where clause, we need to add it together with the WHERE statement, if thats not in the join // if we have a where clause, we need to add it together with the WHERE statement, if thats not in the join
if ($where) $sql .= strstr($join,"WHERE") ? ' AND ('.$where.')' : ' WHERE '.$where; if ($where) $sql .= strstr($join,"WHERE") ? ' AND ('.$where.')' : ' WHERE '.$where;
@ -1563,7 +1565,7 @@
} }
return $this->query($sql,$line,$file,$offset,$offset===False ? -1 : (int)$num_rows); return $this->query($sql,$line,$file,$offset,$offset===False ? -1 : (int)$num_rows);
} }
/** /**
* Does a union over multiple selects * Does a union over multiple selects
* *
@ -1600,7 +1602,7 @@
)); ));
} }
$sql = count($sql) > 1 ? '(' . implode(")\nUNION\n(",$sql).')' : $sql[0]; $sql = count($sql) > 1 ? '(' . implode(")\nUNION\n(",$sql).')' : $sql[0];
if ($order_by) $sql .= "\nORDER BY ".$order_by; if ($order_by) $sql .= "\nORDER BY ".$order_by;
if ($this->Debug) echo "<p>sql='$sql'</p>"; if ($this->Debug) echo "<p>sql='$sql'</p>";