From ba55620f3dfc7bc1755855c5860a358bc3c1bda0 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 14 Oct 2004 20:55:52 +0000 Subject: [PATCH] fixed the schema-retrival functions for MySql, Postges and MaxDB --- phpgwapi/inc/class.schema_proc.inc.php | 127 ++++++++++++++++++------- 1 file changed, 94 insertions(+), 33 deletions(-) diff --git a/phpgwapi/inc/class.schema_proc.inc.php b/phpgwapi/inc/class.schema_proc.inc.php index f48fbfa328..7f13b59477 100644 --- a/phpgwapi/inc/class.schema_proc.inc.php +++ b/phpgwapi/inc/class.schema_proc.inc.php @@ -36,21 +36,23 @@ 'sapdb' => 32, ); 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 * * @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_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->connect(); + $this->sType = $dbms ? $dmbs : $this->m_odb->Type; + $this->adodb = &$GLOBALS['phpgw']->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 $this->m_oTranslator = &$this; + + switch($this->sType) + { + case 'sapdb': + case 'maxdb': + $this->max_varchar_length = 8000; + break; + } } /** @@ -113,6 +123,22 @@ 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)) { @@ -424,11 +450,11 @@ // identify the sequence name, ADOdb uses a different name or it might be renamed $columns = $this->dict->MetaColumns($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]; } - $sql = "SELECT setval('$seq_name',MAX($sColumnName) FROM $sTableName"; + $sql = "SELECT setval('$seq_name',MAX($sColumnName)) FROM $sTableName"; if($GLOBALS['DEBUG']) { echo "
Updating sequence '$seq_name using: $sql"; } return $this->query($sql,__LINE__,__FILE__); } @@ -852,12 +878,13 @@ break; case 'char': // ADOdb does not differ between char and varchar - case 'varchar': - if($col_data['precision'] > 0 && $col_data['precision'] < 256) + case 'varchar': + $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'; } @@ -938,6 +965,9 @@ */ 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') || !($columns = $this->dict->MetaColumns($sTableName))) { @@ -950,9 +980,19 @@ 'ix' => array(), 'uc' => array(), ); + //echo "$sTableName:
".print_r($columns,true)."
"; 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); @@ -968,15 +1008,28 @@ 'D' => 'date', 'F' => 'float', 'N' => 'decimal', + 'R' => 'auto', ); $definition['fd'][$name]['type'] = $ado_type2egw[$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': - $definition['fd'][$name]['type'] = $column->type == 'char' ? 'char' : 'varchar'; + $definition['fd'][$name]['type'] = 'varchar'; $definition['fd'][$name]['precision'] = $column->max_length; 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': $definition['fd'][$name]['precision'] = $column->max_length; break; @@ -984,21 +1037,10 @@ $definition['fd'][$name]['precision'] = $column->max_length; $definition['fd'][$name]['scale'] = $column->scale; break; - case 'R': + case 'R': + $column->auto_increment = true; + // fall-through 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) { case 'I1': case 'I2': case 'I4': case 'I8': @@ -1023,10 +1065,19 @@ } break; } - if ($column->has_default && is_null($colum->default_value)) + if ($column->auto_increment) { - $definition['fd'][$name]['default'] = (int) $this->default_value; - $column->has_default = false; + // no precision for auto! + $definition['fd'][$name] = array( + 'type' => 'auto', + 'nullable' => False, + ); + $column->has_default = False; + $definition['pk'][] = $name; + } + else + { + $definition['fd'][$name]['type'] = 'int'; } break; } @@ -1047,21 +1098,31 @@ // not all DB's (odbc) return the primary keys via MetaColumns 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; } if ($this->debug > 1) $this->debug_message("schema_proc::GetTableDefintion: MetaPrimaryKeys(%1) = %2",False,$sTableName,$primary); 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) { - 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']) || $index['unique'] && count(array_intersect($definition['pk'],$index['columns'])) == count($definition['pk']))) {