fixed / added mssql support for egw and fixed some other Windows probs on the way ;-)

- knowledgebase is not working: select distinct is not possible with text-columns
- fudforum is not working: is does not use ADOdb and has no own db-layer for mssql
- other apps seem to work, everthing needs through testing - incl. our "old" db's
This commit is contained in:
Ralf Becker 2004-07-25 01:41:37 +00:00
parent 968f1ccf91
commit c591c2c221
13 changed files with 79 additions and 54 deletions

View File

@ -619,7 +619,7 @@
foreach ($this->db_cols as $db_col => $col) foreach ($this->db_cols as $db_col => $col)
{ {
$sql .= $db_col . ','; $sql .= $db_col . ',';
$vals .= $db_col == 'et_group' ? intval($data[$col]).',' : "'" . addslashes($data[$col]) . "',"; $vals .= $db_col == 'et_group' ? intval($data[$col]).',' : "'" . $this->db->db_addslashes($data[$col]) . "',";
} }
$sql[strlen($sql)-1] = ')'; $sql[strlen($sql)-1] = ')';
$sql .= " VALUES ($vals"; $sql .= " VALUES ($vals";
@ -688,7 +688,7 @@
$str = '$templ_data[] = array('; $str = '$templ_data[] = array(';
for (reset($this->db_cols); list($db_col,$name) = each($this->db_cols); ) for (reset($this->db_cols); list($db_col,$name) = each($this->db_cols); )
{ {
$str .= "'$name' => '".addslashes($this->db->f($db_col))."',"; $str .= "'$name' => '".$this->db->db_addslashes($this->db->f($db_col))."',";
} }
$str .= ");\n\n"; $str .= ");\n\n";
fwrite($f,$str); fwrite($f,$str);

View File

@ -492,7 +492,12 @@
foreach(explode(',',$query['order']) as $val) foreach(explode(',',$query['order']) as $val)
{ {
$val = trim($val); $val = trim($val);
$order[] = (substr($val,0,5) != 'info_' ? 'info_' : '').$val; $val = (substr($val,0,5) != 'info_' ? 'info_' : '').$val;
if ($val == 'info_des' && $this->db->Type == 'mssql')
{
$val = "CAST($val AS varchar)";
}
$order[] = $val;
} }
$ordermethod = 'ORDER BY ' . implode(',',$order) . ' ' . $query['sort']; $ordermethod = 'ORDER BY ' . implode(',',$order) . ' ' . $query['sort'];
} }
@ -547,14 +552,16 @@
if ($action == '' || $action == 'sp' || count($links)) if ($action == '' || $action == 'sp' || count($links))
{ {
$sql_query = "FROM phpgw_infolog $join WHERE ($filtermethod $pid $sql_query) $link_extra"; $sql_query = "FROM phpgw_infolog $join WHERE ($filtermethod $pid $sql_query) $link_extra";
$this->db->query($sql='SELECT DISTINCT phpgw_infolog.info_id '.$sql_query,__LINE__,__FILE__); // mssql cant use DISTICT of text columns (info_des) are involved
$distinct = $this->db->Type != 'mssql' ? 'DISTINCT' : '';
$this->db->query($sql="SELECT $distinct phpgw_infolog.info_id ".$sql_query,__LINE__,__FILE__);
$query['total'] = $this->db->num_rows(); $query['total'] = $this->db->num_rows();
if (!$query['start'] || $query['start'] > $query['total']) if (!$query['start'] || $query['start'] > $query['total'])
{ {
$query['start'] = 0; $query['start'] = 0;
} }
$this->db->limit_query($sql="SELECT DISTINCT phpgw_infolog.* $sql_query $ordermethod",$query['start'],__LINE__,__FILE__); $this->db->limit_query($sql="SELECT $distinct phpgw_infolog.* $sql_query $ordermethod",$query['start'],__LINE__,__FILE__);
//echo "<p>sql='$sql'</p>\n"; //echo "<p>sql='$sql'</p>\n";
while ($this->db->next_record()) while ($this->db->next_record())
{ {

View File

@ -161,7 +161,7 @@
$sort = 'ASC'; $sort = 'ASC';
} }
if (!empty($order) && preg_match('/^[a-zA-Z_, ]+$/',$order) && (empty($sort) || preg_match('/^(ASC|DESC|asc|desc)$/',$sort))) if (!empty($order) && preg_match('/^[a-zA-Z_(), ]+$/',$order) && (empty($sort) || preg_match('/^(ASC|DESC|asc|desc)$/',$sort)))
{ {
$ordermethod = " ORDER BY $order $sort"; $ordermethod = " ORDER BY $order $sort";
} }

View File

@ -181,6 +181,12 @@
if (!$this->Link_ID) if (!$this->Link_ID)
{ {
foreach(array('Host','Database','User','Password') as $name)
{
$$name = $this->$name;
}
$type = $this->Type;
switch($this->Type) // convert to ADO db-type-names switch($this->Type) // convert to ADO db-type-names
{ {
case 'pgsql': case 'pgsql':
@ -190,13 +196,12 @@
" user=$this->User".($this->Password ? " password='".addslashes($this->Password)."'" : ''); " user=$this->User".($this->Password ? " password='".addslashes($this->Password)."'" : '');
$User = $Password = $Database = ''; // to indicate $Host is a connection-string $User = $Password = $Database = ''; // to indicate $Host is a connection-string
break; break;
case 'mssql':
if ($this->Port) $Host .= ','.$this->Port;
break;
default: default:
$Host = $this->Host . ($this->Port ? ':'.$this->Port : ''); if ($this->Port) $Host .= ':'.$this->Port;
foreach(array('Database','User','Password') as $name) break;
{
$$name = $this->$name;
}
$type = $this->Type;
} }
if (!is_object($GLOBALS['phpgw']->ADOdb) || // we have no connection so far if (!is_object($GLOBALS['phpgw']->ADOdb) || // we have no connection so far
@ -228,6 +233,15 @@
return 0; // in case error-reporting = 'no' return 0; // in case error-reporting = 'no'
} }
//echo "new ADOdb connection<pre>".print_r($GLOBALS['phpgw']->ADOdb,True)."</pre>\n"; //echo "new ADOdb connection<pre>".print_r($GLOBALS['phpgw']->ADOdb,True)."</pre>\n";
if ($this->Type == 'mssql')
{
// this is the format ADOdb expects
$this->Link_ID->Execute('SET DATEFORMAT ymd');
// sets the limit to the maximum
ini_set('mssql.textlimit',2147483647);
ini_set('mssql.sizelimit',2147483647);
}
} }
else else
{ {
@ -682,7 +696,7 @@
function haltmsg($msg) function haltmsg($msg)
{ {
printf("<p><b>Database error:</b> %s<br>\n", $msg); printf("<p><b>Database error:</b> %s<br>\n", $msg);
if ($this->Errno != "0" && $this->Error != "()") if (($this->Errno || $this->Error) && $this->Error != "()")
{ {
printf("<b>$this->Type Error</b>: %s (%s)<br>\n",$this->Errno,$this->Error); printf("<b>$this->Type Error</b>: %s (%s)<br>\n",$this->Errno,$this->Error);
} }
@ -943,6 +957,10 @@
break; // ADOdb has no BlobEncode for mysql and returns an unquoted string !!! break; // ADOdb has no BlobEncode for mysql and returns an unquoted string !!!
} }
return "'" . $this->Link_ID->BlobEncode($value) . "'"; return "'" . $this->Link_ID->BlobEncode($value) . "'";
case 'date':
return $this->Link_ID->DBDate($value);
case 'timestamp':
return $this->Link_ID->DBTimeStamp($value);
} }
return $this->Link_ID->quote($value); return $this->Link_ID->quote($value);
} }

View File

@ -563,7 +563,7 @@
continue; continue;
} }
$this->quote($value); $this->quote($value);
$value = addslashes(serialize($value)); // this addslashes is for the database $value = $this->db->db_addslashes(serialize($value)); // this addslashes is for the database
$app = $this->db->db_addslashes($app); $app = $this->db->db_addslashes($app);
$this->db->query($sql = "INSERT INTO phpgw_preferences" $this->db->query($sql = "INSERT INTO phpgw_preferences"

View File

@ -491,20 +491,24 @@
// Translate the type for the DBMS // Translate the type for the DBMS
if($sFieldSQL = $this->m_oTranslator->TranslateType($sType, $iPrecision, $iScale)) if($sFieldSQL = $this->m_oTranslator->TranslateType($sType, $iPrecision, $iScale))
{ {
if(!$bNullable) if(strpos(strtolower($sFieldSQL),'null')===false)
{ {
if(strpos(strtolower($sFieldSQL),' not null')===false) if(!$bNullable)
{ {
$sFieldSQL .= ' NOT NULL'; $sFieldSQL .= ' NOT NULL';
} }
elseif ($this->m_oTranslator->b_needExplicitNULL)
{
$sFieldSQL .= ' NULL';
}
} }
if(isset($aField['default'])) if(isset($aField['default']))
{ {
if($GLOBALS['DEBUG']) { echo'<br>_GetFieldSQL(): Calling TranslateDefault for "' . $aField['default'] . '"'; } if($GLOBALS['DEBUG']) { echo'<br>_GetFieldSQL(): Calling TranslateDefault for "' . $aField['default'] . '"'; }
// Get default DDL - useful for differences in date defaults (eg, now() vs. getdate()) // Get default DDL - useful for differences in date defaults (eg, now() vs. getdate())
$sTranslatedDefault = $aField['default'] == '0' ? $aField['default'] : $this->m_oTranslator->TranslateDefault($aField['default']);
$sFieldSQL .= " DEFAULT '$sTranslatedDefault'"; $sFieldSQL .= ' DEFAULT ' . (is_numeric($aField['default']) ? $aField['default'] :
$this->m_oTranslator->TranslateDefault($aField['default']));
} }
if($GLOBALS['DEBUG']) { echo'<br>_GetFieldSQL(): Outgoing SQL: ' . $sFieldSQL; } if($GLOBALS['DEBUG']) { echo'<br>_GetFieldSQL(): Outgoing SQL: ' . $sFieldSQL; }
return true; return true;
@ -552,6 +556,7 @@
{ {
return True; return True;
} }
$aIXSQL = array();
foreach($aFields as $mFields) foreach($aFields as $mFields)
{ {
$options = False; $options = False;
@ -562,6 +567,10 @@
$options = @$mFields['options'][$this->sType]; // db-specific options, eg. index-type $options = @$mFields['options'][$this->sType]; // db-specific options, eg. index-type
unset($mFields['options']); unset($mFields['options']);
} }
if ($options === false)
{
continue; // dont create index for that db, eg. cant index text
}
$mFields = implode(',',$mFields); $mFields = implode(',',$mFields);
} }
$aIXSQL[] = $this->m_oTranslator->GetIXSQL($mFields,$append,$options,$sTableName); $aIXSQL[] = $this->m_oTranslator->GetIXSQL($mFields,$append,$options,$sTableName);

View File

@ -23,6 +23,7 @@
var $fk = array(); var $fk = array();
var $ix = array(); var $ix = array();
var $uc = array(); var $uc = array();
var $b_needExplicitNULL = true; // no definition means NOT NULL for mssql
function schema_proc_mssql() function schema_proc_mssql()
{ {
@ -36,7 +37,7 @@
switch($sType) switch($sType)
{ {
case 'auto': case 'auto':
$sTranslated = 'int identity(1,1)'; $sTranslated = 'int identity(1,1) NOT NULL';
break; break;
case 'blob': case 'blob':
$sTranslated = 'image'; /* wonder how well PHP will support this??? */ $sTranslated = 'image'; /* wonder how well PHP will support this??? */
@ -91,11 +92,11 @@
$sTranslated = 'bit'; $sTranslated = 'bit';
break; break;
case 'varchar': case 'varchar':
if ($iPrecision > 0 && $iPrecision < 256) if ($iPrecision > 0 && $iPrecision <= 256)
{ {
$sTranslated = sprintf("varchar(%d)", $iPrecision); $sTranslated = sprintf("varchar(%d)", $iPrecision);
} }
if ($iPrecision > 255) if ($iPrecision > 256)
{ {
$sTranslated = 'text'; $sTranslated = 'text';
} }
@ -113,7 +114,7 @@
return 'GetDate()'; return 'GetDate()';
} }
return $sDefault; return "'$sDefault'";
} }
// Inverse of above, convert sql column types to array info // Inverse of above, convert sql column types to array info
@ -200,9 +201,12 @@
return "UNIQUE($sFields)"; return "UNIQUE($sFields)";
} }
function GetIXSQL($sFields) function GetIXSQL($sFields,&$append,$options,$sTableName)
{ {
return "INDEX($sFields)"; $append = True;
$ixFields = str_replace(',','_',$sFields);
$index = $sTableName . '_' . $ixFields . '_idx';
return "CREATE INDEX $index ON $sTableName ($sFields);\n";
} }
function _GetColumns($oProc, $sTableName, &$sColumns, $sDropColumn = '') function _GetColumns($oProc, $sTableName, &$sColumns, $sDropColumn = '')
@ -342,7 +346,15 @@
$oProc->m_odb->query($sSequenceSQL); $oProc->m_odb->query($sSequenceSQL);
} }
if($append_ix)
{
$query = "CREATE TABLE $sTableName ($sTableSQL";
}
else
{
$query = "CREATE TABLE $sTableName ($sTableSQL)"; $query = "CREATE TABLE $sTableName ($sTableSQL)";
}
return !!($oProc->m_odb->query($query)); return !!($oProc->m_odb->query($query));
} }

View File

@ -114,9 +114,9 @@
{ {
case 'current_date': case 'current_date':
case 'current_timestamp': case 'current_timestamp':
return 'now'; $sDefault = 'now';
} }
return $sDefault; return "'$sDefault'";
} }
/* Inverse of above, convert sql column types to array info */ /* Inverse of above, convert sql column types to array info */

View File

@ -93,9 +93,9 @@
{ {
case 'current_date': case 'current_date':
case 'current_timestamp': case 'current_timestamp':
return 'now'; $sDefault = 'now';
} }
return $sDefault; return "'$sDefault'";
} }
/* Inverse of above, convert sql column types to array info */ /* Inverse of above, convert sql column types to array info */

View File

@ -393,10 +393,6 @@
else else
{ {
$appstbl = 'phpgw_applications'; $appstbl = 'phpgw_applications';
if($this->amorethanb($setup_info['phpgwapi']['currentver'],'0.9.13.014'))
{
$use_appid = True;
}
} }
if($GLOBALS['DEBUG']) if($GLOBALS['DEBUG'])
@ -422,26 +418,9 @@
.$appname."_tables_prefix','".$setup_info[$appname]['tables_prefix']."')"; .$appname."_tables_prefix','".$setup_info[$appname]['tables_prefix']."')";
$this->db->query($sql,__LINE__,__FILE__); $this->db->query($sql,__LINE__,__FILE__);
} }
if($use_appid)
{
$this->db->query("SELECT MAX(app_id) FROM $appstbl");
$this->db->next_record();
if($this->db->f(0))
{
$app_id = ($this->db->f(0) + 1) . ',';
$app_idstr = 'app_id,';
}
else
{
srand(100000);
$app_id = rand(1,100000) . ',';
$app_idstr = 'app_id,';
}
}
$this->db->query("INSERT INTO $appstbl " $this->db->query("INSERT INTO $appstbl "
. "($app_idstr app_name,app_enabled,app_order,app_tables,app_version) " . "(app_name,app_enabled,app_order,app_tables,app_version) "
. "VALUES (" . "VALUES ("
. $app_id
. "'" . $setup_info[$appname]['name'] . "'," . "'" . $setup_info[$appname]['name'] . "',"
. $enable . "," . $enable . ","
. (int)$setup_info[$appname]['app_order'] . "," . (int)$setup_info[$appname]['app_order'] . ","

View File

@ -422,7 +422,7 @@
// explode with "\t" and removing "\n" with str_replace, needed to work with mbstring.overload=7 // explode with "\t" and removing "\n" with str_replace, needed to work with mbstring.overload=7
list($message_id,$app_name,,$content) = explode("\t",$line); list($message_id,$app_name,,$content) = explode("\t",$line);
$content=str_replace("\n",'',$content); $content=str_replace(array("\n","\r"),'',$content);
$message_id = substr(strtolower(chop($message_id)),0,MAX_MESSAGE_ID_LENGTH); $message_id = substr(strtolower(chop($message_id)),0,MAX_MESSAGE_ID_LENGTH);
$app_name = chop($app_name); $app_name = chop($app_name);
$raw[$app_name][$message_id] = $content; $raw[$app_name][$message_id] = $content;

View File

@ -941,7 +941,7 @@
else else
{ {
$base_sep = $sep; $base_sep = $sep;
if (ereg ("^$this->basedir" . $sep, $string)) if (substr($string,0,strlen($this->basedir)+1) == $this->basedir . $sep)
{ {
$base = $this->basedir . $sep; $base = $this->basedir . $sep;
} }

View File

@ -145,7 +145,7 @@
foreach ($defaultprefs as $app => $prefs) foreach ($defaultprefs as $app => $prefs)
{ {
$prefs = addslashes(serialize($prefs)); $prefs = $GLOBALS['phpgw_setup']->db->db_addslashes(serialize($prefs));
$GLOBALS['phpgw_setup']->db->query("INSERT INTO phpgw_preferences(preference_owner,preference_app,preference_value) VALUES($accountid,'$app','$prefs')",__FILE__,__LINE__); $GLOBALS['phpgw_setup']->db->query("INSERT INTO phpgw_preferences(preference_owner,preference_app,preference_value) VALUES($accountid,'$app','$prefs')",__FILE__,__LINE__);
} }
} }