fixed the schema-retrival functions for MySql, Postges and MaxDB

This commit is contained in:
Ralf Becker 2004-10-14 20:55:52 +00:00
parent 2740acc03e
commit ba55620f3d

View File

@ -36,21 +36,23 @@
'sapdb' => 32, 'sapdb' => 32,
); );
var $sType; // type of the database, set by the the constructor var $sType; // type of the database, set by the the constructor
var $max_varchar_length = 255; // maximum length of a varchar column, everything above get converted to text
/** /**
* Constructor of schema-processor * Constructor of schema-processor
* *
* @param string $dbms type of the database: 'mysql','pgsql','mssql','sapdb' * @param string $dbms type of the database: 'mysql','pgsql','mssql','sapdb'
*/ */
function schema_proc($dbms,$aTables=False) function schema_proc($dbms=False,$aTables=False)
{ {
$this->sType = $dbms;
$this->m_aTables = array(); $this->m_aTables = array();
$this->m_bDeltaOnly = False; // Default to false here in case it's just a CreateTable script $this->m_bDeltaOnly = False; // Default to false here in case it's just a CreateTable script
$this->m_odb = is_object($GLOBALS['phpgw']->db) ? $GLOBALS['phpgw']->db : $GLOBALS['phpgw_setup']->db; $this->m_odb = is_object($GLOBALS['phpgw']->db) ? $GLOBALS['phpgw']->db : $GLOBALS['phpgw_setup']->db;
$this->m_odb->connect(); $this->m_odb->connect();
$this->sType = $dbms ? $dmbs : $this->m_odb->Type;
$this->adodb = &$GLOBALS['phpgw']->ADOdb; $this->adodb = &$GLOBALS['phpgw']->ADOdb;
$this->dict = NewDataDictionary($this->adodb); $this->dict = NewDataDictionary($this->adodb);
@ -59,6 +61,14 @@
// to allow some of the former translator-functions to be called, we assign ourself as the translator // to allow some of the former translator-functions to be called, we assign ourself as the translator
$this->m_oTranslator = &$this; $this->m_oTranslator = &$this;
switch($this->sType)
{
case 'sapdb':
case 'maxdb':
$this->max_varchar_length = 8000;
break;
}
} }
/** /**
@ -113,6 +123,22 @@
unset($mFields['options']); unset($mFields['options']);
} }
} }
else
{
// only create indexes on text-columns, if (db-)specifiy options are given or FULLTEXT for mysql
// most DB's cant do them and give errors
if ($aTableDef['fd'][$mFields]['type'] == 'text')
{
if ($this->sType == 'mysql')
{
$options = 'FULLTEXT';
}
else
{
continue; // ignore that index
}
}
}
if (is_numeric($name)) if (is_numeric($name))
{ {
@ -424,11 +450,11 @@
// identify the sequence name, ADOdb uses a different name or it might be renamed // identify the sequence name, ADOdb uses a different name or it might be renamed
$columns = $this->dict->MetaColumns($sTableName); $columns = $this->dict->MetaColumns($sTableName);
$seq_name = 'seq_'.$sTableName; $seq_name = 'seq_'.$sTableName;
if (preg_match("/nextval\('([^']+)'::text\)/",$columns[$sColumnName]->default_value,$matches)) if (preg_match("/nextval\('([^']+)'::text\)/",$columns[strtoupper($sColumnName)]->default_value,$matches))
{ {
$seq_name = $matches[1]; $seq_name = $matches[1];
} }
$sql = "SELECT setval('$seq_name',MAX($sColumnName) FROM $sTableName"; $sql = "SELECT setval('$seq_name',MAX($sColumnName)) FROM $sTableName";
if($GLOBALS['DEBUG']) { echo "<br>Updating sequence '$seq_name using: $sql"; } if($GLOBALS['DEBUG']) { echo "<br>Updating sequence '$seq_name using: $sql"; }
return $this->query($sql,__LINE__,__FILE__); return $this->query($sql,__LINE__,__FILE__);
} }
@ -853,11 +879,12 @@
case 'char': case 'char':
// ADOdb does not differ between char and varchar // ADOdb does not differ between char and varchar
case 'varchar': case 'varchar':
if($col_data['precision'] > 0 && $col_data['precision'] < 256) $ado_col = "C";
if(0 < $col_data['precision'] && $col_data['precision'] <= $this->max_varchar_length)
{ {
$ado_col = "C($col_data[precision])"; $ado_col .= "($col_data[precision])";
} }
if($col_data['precision'] > 255) if($col_data['precision'] > $this->max_varchar_length)
{ {
$ado_col = 'X'; $ado_col = 'X';
} }
@ -938,6 +965,9 @@
*/ */
function GetTableDefinition($sTableName) function GetTableDefinition($sTableName)
{ {
// MetaType returns all varchar >= blobSize as blob, it's by default 100, which is wrong
if ($this->dict->blobSize < 255) $this->dict->blobSize = 255;
if (!method_exists($this->dict,'MetaColumns') || if (!method_exists($this->dict,'MetaColumns') ||
!($columns = $this->dict->MetaColumns($sTableName))) !($columns = $this->dict->MetaColumns($sTableName)))
{ {
@ -950,9 +980,19 @@
'ix' => array(), 'ix' => array(),
'uc' => array(), 'uc' => array(),
); );
//echo "$sTableName: <pre>".print_r($columns,true)."</pre>";
foreach($columns as $column) foreach($columns as $column)
{ {
$name = strtolower($column->name); switch($this->sType)
{
case 'sapdb':
case 'maxdb':
$name = strtolower($column->name);
break;
default:
$name = $column->name;
break;
}
$type = method_exists($this->dict,'MetaType') ? $this->dict->MetaType($column) : strtoupper($column->type); $type = method_exists($this->dict,'MetaType') ? $this->dict->MetaType($column) : strtoupper($column->type);
@ -968,15 +1008,28 @@
'D' => 'date', 'D' => 'date',
'F' => 'float', 'F' => 'float',
'N' => 'decimal', 'N' => 'decimal',
'R' => 'auto',
); );
$definition['fd'][$name]['type'] = $ado_type2egw[$type]; $definition['fd'][$name]['type'] = $ado_type2egw[$type];
switch($type) switch($type)
{ {
case 'D': case 'T':
// detecting the automatic timestamps again
if ($column->has_default && preg_match('/(0000-00-00|timestamp)/i',$column->default_value))
{
$column->default_value = $type == 'D' ? 'current_date' : 'current_timestamp';
}
break;
case 'C': case 'C2': case 'C': case 'C2':
$definition['fd'][$name]['type'] = $column->type == 'char' ? 'char' : 'varchar'; $definition['fd'][$name]['type'] = 'varchar';
$definition['fd'][$name]['precision'] = $column->max_length; $definition['fd'][$name]['precision'] = $column->max_length;
break; break;
case 'B':
case 'X': case 'XL': case 'X2':
// text or blob's need to be nullable for most databases
$column->not_null = false;
break;
case 'F': case 'F':
$definition['fd'][$name]['precision'] = $column->max_length; $definition['fd'][$name]['precision'] = $column->max_length;
break; break;
@ -985,20 +1038,9 @@
$definition['fd'][$name]['scale'] = $column->scale; $definition['fd'][$name]['scale'] = $column->scale;
break; break;
case 'R': case 'R':
$column->auto_increment = true;
// fall-through
case 'I': case 'I1': case 'I2': case 'I4': case 'I8': case 'I': case 'I1': case 'I2': case 'I4': case 'I8':
if ($column->auto_increment)
{
$definition['fd'][$name] = array(
'type' => 'auto',
'nullable' => False,
);
$column->has_default = False;
$definition['pk'][] = $name;
}
else
{
$definition['fd'][$name]['type'] = 'int';
}
switch($type) switch($type)
{ {
case 'I1': case 'I2': case 'I4': case 'I8': case 'I1': case 'I2': case 'I4': case 'I8':
@ -1023,10 +1065,19 @@
} }
break; break;
} }
if ($column->has_default && is_null($colum->default_value)) if ($column->auto_increment)
{ {
$definition['fd'][$name]['default'] = (int) $this->default_value; // no precision for auto!
$column->has_default = false; $definition['fd'][$name] = array(
'type' => 'auto',
'nullable' => False,
);
$column->has_default = False;
$definition['pk'][] = $name;
}
else
{
$definition['fd'][$name]['type'] = 'int';
} }
break; break;
} }
@ -1047,21 +1098,31 @@
// not all DB's (odbc) return the primary keys via MetaColumns // not all DB's (odbc) return the primary keys via MetaColumns
if (!count($definition['pk']) && method_exists($this->dict,'MetaPrimaryKeys') && if (!count($definition['pk']) && method_exists($this->dict,'MetaPrimaryKeys') &&
count($primary = $this->dict->MetaPrimaryKeys($sTableName))) is_array($primary = $this->dict->MetaPrimaryKeys($sTableName)) && count($primary))
{ {
array_walk($primary,create_function('&$s','$s = strtolower($s);')); switch($this->sType)
{
case 'sapdb':
case 'maxdb':
array_walk($primary,create_function('&$s','$s = strtolower($s);'));
break;
}
$definition['pk'] = $primary; $definition['pk'] = $primary;
} }
if ($this->debug > 1) $this->debug_message("schema_proc::GetTableDefintion: MetaPrimaryKeys(%1) = %2",False,$sTableName,$primary); if ($this->debug > 1) $this->debug_message("schema_proc::GetTableDefintion: MetaPrimaryKeys(%1) = %2",False,$sTableName,$primary);
if (method_exists($this->dict,'MetaIndexes') && if (method_exists($this->dict,'MetaIndexes') &&
count($indexes = $this->dict->MetaIndexes($sTableName)) > 0) is_array($indexes = $this->dict->MetaIndexes($sTableName)) && count($indexes))
{ {
foreach($indexes as $index) foreach($indexes as $index)
{ {
array_walk($index['columns'],create_function('&$s','$s = strtolower($s);')); switch($this->sType)
{
case 'sapdb':
case 'maxdb':
array_walk($index['columns'],create_function('&$s','$s = strtolower($s);'));
break;
}
if (count($definition['pk']) && (implode(':',$definition['pk']) == implode(':',$index['columns']) || if (count($definition['pk']) && (implode(':',$definition['pk']) == implode(':',$index['columns']) ||
$index['unique'] && count(array_intersect($definition['pk'],$index['columns'])) == count($definition['pk']))) $index['unique'] && count(array_intersect($definition['pk'],$index['columns'])) == count($definition['pk'])))
{ {