You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2008/08/06 10:47:43 UTC

svn commit: r683173 [9/10] - in /incubator/empire-db/trunk/core/Empire-db: ./ .settings/ bin/ lib/ src/ src/META-INF/ src/org/ src/org/apache/ src/org/apache/empire/ src/org/apache/empire/commons/ src/org/apache/empire/data/ src/org/apache/empire/data/...

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java Wed Aug  6 01:47:37 2008
@@ -0,0 +1,888 @@
+/*
+ * ESTEAM Software GmbH, 14.12.2004
+ */
+package org.apache.empire.db.oracle;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Iterator;
+
+import org.apache.empire.commons.Errors;
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBCmdType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBCommandExpr;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.DBDriverFeature;
+import org.apache.empire.db.DBExpr;
+import org.apache.empire.db.DBIndex;
+import org.apache.empire.db.DBObject;
+import org.apache.empire.db.DBReader;
+import org.apache.empire.db.DBRelation;
+import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.DBTable;
+import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.DBView;
+
+
+/**
+ * This class provides support for the Oracle database system.<br>
+ * Oracle Version 9 or higher is required.
+ * 
+ * @author ESTEAM software <A TARGET="esteam" HREF="http://www.esteam.de">www.esteam.de </A>
+ * 
+ */
+public class DBDatabaseDriverOracle extends DBDatabaseDriver
+{
+    // Implementation of boolean types
+    public enum BooleanType
+    {
+        CHAR,       // as CHAR(1) with 'Y' for true and 'N' for false
+        NUMBER      // as NUMBER(1) with 1 for true and 0 for false
+    }
+    
+    private BooleanType booleanType = BooleanType.NUMBER;
+
+    /**
+     * Constructor for the Oracle database driver.<br>
+     * 
+     */
+    public DBDatabaseDriverOracle()
+    {
+        // Info
+        log.info("DBDatabaseDriverOracle created. Boolean Type is " + String.valueOf(booleanType));
+    }
+
+    public BooleanType getBooleanType()
+    {
+        return booleanType;
+    }
+
+    public void setBooleanType(BooleanType booleanType)
+    {
+        this.booleanType = booleanType;
+        log.info("DBDatabaseDriverOracle Boolean Type set to " + String.valueOf(booleanType));
+    }
+
+    /**
+     * Returns whether or not a particular feature is supported by this driver
+     * @param type type of requrested feature. @see DBDriverFeature
+     * @return true if the features is supported or false otherwise
+     */
+    @Override
+    public boolean isSupported(DBDriverFeature type)
+    {
+        switch (type)
+        {   // return support info 
+            case CREATE_SCHEMA: return false;
+            case SEQUENCES:     return true;    
+        }
+        return false;
+    }
+
+    /**
+     * Creates a new Oracle command object.
+     * 
+     * @return the new DBCommandOracle object
+     */
+    @Override
+    public DBCommand createCommand(DBDatabase db)
+    {
+        if (db == null)
+            return null;
+        // create oracle command
+        return new DBCommandOracle(db);
+    }
+
+    /**
+     * Gets an sql phrase template for this database system.<br>
+     * @see DBDatabaseDriver#getSQLPhrase(int)
+     * @return the phrase template
+     */
+    @Override
+    public String getSQLPhrase(int phrase)
+    {
+        switch (phrase)
+        {
+            // sql-phrases
+            case SQL_NULL_VALUE:                return "null";
+            case SQL_RENAME_COLUMN:             return " AS ";
+            case SQL_PARAMETER:                 return " ? ";
+            case SQL_CONCAT_EXPR:               return " || ";
+            case SQL_RENAME_TABLE:              return " ";
+            case SQL_DATABASE_LINK:             return "@";
+            // data types
+            case SQL_BOOLEAN_TRUE:              return (booleanType==BooleanType.CHAR) ? "'Y'" : "1";
+            case SQL_BOOLEAN_FALSE:             return (booleanType==BooleanType.CHAR) ? "'N'" : "0";
+            case SQL_CURRENT_DATE:              return "sysdate";
+            case SQL_DATE_PATTERN:              return "yyyy-MM-dd";
+            case SQL_DATE_TEMPLATE:             return "TO_DATE('{0}', 'YYYY-MM-DD')";
+            case SQL_CURRENT_DATETIME:          return "sysdate";
+            case SQL_DATETIME_PATTERN:          return "yyyy-MM-dd HH:mm:ss";
+            case SQL_DATETIME_TEMPLATE:         return "TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')";
+            // functions
+            case SQL_FUNC_COALESCE:             return "nvl(?, {0})";
+            case SQL_FUNC_SUBSTRING:            return "substr(?, {0})";
+            case SQL_FUNC_SUBSTRINGEX:          return "substr(?, {0}, {1})";
+            case SQL_FUNC_REPLACE:              return "replace(?, {0}, {1})";
+            case SQL_FUNC_REVERSE:              return "reverse(?)"; 
+            case SQL_FUNC_STRINDEX:             return "instr(?, {0})"; 
+            case SQL_FUNC_STRINDEXFROM:         return "instr(?, {0}, {1})"; 
+            case SQL_FUNC_LENGTH:               return "length(?)";
+            case SQL_FUNC_UPPER:                return "upper(?)";
+            case SQL_FUNC_LOWER:                return "lower(?)";
+            case SQL_FUNC_TRIM:                 return "trim(?)";
+            case SQL_FUNC_LTRIM:                return "ltrim(?)";
+            case SQL_FUNC_RTRIM:                return "rtrim(?)";
+            case SQL_FUNC_ESCAPE:               return "? escape '{0}'";
+            // Numeric
+            case SQL_FUNC_ABS:                  return "abs(?)";
+            case SQL_FUNC_ROUND:                return "round(?,{0})";
+            case SQL_FUNC_TRUNC:                return "trunc(?,{0})";
+            case SQL_FUNC_CEILING:              return "ceil(?)";
+            case SQL_FUNC_FLOOR:                return "floor(?)";
+            // Date
+            case SQL_FUNC_DAY:                  return "TO_CHAR(?,'DD')";
+            case SQL_FUNC_MONTH:                return "TO_CHAR(?,'MM')";
+            case SQL_FUNC_YEAR:                 return "TO_CHAR(?,'YYYY')";
+            // Aggregation
+            case SQL_FUNC_SUM:                  return "sum(?)";
+            case SQL_FUNC_COUNT:                return "count(?)";
+            case SQL_FUNC_MAX:                  return "max(?)";
+            case SQL_FUNC_MIN:                  return "min(?)";
+            case SQL_FUNC_AVG:                  return "avg(?)";
+            // Others
+            case SQL_FUNC_DECODE:               return "decode(? {0})";
+            case SQL_FUNC_DECODE_SEP:           return ",";
+            case SQL_FUNC_DECODE_PART:          return "{0}, {1}";
+            case SQL_FUNC_DECODE_ELSE:          return "{0}";
+            // Not defined
+            default:
+                log.error("SQL phrase " + String.valueOf(phrase) + " is not defined!");
+                return "?";
+        }
+    }
+
+    /**
+     * @see DBDatabaseDriver#getConvertPhrase(DataType, DataType, Object)
+     */
+    @Override
+    public String getConvertPhrase(DataType destType, DataType srcType, Object format)
+    {
+        switch (destType)
+        {
+            /*
+             * case DBExpr.DT_BOOL: return "convert(bit, ?)"; case DBExpr.DT_INTEGER: return "convert(int, ?)"; case
+             * DBExpr.DT_DECIMAL: return "convert(decimal, ?)"; case DBExpr.DT_NUMBER: return "convert(float, ?)"; case
+             * DBExpr.DT_DATE: return "convert(datetime, ?, 111)"; case DBExpr.DT_DATETIME: return "convert(datetime, ?, 120)";
+             */
+            // Convert to text
+            case TEXT:
+            case CHAR:
+            case CLOB:
+                if (format != null)
+                { // Convert using a format string
+                    return "to_char(?, '"+format.toString()+"')";
+                }
+                return "to_char(?)";
+            // Convert to number
+            case INTEGER:
+            case DOUBLE:
+            case DECIMAL:
+                if (format != null)
+                { // Convert using a format string
+                    return "to_number(?, '"+format.toString()+"')";
+                }
+                return "to_number(?)";
+            // Convert to date
+            case DATE:
+            case DATETIME:
+                if (format != null)
+                { // Convert using a format string
+                    return "to_date(?, '"+format.toString()+"')";
+                }
+                return "to_date(?)";
+            // Unknown Type
+            default:
+                log.error("getConvertPhrase: unknown type (" + String.valueOf(destType));
+                return "?";
+        }
+    }
+
+    /**
+     * Extracts native error message of an sqlExeption.
+     * 
+     * @param sqle the SQLException
+     * @return the error message of the database 
+     */
+    @Override
+    public String extractErrorMessage(SQLException sqle)
+    {
+        String msg = sqle.getMessage();
+        msg = msg.substring(msg.indexOf(':') + 1);
+        // Find End
+        int end = msg.indexOf("ORA");
+        if (end >= 0)
+            msg = msg.substring(0, end - 1);
+        return msg;
+    }
+    
+    /**
+     * Gets the value of a sql ResultSet.
+     * Gives the driver the oportunity to change the value
+     * i.e. to simulate missing data types with other types.
+     * 
+     * @param rset the sql Resultset with the current data row
+     * @param columnIndex one based column Index of the desired column
+     * @param dataType the desired data type
+     * @return the value of the column 
+     */
+    @Override
+    public Object getResultValue(ResultSet rset, int columnIndex, DataType dataType)
+        throws SQLException
+    {
+        // Check for character large object
+        if (dataType == DataType.BOOL)
+        {   // Get character large object
+            String val = rset.getString(columnIndex);
+            if (val==null || rset.wasNull())
+                return null;
+            // Check Value
+            if (val.equalsIgnoreCase("Y") || val.equals("1"))
+                return Boolean.TRUE;
+            return Boolean.FALSE;    
+        }
+        // Default
+        return super.getResultValue(rset, columnIndex, dataType);
+    }
+
+    /**
+     * @see DBDatabaseDriver#getNextSequenceValue(DBDatabase, String, int, Connection)
+     */
+    @Override
+    public Object getNextSequenceValue(DBDatabase db, String seqName, int minValue, Connection conn)
+    { // Use Oracle Sequences
+        StringBuilder sql = new StringBuilder(80);
+        sql.append("SELECT ");
+        db.appendQualifiedName(sql, seqName);
+        sql.append(".NEXTVAL FROM DUAL");
+        Object val = db.querySingleValue(sql.toString(), conn);
+        if (val == null)
+        { // Error!
+            log.error("getNextSequenceValue: Invalid sequence value for sequence " + seqName);
+        }
+        // Done
+        return val;
+    }
+
+    /**
+     * @see DBDatabaseDriver#getDDLScript(DBCmdType, DBObject, DBSQLScript)  
+     */
+    @Override
+    public boolean getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script)
+    {
+        // The Object's database must be attached to this driver
+        if (dbo==null || dbo.getDatabase().getDriver()!=this)
+            return error(Errors.InvalidArg, dbo, "dbo");
+        // Check Type of object
+        if (dbo instanceof DBDatabase)
+        { // Database
+            switch (type)
+            {
+                case CREATE:
+                    return createDatabase((DBDatabase) dbo, script);
+                case DROP:
+                    return dropObject(((DBDatabase) dbo).getSchema(), "USER", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLScript."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBTable)
+        { // Table
+            switch (type)
+            {
+                case CREATE:
+                    return createTable((DBTable) dbo, script);
+                case DROP:
+                    return dropObject(((DBTable) dbo).getName(), "TABLE", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBView)
+        { // View
+            switch (type)
+            {
+                case CREATE:
+                    return createView((DBView) dbo, script);
+                case DROP:
+                    return dropObject(((DBView) dbo).getName(), "VIEW", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBRelation)
+        { // Relation
+            switch (type)
+            {
+                case CREATE:
+                    return createRelation((DBRelation) dbo, script);
+                case DROP:
+                    return dropObject(((DBRelation) dbo).getName(), "CONSTRAINT", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBTableColumn)
+        { // Table Column
+            return alterTable((DBTableColumn) dbo, type, script);
+        } 
+        else
+        { // an invalid argument has been supplied
+            return error(Errors.InvalidArg, dbo, "dbo");
+        }
+    }
+
+    /**
+     * Overridden. Returns a timestamp that is used for record updates created by the database server.
+     * 
+     * @return the current date and time of the database server.
+     */
+    @Override
+    public java.sql.Timestamp getUpdateTimestamp(Connection conn)
+    {
+        // Default implementation
+        ResultSet rs = null;
+        try
+        {   // Oracle Timestamp query
+            rs = executeQuery("select sysdate from dual", null, false, conn);
+            return (rs.next() ? rs.getTimestamp(1) : null);
+        } catch (Exception e)
+        {
+            log.error("getUpdateTimestamp exception: " + e);
+            error(e);
+            return null;
+        } finally
+        { // Cleanup
+            try
+            { // ResultSet close
+                Statement stmt = (rs!=null) ?  rs.getStatement() : null;
+                if (rs != null)
+                    rs.close();
+                if (stmt != null)
+                    stmt.close();
+            } catch (SQLException sqle)
+            {
+                log.error("getUpdateTimestamp close exception: " + sqle);
+            }
+        }
+    }
+
+    /**
+     * Returns true if the database has been created successfully.
+     * 
+     * @return true if the database has been created successfully
+     */
+    private boolean createDatabase(DBDatabase db, DBSQLScript script)
+    {
+        // Create all Sequences
+        Iterator<DBTable> seqtabs = db.getTables().iterator();
+        while (seqtabs.hasNext())
+        {
+            DBTable table = seqtabs.next();
+            Iterator<DBColumn> cols = table.getColumns().iterator();
+            while (cols.hasNext())
+            {
+                DBTableColumn c = (DBTableColumn) cols.next();
+                if (c.getDataType() == DataType.AUTOINC)
+                {
+                    createSequence(db, c, script);
+                }
+            }
+        }
+        // Create all Tables
+        Iterator<DBTable> tables = db.getTables().iterator();
+        while (tables.hasNext())
+        {
+            if (!createTable(tables.next(), script))
+                return false;
+        }
+        // Create Relations
+        Iterator<DBRelation> relations = db.getRelations().iterator();
+        while (relations.hasNext())
+        {
+            if (!createRelation(relations.next(), script))
+                return false;
+        }
+        // Create Views
+        Iterator<DBView> views = db.getViews().iterator();
+        while (views.hasNext())
+        {
+            if (!createView(views.next(), script))
+                if (getErrorType()!=Errors.NotImplemented)
+                    return false;
+        }
+        // Done
+        return true;
+    }
+
+    /**
+     * Returns true if the sequence has been created successfully.
+     * 
+     * @return true if the sequence has been created successfully
+     */
+    private boolean createSequence(DBDatabase db, DBTableColumn c, DBSQLScript script)
+    {
+        Object defValue = c.getDefaultValue();
+        String seqName = (defValue != null) ? defValue.toString() : c.toString();
+        // createSQL
+        StringBuilder sql = new StringBuilder();
+        sql.append("-- creating sequence for column ");
+        sql.append(c.getFullName());
+        sql.append(" --\r\n");
+        sql.append("CREATE SEQUENCE ");
+        db.appendQualifiedName(sql, seqName);
+        sql.append(" INCREMENT BY 1 START WITH 1 MINVALUE 0 NOCYCLE NOCACHE NOORDER");
+        // executeDLL
+        return script.addStmt(sql);
+    }
+    
+    /**
+     * Returns true if the table has been created successfully.
+     * @return true if the table has been created successfully
+     */
+    private boolean createTable(DBTable t, DBSQLScript script)
+    {
+        StringBuilder sql = new StringBuilder();
+        sql.append("-- creating table ");
+        sql.append(t.getName());
+        sql.append(" --\r\n");
+        sql.append("CREATE TABLE ");
+        sql.append(t.getFullName());
+        sql.append(" (");
+        boolean addSeparator = false;
+        Iterator<DBColumn> columns = t.getColumns().iterator();
+        while (columns.hasNext())
+        {
+            DBTableColumn c = (DBTableColumn) columns.next();
+            sql.append((addSeparator) ? ",\r\n   " : "\r\n   ");
+            if (appendColumnDesc(c, sql)==false)
+                continue; // Ignore and continue;
+            addSeparator = true;
+        }
+        // Primary Key
+        DBIndex pk = t.getPrimaryKey();
+        if (pk != null)
+        { // add the primary key
+            sql.append(",\r\n CONSTRAINT ");
+            sql.append(pk.getName());
+            sql.append(" PRIMARY KEY (");
+            addSeparator = false;
+            // columns
+            DBColumn[] keyColumns = pk.getColumns();
+            for (int i = 0; i < keyColumns.length; i++)
+            {
+                sql.append((addSeparator) ? ", " : "");
+                sql.append(keyColumns[i].getName());
+                addSeparator = true;
+            }
+            sql.append(")");
+        }
+        sql.append(")");
+        // Create the table
+        DBDatabase db = t.getDatabase();
+        if (script.addStmt(sql) == false)
+            return false;
+        // Create other Indizes (except primary key)
+        Iterator<DBIndex> indexes = t.getIndexes().iterator();
+        while (indexes.hasNext())
+        {
+            DBIndex idx = indexes.next();
+            if (idx == pk || idx.getType() == DBIndex.PRIMARYKEY)
+                continue;
+
+            // Cretae Index
+            sql.setLength(0);
+            sql.append((idx.getType() == DBIndex.UNIQUE) ? "CREATE UNIQUE INDEX " : "CREATE INDEX ");
+            sql.append(idx.getFullName());
+            sql.append(" ON ");
+            sql.append(t.getFullName());
+            sql.append(" (");
+            addSeparator = false;
+
+            // columns
+            DBColumn[] idxColumns = idx.getColumns();
+            for (int i = 0; i < idxColumns.length; i++)
+            {
+                sql.append((addSeparator) ? ", " : "");
+                sql.append(idxColumns[i].getName());
+                sql.append("");
+                addSeparator = true;
+            }
+            sql.append(")");
+            // Create Index
+            if (script.addStmt(sql) == false)
+                return false;
+        }
+        // add Comments
+        createComment(db, "TABLE", t.getFullName(), t.getComment(), script);
+        columns = t.getColumns().iterator();
+        while (columns.hasNext())
+        {
+            DBColumn c = columns.next();
+            String com = c.getComment();
+            if (com != null)
+                createComment(db, "COLUMN", c.getFullName(), com, script);
+        }
+        // done
+        return success();
+    }
+    
+    /**
+     * Appends a table column defintion to a ddl statement
+     * @param c the column which description to append
+     * @param sql the sql builder object
+     * @return true if the column was successfully appended or false otherwise
+     */
+    private boolean appendColumnDesc(DBTableColumn c, StringBuilder sql)
+    {
+        sql.append(c.getName());
+        sql.append(" ");
+        switch (c.getDataType())
+        {
+            case INTEGER:
+                sql.append("INTEGER");
+                break;
+            case AUTOINC:
+                sql.append("INTEGER");
+                break;
+            case TEXT:
+            { // Check fixed or variable length
+                int size = Math.abs((int) c.getSize());
+                if (size == 0)
+                    size = 100;
+                sql.append("VARCHAR2(");
+                sql.append(String.valueOf(size));
+                sql.append(" char)");
+            }
+                break;
+            case CHAR:
+            { // Check fixed or variable length
+                int size = Math.abs((int) c.getSize());
+                if (size == 0)
+                    size = 1;
+                sql.append("CHAR(");
+                sql.append(String.valueOf(size));
+                sql.append(")");
+            }
+                break;
+            case DATE:
+                sql.append("DATE");
+                break;
+            case DATETIME:
+                sql.append("DATE");
+                break;
+            case BOOL:
+                if ( booleanType==BooleanType.CHAR )
+                     sql.append("CHAR(1)");
+                else sql.append("NUMBER(1,0)");
+                break;
+            case DOUBLE:
+                sql.append("FLOAT(80)");
+                break;
+            case DECIMAL:
+            {
+                sql.append("NUMBER(");
+                int prec = (int) c.getSize();
+                int scale = (int) ((c.getSize() - prec) * 10 + 0.5);
+                // sql.append((prec+scale).ToString());sql.append(",");
+                sql.append(String.valueOf(prec));
+                sql.append(",");
+                sql.append(String.valueOf(scale));
+                sql.append(")");
+            }
+                break;
+            case CLOB:
+                sql.append("CLOB");
+                break;
+            case BLOB:
+                sql.append("BLOB");
+                if (c.getSize() > 0)
+                    sql.append(" (" + String.valueOf((long) c.getSize()) + ") ");
+                break;
+            case UNKNOWN:
+                log.error("Cannot append column of Data-Type 'UNKNOWN'");
+                return false;
+        }
+        // Default Value
+        if (isDDLColumnDefaults() && c.getDataType()!=DataType.AUTOINC && c.getDefaultValue()!=null)
+        {   sql.append(" DEFAULT ");
+            sql.append(getValueString(c.getDefaultValue(), c.getDataType()));
+        }
+        // Nullable
+        if (c.isRequired())
+            sql.append(" NOT NULL");
+        // Done
+        return true;
+    }
+
+    /**
+     * Create a sql string for creating a relation and appends it to the supplied buffer
+     * @return true if the relation has been created successfully
+     */
+    private boolean createRelation(DBRelation r, DBSQLScript script)
+    {
+        DBTable sourceTable = (DBTable) r.getReferences()[0].getSourceColumn().getRowSet();
+        DBTable targetTable = (DBTable) r.getReferences()[0].getTargetColumn().getRowSet();
+
+        StringBuilder sql = new StringBuilder();
+        sql.append("-- creating foreign key constraint ");
+        sql.append(r.getName());
+        sql.append(" --\r\n");
+        sql.append("ALTER TABLE ");
+        sql.append(sourceTable.getFullName());
+        sql.append(" ADD CONSTRAINT ");
+        sql.append(r.getFullName());
+        sql.append(" FOREIGN KEY (");
+        // Source Names
+        boolean addSeparator = false;
+        DBRelation.DBReference[] refs = r.getReferences();
+        for (int i = 0; i < refs.length; i++)
+        {
+            sql.append((addSeparator) ? ", " : "");
+            sql.append(refs[i].getSourceColumn().getName());
+            addSeparator = true;
+        }
+        // References
+        sql.append(") REFERENCES ");
+        sql.append(targetTable.getFullName());
+        sql.append(" (");
+        // Target Names
+        addSeparator = false;
+        for (int i = 0; i < refs.length; i++)
+        {
+            sql.append((addSeparator) ? ", " : "");
+            sql.append(refs[i].getTargetColumn().getName());
+            addSeparator = true;
+        }
+        // done
+        sql.append(")");
+        // done
+        return script.addStmt(sql);
+    }
+
+    /**
+     * Creates an alter table dll statement for adding, modifiying or droping a column.
+     * @param col the column which to add, modify or drop
+     * @param type the type of operation to perform
+     * @param buf buffer to which to append the sql statement to
+     * @return true if the statement was successfully appended to the buffer
+     */
+    private boolean alterTable(DBTableColumn col, DBCmdType type, DBSQLScript script)
+    {
+        StringBuilder sql = new StringBuilder();
+        sql.append("ALTER TABLE ");
+        sql.append(col.getRowSet().getName());
+        switch(type)
+        {
+            case CREATE:
+                sql.append(" ADD ");
+                appendColumnDesc(col, sql);
+                break;
+            case ALTER:
+                sql.append(" MODIFY ");
+                appendColumnDesc(col, sql);
+                break;
+            case DROP:
+                sql.append(" DROP COLUMN ");
+                sql.append(col.getName());
+                break;
+        }
+        // done
+        return script.addStmt(sql);
+    }
+    
+    /**
+     * Returns true if the view has been created successfully.
+     * 
+     * @return true if the view has been created successfully
+     */
+    private boolean createView(DBView v, DBSQLScript script)
+    {
+        // Create the Command
+        DBCommandExpr cmd = v.createCommand();
+        if (cmd==null)
+        {   // Check whether Error information is available
+            log.error("No command has been supplied for view " + v.getName());
+            if (v.hasError())
+                return error(v);
+            // No error information available: Use Errors.NotImplemented
+            return error(Errors.NotImplemented, v.getName() + ".createCommand");
+        }
+        // Make sure there is no OrderBy
+        cmd.clearOrderBy();
+
+        // Build String
+        StringBuilder sql = new StringBuilder();
+        sql.append( "CREATE OR REPLACE VIEW ");
+        sql.append( v.getName() );
+        sql.append( " (" );
+        boolean addSeparator = false;
+        for(DBColumn c : v.getColumns())
+        {
+            if (addSeparator)
+                sql.append(", ");
+            sql.append(c.getName());
+            // next
+            addSeparator = true;
+        }
+        sql.append(")\r\nAS\r\n");
+        cmd.addSQL( sql, DBExpr.CTX_DEFAULT);
+        // done
+        return script.addStmt(sql.toString());
+    }
+
+    /**
+     * Returns true if the comment has been created successfully.
+     * 
+     * @return true if the comment has been created successfully
+     */
+    private boolean createComment(DBDatabase db, String type, String objName, String comment, DBSQLScript script)
+    {
+        if (comment==null || comment.length()==0)
+            return true;
+        StringBuilder sql = new StringBuilder();
+        sql.append("COMMENT ON ");
+        sql.append(type);
+        sql.append(" ");
+        sql.append(objName);
+        sql.append(" IS '");
+        sql.append(comment);
+        sql.append("'");
+        // Create Index
+        return script.addStmt(sql);
+    }
+    
+    /**
+     * Returns true if the object has been dropped successfully.
+     * 
+     * @return true if the object has been dropped successfully
+     */
+    private boolean dropObject(String name, String objType, DBSQLScript script)
+    {
+        if (name == null || name.length() == 0)
+            return error(Errors.InvalidArg, name, "name");
+        // Create Drop Statement
+        StringBuilder sql = new StringBuilder();
+        sql.append("DROP ");
+        sql.append(objType);
+        sql.append(" ");
+        sql.append(name);
+        return script.addStmt(sql);
+    }
+
+    
+    /**
+     * Checks whether the database defintion matches the real database structure.
+     * 
+     * @return true if the database defintion matches the real database structure.
+     */
+    @Override
+    public boolean checkDatabase(DBDatabase db, String owner, Connection conn)
+    {
+        // Check Params
+        if (owner==null || owner.length()==0)
+            return error(Errors.InvalidArg, owner, "owner");
+        // Datebase definition
+        OracleSYSDatabase sysDB = new OracleSYSDatabase(this);
+        // Check Columns
+        DBCommand sysDBCommand = sysDB.createCommand();
+        sysDBCommand.select(sysDB.CI.getColumns());
+        sysDBCommand.where (sysDB.CI.C_OWNER.is(owner));
+        
+        OracleDataDictionnary dataDictionnary = new OracleDataDictionnary();
+        DBReader rd = new DBReader();
+        try
+        {
+            if (rd.open(sysDBCommand, conn))
+            {
+                log.info("---------------------------------------------------------------------------------");
+                log.info("checkDatabase start: " + db.getClass().getName());
+                String skipTable = "";
+                while (rd.moveNext())
+                {
+                    String tableName = rd.getString(sysDB.CI.C_TABLE_NAME);
+
+                    // if a table wasn't found before, skip it
+                    if (tableName.equals(skipTable))
+                        continue;
+
+                    // check if the found table exists in the DBDatabase object
+                    String columnName = rd.getString(sysDB.CI.C_COLUMN_NAME);
+                    DBTable dbTable = db.getTable(tableName);
+                    DBView  dbView  = db.getView(tableName);
+                    
+                    String dataType = rd.getString(sysDB.CI.C_DATA_TYPE);
+                    int charLength = rd.getInt(sysDB.CI.C_CHAR_LENGTH);
+                    int dataLength = rd.getInt(sysDB.CI.C_DATA_LENGTH);
+                    int dataPrecision = rd.getInt(sysDB.CI.C_DATA_PRECISION);
+                    int dataScale = rd.getInt(sysDB.CI.C_DATA_SCALE);
+                    String nullable = rd.getString(sysDB.CI.C_NULLABLE);
+                    
+                    dataDictionnary.fillDataDictionnary(tableName, columnName, dataType, 
+                                                        charLength, dataLength, dataPrecision, dataScale, nullable);
+                    
+                    if (dbTable != null)
+                    {
+                        
+                        // check if the found column exists in the found DBTable
+                        DBColumn col = dbTable.getColumn(columnName);
+                        if (col == null)
+                        {
+                            log.warn("COLUMN NOT FOUND IN " + db.getClass().getName() + "\t: [" + tableName + "]["
+                                           + columnName + "][" + dataType + "][" + dataLength + "]");
+                            continue;
+                        }
+                        /*
+                        else
+                        {   // check the DBTableColumn definition
+                            int length = (charLength>0) ? charLength : dataLength;
+                            dataDictionnary.checkColumnDefinition(col, dataType, length, dataPrecision, dataScale, nullable.equals("N"));
+                        }
+                        */
+                    } 
+                    else if (dbView!=null)
+                    {
+                        log.debug("Column check for view " + tableName + " not yet implemented.");
+                    } 
+                    else
+                    {
+                        log.debug("TABLE OR VIEW NOT FOUND IN " + db.getClass().getName() + "\t: [" + tableName + "]");
+                        // skip this table
+                        skipTable = tableName;
+                        continue;
+                    }
+                }
+                // check Tables
+                dataDictionnary.checkDBTableDefinition(db.getTables());
+                // check Views
+                dataDictionnary.checkDBViewDefinition (db.getViews()); 
+            }
+            else {
+                return error(Errors.NotAuthorized);
+            }
+            log.info("checkDatabase end: " + db.getClass().getName());
+            log.info("---------------------------------------------------------------------------------");
+            return success();
+        } finally
+        {
+            rd.close();
+        }
+    }
+
+}
+

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleDataDictionnary.java
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleDataDictionnary.java?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleDataDictionnary.java (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleDataDictionnary.java Wed Aug  6 01:47:37 2008
@@ -0,0 +1,260 @@
+package org.apache.empire.db.oracle;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBTable;
+import org.apache.empire.db.DBView;
+
+
+public class OracleDataDictionnary {
+    
+    private class ColumnInfo {
+
+        private String dataType;
+        private int charLength;
+        private int dataLength;
+        private int dataPrecision;
+        private int dataScale;
+        private String nullable;
+        
+        public ColumnInfo(String dataType, int charLength, int dataLength, int dataPrecision, int dataScale, String nullable)
+        {
+            super();
+            this.dataType = dataType;
+            this.charLength = charLength;
+            this.dataLength = dataLength;
+            this.dataPrecision = dataPrecision;
+            this.dataScale = dataScale;
+            this.nullable = nullable;
+        }
+
+        public int getCharLength()
+        {
+            return charLength;
+        }
+
+        public int getDataLength()
+        {
+            return dataLength;
+        }
+
+        public int getDataPrecision()
+        {
+            return dataPrecision;
+        }
+
+        public int getDataScale()
+        {
+            return dataScale;
+        }
+
+        public String getDataType()
+        {
+            return dataType;
+        }
+
+        public String getNullable()
+        {
+            return nullable;
+        }
+
+    }
+    
+    protected static Log log = LogFactory.getLog(OracleDataDictionnary.class);
+    HashMap<String, HashMap<String, ColumnInfo>> dictionnary = new HashMap<String, HashMap<String, ColumnInfo>>();
+    private Map<String, DataType[]> dataTypeMapping    = null;
+
+    /**
+     * Defines mapping of the Empire-db data types with the oracle data types.
+     */
+    public OracleDataDictionnary() {
+        dataTypeMapping = new HashMap<String, DataType[]>();
+        dataTypeMapping.put("VARCHAR2", new DataType[] { DataType.TEXT });
+        dataTypeMapping.put("CHAR",     new DataType[] { DataType.CHAR, DataType.BOOL });
+        dataTypeMapping.put("NUMBER",   new DataType[] { DataType.DECIMAL, DataType.DOUBLE, 
+                                                         DataType.INTEGER, DataType.AUTOINC, DataType.BOOL });
+        dataTypeMapping.put("DATE",     new DataType[] { DataType.DATE, DataType.DATETIME });
+        dataTypeMapping.put("CLOB",     new DataType[] { DataType.CLOB });
+        dataTypeMapping.put("BLOB",     new DataType[] { DataType.BLOB });
+    }
+    
+    public HashMap<String, HashMap<String, ColumnInfo>> getDictionnary() {
+        return dictionnary;
+    }
+
+
+    public void fillDataDictionnary(String tableName, String columnName, String dataType, int charLength, int dataLength, int dataPrecision, int dataScale, String nullable) {
+        ColumnInfo colInfo = new ColumnInfo(dataType, charLength, dataLength, dataPrecision, dataScale, nullable);
+        HashMap<String, ColumnInfo> columns = new HashMap<String, ColumnInfo>();
+        
+        if(dictionnary.containsKey(tableName)) {
+            columns = dictionnary.get(tableName);
+        }
+        columns.put(columnName, colInfo);
+        dictionnary.put(tableName, columns);
+    }
+    
+    /**
+     * Checks if the ORACLE datatype can be mapped with a DBTable data type.
+     * 
+     * @param dbDatatype ORACLE datatype
+     * @param colDataType DBTableColumn datatype
+     * @return true if the type can be mapped, false otherwise
+     */
+    private boolean checkMapping(String dbDatatype, DataType colDataType)
+    {
+        DataType[] colTypes = dataTypeMapping.get(dbDatatype);
+        if(colTypes == null) 
+        {
+            log.warn("MAPPING NOT DEFINED FOR " + dbDatatype + " -> " + colDataType);
+            return false;
+        }
+        for (int i = 0; i < colTypes.length; i++)
+        {
+            if (colTypes[i] == colDataType)
+                return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Checks a DBTableColumn definition. The set attributes must fint to the overgiven db attributes.
+     * 
+     * @param col Column to check
+     * @param dbDataType Datatype of db column
+     * @param dbDataLength Datalength of db column
+     * @param dbDataPrecision Data precision of db column
+     * @param dbDataScale Data scale of db column
+     * @param dbRequired Is nullable of the db column
+     * @return true if the column definition fits, false otherwise
+
+    private boolean checkColumnDefinition(DBColumn col, String dbDataType, int dbDataLength, int dbDataPrecision,
+                                          int dbDataScale, boolean dbRequired)
+    {
+        // FUTURE find a way to check the precision for numbers
+
+        boolean result = true;
+        DataType colDataType = col.getDataType();
+        int size = (int) col.getSize();
+
+        // check if the column data type can be mapped with the db column data type
+        if (checkMapping(dbDataType, colDataType) == false)
+        {
+            log.warn("WRONG DATATYPE \t\t\t\t\t\t: [" + col.getRowSet().getName() + "][" + col.getName() + "] -> DB : ["
+                           + dbDataType + "]" + "[" + dbDataLength + "]");
+            result = false;
+        }
+
+        // check if the column is required and if the column is defined as required
+        if (dbRequired && col.isRequired() == false)
+        {
+            log.warn("COLUMN IS REQUIRED \t\t\t\t\t: [" + col.getRowSet().getName() + "][" + col.getName() + "]");
+            result = false;
+        } 
+        else if (dbRequired == false && col.isRequired() == true)
+        {
+            log.warn("COLUMN IS NOT REQUIRED \t\t\t\t: [" + col.getRowSet().getName() + "][" + col.getName() + "]");
+            result = false;
+        }
+
+        // check the data length if the column is a varchar2
+        if (dbDataType.equals("VARCHAR2") && (dbDataLength != size))
+        {
+            log.warn("WRONG COLUMN SIZE \t\t\t\t\t: [" + col.getRowSet().getName() + "][" + col.getName() + "] -> DB : ["
+                           + dbDataType + "][" + dbDataLength + "]");
+            result = false;
+        }
+
+        return result;
+    }
+     */
+    
+    private void checkColumn(DBColumn column, ColumnInfo colInfo)
+    {
+        if(checkMapping(colInfo.getDataType(), column.getDataType()) == false) {
+            log.warn("WRONG DATA TYPE: \t" + column.getFullName() + " is set to " + column.getDataType() +
+                     " instead of " + colInfo.getDataType());
+        }
+        if(colInfo.getDataType().equals("VARCHAR2") && (column.getSize() != colInfo.getCharLength())) {
+            log.warn("WRONG COLUMN SIZE: \t" + column.getFullName() + " is set to " + (int)column.getSize() +
+                     " instead of " + colInfo.getCharLength()); 
+        }    
+        if(column.isRequired() != colInfo.getNullable().equals("N")) {
+            log.warn("WRONG NULLABLE FLAG: \t" + column.getFullName() + " is set to " + column.isRequired() +
+                     " instead of " + colInfo.getNullable().equals("N")); 
+        }
+    }
+    
+    public void checkDBTableDefinition(List<DBTable> dbTables) {
+        // go through all tables defined in the Java code
+        for(DBTable currentTable: dbTables) {
+            String dbTableName = currentTable.getName();
+            // check if the table name is in the data dictionnary
+            if(this.dictionnary.containsKey(dbTableName)) {
+                // go through all columns of the table
+                for(DBColumn currentColumn : currentTable.getColumns()) {
+                    Collection<String> dictColumns = this.dictionnary.get(dbTableName).keySet();
+                    // check if the column name is in the data dictionnary
+                    if(dictColumns.contains(currentColumn.getName())) {
+                        // go through all columns of the table in the data dictionnary
+                        for(String dictColumn : dictColumns) {
+                            // compare the columnnames
+                            if(currentColumn.getName().equals(dictColumn)) {
+                                ColumnInfo colInfo = this.dictionnary.get(currentTable.getName()).get(dictColumn);
+                                checkColumn(currentColumn, colInfo);
+                            }
+                        }
+                    }
+                    else {
+                        log.warn("MISSING COLUMN: \t" + currentColumn.getFullName() + " does not exist in database"); 
+                    }
+                }
+            }
+            else {
+                log.warn("MISSING TABLE: \t" + currentTable.getName() + " does not exist in database"); 
+            }
+        }
+    }
+    
+    public void checkDBViewDefinition(List<DBView> dbViews) {
+//      go through all views defined in the Java code
+        for(DBView currentView: dbViews) {
+            String dbviewName = currentView.getName();
+            // check if the view name is in the data dictionnary
+            if(this.dictionnary.containsKey(dbviewName)) {
+                // go through all columns of the table
+                for(DBColumn currentColumn : currentView.getColumns()) {
+                    Collection<String> dictColumns = this.dictionnary.get(dbviewName).keySet();
+                    // check if the column name is in the data dictionnary
+                    if(dictColumns.contains(currentColumn.getName())) {
+                        // go through all columns of the view in the data dictionnary
+                        for(String dictColumn : dictColumns) {
+                            // compare the columnnames                           
+                            if(currentColumn.getName().equals(dictColumn)) {
+                                ColumnInfo colInfo = this.dictionnary.get(currentView.getName()).get(dictColumn);
+                                if(checkMapping(colInfo.getDataType(), currentColumn.getDataType()) == false) {
+                                    log.warn("WRONG DATA TYPE: \t" + currentColumn.getFullName() + " is set to " + currentColumn.getDataType() +
+                                             " instead of " + colInfo.getDataType());
+                                }
+                            }
+                        }
+                    }
+                    else {
+                        log.warn("MISSING COLUMN: \t" + currentColumn.getFullName() + " does not exist in database."); 
+                    }
+                }
+            }
+            else {
+                log.warn("MISSING VIEW: \t" + currentView.getName() + " does not exist in database."); 
+            }
+        }
+    }
+    
+}

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleSYSDatabase.java
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleSYSDatabase.java?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleSYSDatabase.java (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/OracleSYSDatabase.java Wed Aug  6 01:47:37 2008
@@ -0,0 +1,155 @@
+/*
+ * ESTEAM Software GmbH
+ */
+package org.apache.empire.db.oracle;
+
+// java
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.*;
+
+/**
+ * Represents the data model of the system tables.
+ * They are required to parse the data models.
+ * <P>
+ * 
+ * @author ESTEAM software <A TARGET="esteam" HREF="http://www.esteam.de">www.esteam.de</A>
+ */
+public class OracleSYSDatabase extends DBDatabase 
+{
+
+    // Table for all tables of a schema with their comments
+    public static class DBTabComments extends DBTable
+    {
+      public DBTableColumn C_OWNER;
+      public DBTableColumn C_TABLE_NAME;
+      public DBTableColumn C_TABLE_TYPE;
+      public DBTableColumn C_COMMENTS;
+      // Constructor
+      public DBTabComments(DBDatabase db)
+      {
+        super("ALL_TAB_COMMENTS", db);
+        // add all Colums
+        C_OWNER       = addColumn("OWNER",      DataType.TEXT, 50, false);
+        C_TABLE_NAME  = addColumn("TABLE_NAME", DataType.TEXT, 50, false);
+        C_TABLE_TYPE  = addColumn("TABLE_TYPE", DataType.TEXT, 50, false);
+        C_COMMENTS    = addColumn("COMMENTS",   DataType.TEXT, 500, false);
+      }
+    }
+
+    // Table for all constraints
+    public static class DBConstraints extends DBTable
+    {
+      public DBTableColumn C_CONSTRAINT_NAME;
+      public DBTableColumn C_TABLE_NAME;
+      public DBTableColumn C_R_CONSTRAINT_NAME;
+      public DBTableColumn C_CONSTRAINT_TYPE;
+      public DBTableColumn C_STATUS;
+      // Constructor
+      public DBConstraints(DBDatabase db)
+      {
+        super("ALL_CONSTRAINTS", db);
+        // add all Colums
+      
+        C_CONSTRAINT_NAME    = addColumn("CONSTRAINT_NAME",     DataType.TEXT, 100, false);
+        C_TABLE_NAME         = addColumn("TABLE_NAME",          DataType.TEXT, 100, false);
+        C_R_CONSTRAINT_NAME  = addColumn("R_CONSTRAINT_NAME",   DataType.TEXT, 100, false);
+        C_CONSTRAINT_TYPE    = addColumn("CONSTRAINT_TYPE",     DataType.TEXT, 1, false);
+        C_STATUS             = addColumn("STATUS",              DataType.TEXT, 20, false);
+      }
+    }
+
+    // Table for Columns and Tables a constraint is associated to
+    public static class DBUserConCol extends DBTable
+    {
+      public DBTableColumn C_CONSTRAINT_NAME;
+      public DBTableColumn C_TABLE_NAME;
+      public DBTableColumn C_COLUMN_NAME;
+      public DBTableColumn C_OWNER;
+      // Constructor
+      public DBUserConCol(DBDatabase db)
+      {
+        super("USER_CONS_COLUMNS", db);
+        // add all Colums
+      
+        C_CONSTRAINT_NAME = addColumn("CONSTRAINT_NAME",    DataType.TEXT, 100, false);
+        C_TABLE_NAME      = addColumn("TABLE_NAME",         DataType.TEXT, 100, false);
+        C_COLUMN_NAME     = addColumn("COLUMN_NAME",        DataType.TEXT, 100, false);
+        C_OWNER           = addColumn("OWNER",              DataType.TEXT, 100, false);
+        setPrimaryKey(C_CONSTRAINT_NAME);
+      }
+    }
+
+    // Table for all columns of a schema with their comments
+    public static class DBColInfo extends DBTable
+    {
+      public DBTableColumn C_OWNER;
+      public DBTableColumn C_TABLE_NAME;
+      public DBTableColumn C_COLUMN_NAME;
+      public DBTableColumn C_DATA_TYPE;
+      public DBTableColumn C_DATA_TYPE_MOD;
+      public DBTableColumn C_DATA_TYPE_OWNER;
+      public DBTableColumn C_NULLABLE;
+      public DBTableColumn C_DATA_LENGTH;
+      public DBTableColumn C_DATA_PRECISION;
+      public DBTableColumn C_DATA_SCALE;
+      public DBTableColumn C_CHAR_LENGTH;
+
+      // Constructor
+      public DBColInfo(DBDatabase db)
+      {
+        super("ALL_TAB_COLUMNS", db);
+        // add all Colums
+        C_OWNER           = addColumn("OWNER",           DataType.TEXT,   30, false);
+        C_TABLE_NAME      = addColumn("TABLE_NAME",      DataType.TEXT,   30, false);
+        C_COLUMN_NAME     = addColumn("COLUMN_NAME",     DataType.TEXT,   30, false);
+        C_DATA_TYPE       = addColumn("DATA_TYPE",       DataType.TEXT,   50, false);
+        C_DATA_TYPE_MOD   = addColumn("DATA_TYPE_MOD",   DataType.TEXT,   50, false);
+        C_DATA_TYPE_OWNER = addColumn("DATA_TYPE_OWNER", DataType.TEXT,   50, false);
+        C_NULLABLE        = addColumn("NULLABLE",        DataType.TEXT,    1, false);
+        C_DATA_LENGTH     = addColumn("DATA_LENGTH",     DataType.DECIMAL, 0, false);
+        C_DATA_PRECISION  = addColumn("DATA_PRECISION",  DataType.DECIMAL, 0, false);
+        C_DATA_SCALE      = addColumn("DATA_SCALE",      DataType.DECIMAL, 0, false);
+        C_CHAR_LENGTH     = addColumn("CHAR_LENGTH",     DataType.DECIMAL, 0, false);
+      }
+    }
+
+    // Table for all columns of a schema with their comments
+    public static class DBColComments extends DBTable
+    {
+      public DBTableColumn C_OWNER;
+      public DBTableColumn C_TABLE_NAME;
+      public DBTableColumn C_COLUMN_NAME;
+      public DBTableColumn C_COMMENTS;
+      // Constructor
+      public DBColComments(DBDatabase db)
+      {
+        super("ALL_COL_COMMENTS", db);
+        // add all Colums
+        C_OWNER        = addColumn("OWNER",       DataType.TEXT, 50, false);
+        C_TABLE_NAME   = addColumn("TABLE_NAME",  DataType.TEXT, 50, false);
+        C_COLUMN_NAME  = addColumn("COLUMN_NAME", DataType.TEXT, 50, false);
+        C_COMMENTS     = addColumn("COMMENTS",    DataType.TEXT, 500, false);
+      }
+    }
+
+    public DBTabComments  TC = null;
+    public DBColInfo      CI = null;
+    public DBColComments  CC = null;  
+    public DBConstraints  CO = null;  
+    public DBUserConCol   UC = null;  
+
+    public OracleSYSDatabase(DBDatabaseDriverOracle driver)
+    {
+       // System schema
+       super("SYS");
+       // Set Driver (do not use open(...)!)
+       this.driver = driver; 
+       // Add Tables
+       TC = new DBTabComments (this); 
+       CI = new DBColInfo     (this);  
+       CC = new DBColComments (this); 
+       CO = new DBConstraints (this);  
+       UC = new DBUserConCol  (this);  
+    }
+
+}
\ No newline at end of file

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/package.html
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/package.html?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/package.html (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/oracle/package.html Wed Aug  6 01:47:37 2008
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+/*
+ * ESTEAM Software GmbH, 12.12.2007
+ */
+-->
+</head>
+<body>
+
+This package contains classes necessary to support the Oracle database system.
+Only Version 9 or higher is supported.
+
+</body></html>
\ No newline at end of file

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/package.html
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/package.html?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/package.html (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/package.html Wed Aug  6 01:47:37 2008
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+/*
+ * ESTEAM Software GmbH, 12.12.2007
+ */
+-->
+</head>
+<body>
+
+This package contains the core Empire-DB implementation classes.
+
+</body></html>
\ No newline at end of file

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java Wed Aug  6 01:47:37 2008
@@ -0,0 +1,703 @@
+/*
+ * ESTEAM Software GmbH, 14.12.2004
+ */
+package org.apache.empire.db.sqlserver;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+
+import org.apache.empire.commons.Errors;
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBCmdType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBCommandExpr;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.DBDriverFeature;
+import org.apache.empire.db.DBExpr;
+import org.apache.empire.db.DBIndex;
+import org.apache.empire.db.DBObject;
+import org.apache.empire.db.DBRelation;
+import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.DBTable;
+import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.DBView;
+
+
+/**
+ * This class provides support for the Microsoft SQL-Server database system.
+ * 
+ * @author ESTEAM software <A TARGET="esteam" HREF="http://www.esteam.de">www.esteam.de </A>
+ * 
+ */
+public class DBDatabaseDriverMSSQL extends DBDatabaseDriver
+{
+    /**
+     * Defines the Microsoft SQL-Server command type.
+     */ 
+    public static class DBCommandMSSQL extends DBCommand
+    {
+    	public DBCommandMSSQL(DBDatabase db)
+    	{
+    		super(db);
+    	}
+    }
+	
+    // Properties
+    private String databaseName = null;
+    private String objectOwner = "dbo";
+    private String sequenceTableName = "Sequences";
+    
+    /**
+     * Constructor for the MSSQL database driver.<br>
+     */
+    public DBDatabaseDriverMSSQL()
+    {
+        // Default Constructor
+    }
+
+    public String getDatabaseName()
+    {
+        return databaseName;
+    }
+
+    public void setDatabaseName(String databaseName)
+    {
+        this.databaseName = databaseName;
+    }
+
+    public String getObjectOwner()
+    {
+        return objectOwner;
+    }
+
+    public void setObjectOwner(String objectOwner)
+    {
+        this.objectOwner = objectOwner;
+    }
+
+    /**
+     * returns the name of the sequence table
+     * @return the name of the table used for sequence number generation
+     */
+	public String getSequenceTableName()
+	{
+		return sequenceTableName;
+	}
+
+    /**
+     * Sets the name of the sequence table.
+     * @param sequenceTableName the name of the table used for sequence number generation
+     */
+	public void setSequenceTableName(String sequenceTableName)
+	{
+		this.sequenceTableName = sequenceTableName;
+	}
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.empire.db.DBDatabaseDriver#openDatabase(org.apache.empire.db.DBDatabase, java.sql.Connection)
+     */
+    @Override
+    public boolean attachDatabase(DBDatabase db, Connection conn)
+    {
+        // Prepare
+        try
+        {   // Set Database
+            if (StringUtils.isValid(databaseName))
+                executeSQL("USE " + databaseName, null, conn);
+            // Set Dateformat
+            executeSQL("SET DATEFORMAT ymd", null, conn);
+            // Sequence Table
+            if (db.getTable(sequenceTableName)==null)
+                new DBSeqTable(sequenceTableName, db);
+            // Check Schema
+            String schema = db.getSchema();
+            if (StringUtils.isValid(schema) && schema.indexOf('.')<0 && StringUtils.isValid(objectOwner))
+            {   // append database owner
+                db.setSchema(schema + "." + objectOwner);
+            }
+            // call Base implementation
+            return super.attachDatabase(db, conn);
+            
+        } catch (SQLException e)
+        {
+            return error(e);
+        }
+    }
+
+    /**
+     * Creates a new Microsoft SQL-Server command object.
+     * 
+     * @return the new DBCommandMSSQL object
+     */
+    @Override
+    public DBCommand createCommand(DBDatabase db)
+    {
+        if (db == null)
+            return null;
+        // create command object
+        return new DBCommandMSSQL(db);
+    }
+
+    /**
+     * Returns whether or not a particular feature is supported by this driver
+     * @param type type of requrested feature. @see DBDriverFeature
+     * @return true if the features is supported or false otherwise
+     */
+    @Override
+    public boolean isSupported(DBDriverFeature type)
+    {
+        switch (type)
+        {   // return support info 
+            case CREATE_SCHEMA: return true;
+            case SEQUENCES:     return true;    
+        }
+        return false;
+    }
+
+    /**
+     * Gets an sql phrase template for this database system.<br>
+     * @see DBDatabaseDriver#getSQLPhrase(int)
+     * @return the phrase template
+     */
+    @Override
+    public String getSQLPhrase(int phrase)
+    {
+        switch (phrase)
+        {
+            // sql-phrases
+            case SQL_NULL_VALUE:              return "null";
+            case SQL_RENAME_COLUMN:           return " AS ";
+            case SQL_PARAMETER:               return " ? ";
+            case SQL_CONCAT_EXPR:             return " + ";
+            case SQL_RENAME_TABLE:            return " ";
+            case SQL_DATABASE_LINK:           return "@";
+            // data types
+            case SQL_BOOLEAN_TRUE:            return "1";
+            case SQL_BOOLEAN_FALSE:           return "0";
+            case SQL_CURRENT_DATE:            return "convert(char, getdate(), 111)";
+            case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
+            case SQL_DATE_TEMPLATE:           return "'{0}'";
+            case SQL_CURRENT_DATETIME:        return "getdate()";
+            case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss.SSS";
+            case SQL_DATETIME_TEMPLATE:       return "'{0}'";
+            // functions
+            case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
+            case SQL_FUNC_SUBSTRING:          return "substring(?, {0}, 4000)";
+            case SQL_FUNC_SUBSTRINGEX:        return "substring(?, {0}, {1})";
+            case SQL_FUNC_REPLACE:            return "replace(?, {0}, {1})";
+            case SQL_FUNC_REVERSE:            return "reverse(?)"; 
+            case SQL_FUNC_STRINDEX:           return "charindex({0}, ?)"; 
+            case SQL_FUNC_STRINDEXFROM:       return "charindex({0}, ?, {1})"; 
+            case SQL_FUNC_LENGTH:             return "len(?)";
+            case SQL_FUNC_UPPER:              return "upper(?)";
+            case SQL_FUNC_LOWER:              return "lcase(?)";
+            case SQL_FUNC_TRIM:               return "trim(?)";
+            case SQL_FUNC_LTRIM:              return "ltrim(?)";
+            case SQL_FUNC_RTRIM:              return "rtrim(?)";
+            case SQL_FUNC_ESCAPE:             return "? escape '{0}'";
+            // Numeric
+            case SQL_FUNC_ABS:                return "abs(?)";
+            case SQL_FUNC_ROUND:              return "round(?,{0})";
+            case SQL_FUNC_TRUNC:              return "trunc(?,{0})";
+            case SQL_FUNC_CEILING:            return "ceiling(?)";
+            case SQL_FUNC_FLOOR:              return "floor(?)";
+            // Date
+            case SQL_FUNC_DAY:                return "day(?)";
+            case SQL_FUNC_MONTH:              return "month(?)";
+            case SQL_FUNC_YEAR:               return "year(?)";
+            // Aggregation
+            case SQL_FUNC_SUM:                return "sum(?)";
+            case SQL_FUNC_COUNT:              return "count(?)";
+            case SQL_FUNC_MAX:                return "max(?)";
+            case SQL_FUNC_MIN:                return "min(?)";
+            case SQL_FUNC_AVG:                return "avg(?)";
+            // Others
+            case SQL_FUNC_DECODE:             return "case ? {0} end";
+            case SQL_FUNC_DECODE_SEP:         return " ";
+            case SQL_FUNC_DECODE_PART:        return "when {0} then {1}";
+            case SQL_FUNC_DECODE_ELSE:        return "else {0}";
+            // Not defined
+            default:
+                log.error("SQL phrase " + String.valueOf(phrase) + " is not defined!");
+                return "?";
+        }
+    }
+
+    /**
+     * @see DBDatabaseDriver#getConvertPhrase(DataType, DataType, Object)
+     */
+    @Override
+    public String getConvertPhrase(DataType destType, DataType srcType, Object format)
+    {
+        switch(destType)
+        {
+           case BOOL:      return "convert(bit, ?)";
+           case INTEGER:   return "convert(int, ?)";
+           case DECIMAL:   return "convert(decimal, ?)";
+           case DOUBLE:    return "convert(float, ?)";
+           case DATE:      return "convert(datetime, ?, 111)";
+           case DATETIME:  return "convert(datetime, ?, 120)";
+           // Convert to text
+           case TEXT:
+                // Date-Time-Format "YYYY-MM-DD hh.mm.ss"
+                if (srcType==DataType.DATE)
+                    return "replace(convert(nvarchar, ?, 111), '/', '-')";
+                if (srcType==DataType.DATETIME)
+                    return "convert(nvarchar, ?, 120)";
+                return "convert(nvarchar, ?)";
+           case BLOB:
+                return "convert(varbinary, ?)";
+           // Unknown Type                                       
+           default:
+               	log.error("getConvertPhrase: unknown type (" + String.valueOf(destType));
+                return "?";
+        }
+    }
+    
+    /**
+     * @see DBDatabaseDriver#getNextSequenceValue(DBDatabase, String, int, Connection)
+     */
+    @Override
+    public Object getNextSequenceValue(DBDatabase db, String seqName, int minValue, Connection conn)
+    { 	//Use Oracle Sequences
+        DBTable t = db.getTable(sequenceTableName);
+        return ((DBSeqTable)t).getNextValue(seqName, minValue, conn);
+    }
+
+    /**
+     * @see DBDatabaseDriver#getDDLScript(DBCmdType, DBObject, DBSQLScript)  
+     */
+    @Override
+    public boolean getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script)
+    {
+        // The Object's database must be attached to this driver
+        if (dbo==null || dbo.getDatabase().getDriver()!=this)
+            return error(Errors.InvalidArg, dbo, "dbo");
+        // Check Type of object
+        if (dbo instanceof DBDatabase)
+        { // Database
+            switch (type)
+            {
+                case CREATE:
+                    return createDatabase((DBDatabase) dbo, script, true);
+                case DROP:
+                    return dropObject(((DBDatabase) dbo).getSchema(), "DATABASE", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBTable)
+        { // Table
+            switch (type)
+            {
+                case CREATE:
+                    return createTable((DBTable) dbo, script);
+                case DROP:
+                    return dropObject(((DBTable) dbo).getName(), "TABLE", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBView)
+        { // View
+            switch (type)
+            {
+                case CREATE:
+                    return createView((DBView) dbo, script);
+                case DROP:
+                    return dropObject(((DBView) dbo).getName(), "VIEW", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBRelation)
+        { // Relation
+            switch (type)
+            {
+                case CREATE:
+                    return createRelation((DBRelation) dbo, script);
+                case DROP:
+                    return dropObject(((DBRelation) dbo).getName(), "CONSTRAINT", script);
+                default:
+                    return error(Errors.NotImplemented, "getDDLCommand."+dbo.getClass().getName()+"."+String.valueOf(type));
+            }
+        } 
+        else if (dbo instanceof DBTableColumn)
+        { // Table Column
+            return alterTable((DBTableColumn) dbo, type, script);
+        } 
+        else
+        { // an invalid argument has been supplied
+            return error(Errors.InvalidArg, dbo, "dbo");
+        }
+    }
+
+    /**
+     * Overridden. Returns a timestamp that is used for record updates created by the database server.
+     * 
+     * @return the current date and time of the database server.
+     */
+    @Override
+    public java.sql.Timestamp getUpdateTimestamp(Connection conn)
+    {
+        // Default implementation
+    	GregorianCalendar cal = new GregorianCalendar();
+    	return new java.sql.Timestamp(cal.getTimeInMillis());
+    }
+
+    /*
+     * return the sql for creating a Database
+     */
+    private boolean createDatabase(DBDatabase db, DBSQLScript script, boolean createSchema)
+    {
+        // User Master to create Database
+        if (createSchema)
+        {   // check database Name
+            if (StringUtils.isValid(databaseName)==false)
+                return error(Errors.InvalidProperty, "databaseName");
+            // Create Database
+            script.addStmt("USE master");
+            script.addStmt("CREATE DATABASE " + databaseName);
+            script.addStmt("USE " + databaseName);
+            script.addStmt("SET DATEFORMAT ymd");
+            // Sequence Table
+            if (db.getTable(sequenceTableName)==null)
+                new DBSeqTable(sequenceTableName, db);
+        }
+        // Create all Tables
+        Iterator<DBTable> tables = db.getTables().iterator();
+        while (tables.hasNext())
+        {
+            if (!createTable(tables.next(), script))
+                return false;
+        }
+        // Create Relations
+        Iterator<DBRelation> relations = db.getRelations().iterator();
+        while (relations.hasNext())
+        {
+            if (!createRelation(relations.next(), script))
+                return false;
+        }
+        // Create Views
+        Iterator<DBView> views = db.getViews().iterator();
+        while (views.hasNext())
+        {
+            if (!createView(views.next(), script))
+                return false;
+        }
+        // Done
+        return true;
+    }
+    
+    /**
+     * Returns true if the table has been created successfully.
+     * 
+     * @return true if the table has been created successfully
+     */
+    private boolean createTable(DBTable t, DBSQLScript script)
+    {
+        StringBuilder sql = new StringBuilder();
+        sql.append("-- creating table ");
+        sql.append(t.getName());
+        sql.append(" --\r\n");
+        sql.append("CREATE TABLE [");
+        sql.append(t.getFullName());
+        sql.append("] (");
+        boolean addSeparator = false;
+        Iterator<DBColumn> columns = t.getColumns().iterator();
+        while (columns.hasNext())
+        {
+            DBTableColumn c = (DBTableColumn) columns.next();
+            sql.append((addSeparator) ? ",\r\n   " : "\r\n   ");
+            if (appendColumnDesc(c, sql)==false)
+                continue; // Ignore and continue;
+            addSeparator = true;
+        }
+        // Primary Key
+        DBIndex pk = t.getPrimaryKey();
+        if (pk != null)
+        { // add the primary key
+            sql.append(",\r\n CONSTRAINT ");
+            sql.append(pk.getName());
+            sql.append(" PRIMARY KEY (");
+            addSeparator = false;
+            // columns
+            DBColumn[] keyColumns = pk.getColumns();
+            for (int i = 0; i < keyColumns.length; i++)
+            {
+                sql.append((addSeparator) ? ", " : "");
+                sql.append(keyColumns[i].getName());
+                addSeparator = true;
+            }
+            sql.append(")");
+        }
+        sql.append(")");
+        // Create the table
+        if (script.addStmt(sql) == false)
+            return false;
+        // Create other Indizes (except primary key)
+        Iterator<DBIndex> indexes = t.getIndexes().iterator();
+        while (indexes.hasNext())
+        {
+            DBIndex idx = indexes.next();
+            if (idx == pk || idx.getType() == DBIndex.PRIMARYKEY)
+                continue;
+
+            // Cretae Index
+            sql.setLength(0);
+            sql.append((idx.getType() == DBIndex.UNIQUE) ? "CREATE UNIQUE INDEX " : "CREATE INDEX ");
+            sql.append(idx.getFullName());
+            sql.append(" ON ");
+            sql.append(t.getFullName());
+            sql.append(" (");
+            addSeparator = false;
+
+            // columns
+            DBColumn[] idxColumns = idx.getColumns();
+            for (int i = 0; i < idxColumns.length; i++)
+            {
+                sql.append((addSeparator) ? ", " : "");
+                sql.append(idxColumns[i].getName());
+                sql.append("");
+                addSeparator = true;
+            }
+            sql.append(")");
+            // Create Index
+            if (script.addStmt(sql) == false)
+                return false;
+        }
+        // done
+        return success();
+    }
+    
+    /**
+     * Appends a table column defintion to a ddl statement
+     * @param c the column which description to append
+     * @param sql the sql builder object
+     * @return true if the column was successfully appended or false otherwise
+     */
+    private boolean appendColumnDesc(DBTableColumn c, StringBuilder sql)
+    {
+        sql.append(c.getName());
+        sql.append(" ");
+        switch (c.getDataType())
+        {
+            case INTEGER:
+                sql.append("[int]");
+                break;
+            case AUTOINC:
+                sql.append("[int]");
+                break;
+            case TEXT:
+            { // Check fixed or variable length
+                int size = Math.abs((int) c.getSize());
+                if (size == 0)
+                    size = 100;
+                sql.append("[nvarchar](");
+                sql.append(String.valueOf(size));
+                sql.append(")");
+            }
+                break;
+            case CHAR:
+            { // Check fixed or variable length
+                int size = Math.abs((int) c.getSize());
+                if (size == 0)
+                    size = 1;
+                sql.append("[char] (");
+                sql.append(String.valueOf(size));
+                sql.append(")");
+            }
+                break;
+            case DATE:
+                sql.append("[datetime]");
+                break;
+            case DATETIME:
+                sql.append("[datetime]");
+                break;
+            case BOOL:
+                sql.append("[bit]");
+                break;
+            case DOUBLE:
+                sql.append("[float]");
+                break;
+            case DECIMAL:
+            {
+                sql.append("[decimal](");
+                int prec = (int) c.getSize();
+                int scale = (int) ((c.getSize() - prec) * 10 + 0.5);
+                // sql.append((prec+scale).ToString());sql.append(",");
+                sql.append(String.valueOf(prec));
+                sql.append(",");
+                sql.append(String.valueOf(scale));
+                sql.append(")");
+            }
+                break;
+            case CLOB:
+                sql.append("[ntext]");
+                break;
+            case BLOB:
+                sql.append("[image]");
+                if (c.getSize() > 0)
+                    sql.append(" (" + String.valueOf((long) c.getSize()) + ") ");
+                break;
+            case UNKNOWN:
+                 log.error("Cannot append column of Data-Type 'UNKNOWN'");
+                 return false;
+        }
+        // Default Value
+        if (isDDLColumnDefaults() && c.getDataType()!=DataType.AUTOINC && c.getDefaultValue()!=null)
+        {   sql.append(" DEFAULT ");
+            sql.append(getValueString(c.getDefaultValue(), c.getDataType()));
+        }
+        // Nullable
+        if (c.isRequired())
+            sql.append(" NOT NULL");
+        // Done
+        return true;
+    }
+
+    /**
+     * Returns true if the relation has been created successfully.
+     * 
+     * @return true if the relation has been created successfully
+     */
+    private boolean createRelation(DBRelation r, DBSQLScript script)
+    {
+        DBTable sourceTable = (DBTable) r.getReferences()[0].getSourceColumn().getRowSet();
+        DBTable targetTable = (DBTable) r.getReferences()[0].getTargetColumn().getRowSet();
+
+        StringBuilder sql = new StringBuilder();
+        sql.append("-- creating foreign key constraint ");
+        sql.append(r.getName());
+        sql.append(" --\r\n");
+        sql.append("ALTER TABLE ");
+        sql.append(sourceTable.getFullName());
+        sql.append(" ADD CONSTRAINT ");
+        sql.append(r.getFullName());
+        sql.append(" FOREIGN KEY (");
+        // Source Names
+        boolean addSeparator = false;
+        DBRelation.DBReference[] refs = r.getReferences();
+        for (int i = 0; i < refs.length; i++)
+        {
+            sql.append((addSeparator) ? ", " : "");
+            sql.append(refs[i].getSourceColumn().getName());
+            addSeparator = true;
+        }
+        // References
+        sql.append(") REFERENCES ");
+        sql.append(targetTable.getFullName());
+        sql.append(" (");
+        // Target Names
+        addSeparator = false;
+        for (int i = 0; i < refs.length; i++)
+        {
+            sql.append((addSeparator) ? ", " : "");
+            sql.append(refs[i].getTargetColumn().getName());
+            addSeparator = true;
+        }
+        // done
+        sql.append(")");
+        if (script.addStmt(sql) == false)
+            return false;
+        // done
+        return success();
+    }
+
+    /**
+     * Creates an alter table dll statement for adding, modifiying or droping a column.
+     * @param col the column which to add, modify or drop
+     * @param type the type of operation to perform
+     * @param buf buffer to which to append the sql statement to
+     * @return true if the statement was successfully appended to the buffer
+     */
+    private boolean alterTable(DBTableColumn col, DBCmdType type, DBSQLScript script)
+    {
+        StringBuilder sql = new StringBuilder();
+        sql.append("ALTER TABLE ");
+        sql.append(col.getRowSet().getName());
+        switch(type)
+        {
+            case CREATE:
+                sql.append(" ADD ");
+                appendColumnDesc(col, sql);
+                break;
+            case ALTER:
+                sql.append(" ALTER COLUMN ");
+                appendColumnDesc(col, sql);
+                break;
+            case DROP:
+                sql.append(" DROP COLUMN ");
+                sql.append(col.getName());
+                break;
+        }
+        // done
+        return script.addStmt(sql);
+    }
+
+    /**
+     * Returns true if the view has been created successfully.
+     * 
+     * @return true if the view has been created successfully
+     */
+    private boolean createView(DBView v, DBSQLScript script)
+    {
+        // Create the Command
+        DBCommandExpr cmd = v.createCommand();
+        if (cmd==null)
+        {   // Check whether Error information is available
+            log.error("No command has been supplied for view " + v.getName());
+            if (v.hasError())
+                return error(v);
+            // No error information available: Use Errors.NotImplemented
+            return error(Errors.NotImplemented, v.getName() + ".createCommand");
+        }
+        // Make sure there is no OrderBy
+        cmd.clearOrderBy();
+
+        // Build String
+        StringBuilder sql = new StringBuilder();
+        sql.append( "CREATE VIEW ");
+        sql.append( v.getName() );
+        sql.append( " (" );
+        boolean addSeparator = false;
+        for(DBColumn c : v.getColumns())
+        {
+            if (addSeparator)
+                sql.append(", ");
+            sql.append(c.getName());
+            // next
+            addSeparator = true;
+        }
+        sql.append(")\r\nAS\r\n");
+        cmd.addSQL( sql, DBExpr.CTX_DEFAULT);
+        // done
+        return script.addStmt(sql.toString());
+    }
+        
+    /**
+     * Returns true if the object has been dropped successfully.
+     * 
+     * @return true if the object has been dropped successfully
+     */
+    private boolean dropObject(String name, String objType, DBSQLScript script)
+    {
+        if (name == null || name.length() == 0)
+            return error(Errors.InvalidArg, name, "name");
+        // Create Drop Statement
+        StringBuilder sql = new StringBuilder();
+        sql.append("DROP ");
+        sql.append(objType);
+        sql.append(" ");
+        sql.append(name);
+        return script.addStmt(sql);
+    }
+
+}

Added: incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/package.html
URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/package.html?rev=683173&view=auto
==============================================================================
--- incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/package.html (added)
+++ incubator/empire-db/trunk/core/Empire-db/src/org/apache/empire/db/sqlserver/package.html Wed Aug  6 01:47:37 2008
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+/*
+ * ESTEAM Software GmbH, 12.12.2007
+ */
+-->
+</head>
+<body>
+
+This package contains classes necessary to support the Microsoft SQL-Server database system.
+
+</body></html>
\ No newline at end of file