hmm...forgive me for posting again, but the patches don't seem to get included in the mail...
Index: ./src/java/org/apache/torque/engine/database/transform/SQLToAppData.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-turbine-torque/src/java/org/apache/torque/engine/database/transform/SQLToAppData.java,v
retrieving revision 1.7
diff -u -r1.7 SQLToAppData.java
--- ./src/java/org/apache/torque/engine/database/transform/SQLToAppData.java    8 Oct 
2002 18:17:06 -0000       1.7
+++ ./src/java/org/apache/torque/engine/database/transform/SQLToAppData.java    29 Nov 
+2002 16:47:41 -0000
@@ -64,6 +64,8 @@
 import org.apache.torque.engine.database.model.Database;
 import org.apache.torque.engine.database.model.ForeignKey;
 import org.apache.torque.engine.database.model.Table;
+import org.apache.torque.engine.database.model.Unique;
+import org.apache.torque.engine.database.model.Index;
 import org.apache.torque.engine.sql.ParseException;
 import org.apache.torque.engine.sql.SQLScanner;
 import org.apache.torque.engine.sql.Token;
@@ -74,9 +76,12 @@
  * structure.  The class makes use of SQL Scanner to get
  * sql tokens and the parses these to create the AppData
  * class. SQLToAppData is in effect a simplified sql parser.
- *
+ * It supports CREATE INDEXE, ALTER TABLE, the UNIQUE keyword
+ * and CONSTRAINTS in CREATE TABLE
+ * TODO: does not recognize long varchar as type (maybe assign it to VARCHAR without 
+length)
  * @author <a href="mailto:[EMAIL PROTECTED]";>Leon Messerschmidt</a>
  * @author <a href="mailto:[EMAIL PROTECTED]";>Jon S. Stevens</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Andreou</a>
  * @version $Id: SQLToAppData.java,v 1.7 2002/10/08 18:17:06 mpoeschl Exp $
  */
 public class SQLToAppData
@@ -176,7 +181,7 @@
     }
 
     /**
-     * Parses a CREATE TABLE FOO command.
+     * Parses a CREATE TABLE/INDEX FOO command.
      *
      * @throws ParseException
      */
@@ -187,6 +192,10 @@
         {
             Create_Table();
         }
+        if (token.getStr().toUpperCase().equals("INDEX"))
+        {
+            Create_Index();
+        }
     }
 
     /**
@@ -247,6 +256,11 @@
         {
             Create_Table_Column_Unique(tbl);
         }
+        else if(token.getStr().toUpperCase().equals("CONSTRAINT"))
+        {
+            next();
+            Add_Constraint(tbl);
+        }
         else
         {
             Create_Table_Column_Data(tbl);
@@ -299,7 +313,7 @@
     }
 
     /**
-     * Parses UNIQUE (NAME,FOO,BAR) statement
+     * Parses UNIQUE (NAME) statement
      */
     private void Create_Table_Column_Unique(Table tbl) throws ParseException
     {
@@ -319,7 +333,7 @@
                 {
                     err("Invalid column name: " + colName);
                 }
-                c.setUnique(true);
+                Add_Unique(tbl,c,null);
             }
             next();
         }
@@ -515,7 +529,7 @@
                 }
                 else if (token.getStr().toUpperCase().equals("UNIQUE"))
                 {
-                    col.setUnique(true);
+                    Add_Unique(tbl,col,null);
                     next();
                 }
                 else if (token.getStr().toUpperCase().equals("NULL"))
@@ -528,6 +542,11 @@
                     col.setAutoIncrement(true);
                     next();
                 }
+                else if(token.getStr().toUpperCase().equals("CHECK"))
+                {
+                        Add_Check(col);
+                }
+
                 else if (token.getStr().toUpperCase().equals("DEFAULT"))
                 {
                     next();
@@ -548,6 +567,335 @@
     }
 
     /**
+     * Parses an ALTER FOO command.
+     *
+     * @throws ParseException
+     */
+    private void Alter() throws ParseException
+    {
+        next();
+        if (token.getStr().toUpperCase().equals("TABLE"))
+        {
+            Alter_Table();
+        }
+    }
+
+    /**
+     * Parses an ALTER TABLE FOO command
+     */
+    private void Alter_Table() throws ParseException
+    {
+        next();
+        String tableName = token.getStr(); // name of the table
+        next();
+        if (!token.getStr().equals("ADD"))
+        {
+            err("ADD expected");
+        }
+        next();
+
+        Table tbl=appDataDB.getTable(tableName);
+        if (tbl==null)
+        {
+            err("Invalid table name: " + tableName);
+        }
+
+        //tbl.setIdMethod("none");
+        if (token.getStr().toUpperCase().equals("CONSTRAINT"))
+        {
+                next();
+                Add_Constraint(tbl);
+        }
+        else if (token.getStr().equals("("))
+        {
+                next();
+                if (token.getStr().toUpperCase().equals("CONSTRAINT"))
+                {
+                    next();
+                }
+                Add_Constraint(tbl);
+                next(); // skip the )
+        }
+    }
+
+    /**
+     * Parses a CONSTRAINT command
+     */
+    private void Add_Constraint(Table tbl) throws ParseException
+    {
+        String allConstraints="UNIQUE*PRIMARY*FOREIGN";
+        String str=token.getStr();
+        String constraintName=null;
+
+        if (allConstraints.indexOf(str.toUpperCase())<0)
+        {
+            constraintName=str;
+            next();
+            str=token.getStr();
+        }
+
+        if (str.toUpperCase().equals("UNIQUE"))
+        {
+            Add_Constraint_Unique(tbl,constraintName);
+        }
+
+        if (str.toUpperCase().equals("PRIMARY"))
+        {
+            Add_Constraint_Primary(tbl,constraintName);
+        }
+
+        if (str.toUpperCase().equals("FOREIGN"))
+        {
+            Add_Constraint_Foreign(tbl,constraintName);
+        }
+    }
+
+    /**
+     * Parses a CONSTRAINT FOREIGN KEY command
+     */
+    private void Add_Constraint_Foreign(Table tbl,String constrName) throws 
+ParseException
+    {
+        if (constrName==null)
+            constrName="FK_UNDEF_"+token.getLine()+"_"+token.getCol();
+
+        next();
+        if (!token.getStr().toUpperCase().equals("KEY"))
+        {
+            err("KEY expected");
+        }
+        next();
+        if (!token.getStr().equals("("))
+        {
+            err("( expected");
+        }
+        next();
+
+        String colName = token.getStr();
+        Column c=tbl.getColumn(colName);
+        if (c == null)
+        {
+            err("Invalid column name: " + colName);
+        }
+
+        next();
+        if (!token.getStr().equals(")"))
+        {
+            err(") expected");
+        }
+        next();
+        if (!token.getStr().toUpperCase().equals("REFERENCES"))
+        {
+            err("REFERENCES expected");
+        }
+        next();
+
+        String referenceTable=token.getStr();
+        Table refTbl=appDataDB.getTable(referenceTable);
+        if (refTbl==null)
+        {
+            err("Invalid table name: "+referenceTable);
+        }
+        next();
+        String refColumn=colName;
+        if (token.getStr().equals("("))
+        {
+            next();
+            refColumn=token.getStr();
+            next();
+            if (!token.getStr().equals(")"))
+            {
+                err(") expected");
+            }
+        }
+
+        Column refC=refTbl.getColumn(refColumn);
+        if (refC==null)
+        {
+            err("Invalid column name: " + refColumn);
+        }
+
+        ForeignKey fk=new ForeignKey();
+
+        if (!token.getStr().equals(")"))
+        {
+            if (!token.getStr().toUpperCase().equals("ON"))
+            {
+                err("ON expected");
+            }
+            next();
+            if (token.getStr().toUpperCase().equals("DELETE"))
+            {
+                next();
+                String onDelete=token.getStr();
+                fk.setOnDelete(onDelete);
+                next();
+            }
+            else if (token.getStr().toUpperCase().equals("UPDATE"))
+            {
+                next();
+                String onUpdate=token.getStr();
+                fk.setOnUpdate(onUpdate);
+                next();
+            }
+        }
+        //next(); // skip the )
+
+        fk.setName(constrName);
+        fk.setForeignTableName(referenceTable);
+        fk.addReference(colName,refColumn);
+        tbl.addForeignKey(fk);
+    }
+
+    /**
+     * Parses a CONSTRAINT PRIMARY KEY command
+     */
+    private void Add_Constraint_Primary(Table tbl,String constrName) throws 
+ParseException
+    {
+        if (constrName==null)
+            constrName="PK_UNDEF_"+token.getLine()+"_"+token.getCol();
+
+        next();
+        if (!token.getStr().toUpperCase().equals("KEY"))
+        {
+            err("KEY expected");
+        }
+        next();
+        if (!token.getStr().equals("("))
+        {
+            err("( expected");
+        }
+        next();
+        String colName;
+        while (!(colName = token.getStr()).equals(")"))
+        {
+            Column c=tbl.getColumn(colName);
+            if (c == null)
+            {
+                err("Invalid column name: " + colName);
+            }
+            c.setPrimaryKey(true);
+            next();
+            if (token.getStr().equals(","))
+                next();
+        }
+        if (!token.getStr().equals(")"))
+        {
+            err(") expected");
+        }
+        next(); // skip the )
+    }
+
+    /**
+     * Parses a CONSTRAINT UNIQUE command
+     */
+    private void Add_Constraint_Unique(Table tbl,String constrName) throws 
+ParseException
+    {
+        /*if (constrName==null)
+            constrName="UNIQUE_UNDEF_"+token.getLine()+"_"+token.getCol();*/
+
+        next();
+        if (!token.getStr().equals("("))
+        {
+            err("( expected");
+        }
+        next();
+        String colName=token.getStr();
+        Column c=tbl.getColumn(colName);
+        if (c == null)
+        {
+            err("Invalid column name: " + colName);
+        }
+        Add_Unique(tbl,c,constrName);
+        next();
+        if (!token.getStr().toUpperCase().equals(")"))
+        {
+            err(") expected");
+        }
+        next(); // skip the )
+    }
+
+    /**
+     * Parses a CHECK command in CREATE TABLE.
+     * For now, just skip to the end of the check command.
+     */
+    private void Add_Check(Column col) throws ParseException
+    {
+        next();
+        int iCount=0;
+        while (!token.getStr().equals(";"))
+        {
+            if (token.getStr().equals("("))
+                iCount++;
+            else if (token.getStr().equals(")"))
+                iCount--;
+            next();
+            if (iCount==0)
+            {
+                //next();
+                return;
+            }
+        }
+    }
+
+    /**
+     * Mark a column as unique
+     */
+    private void Add_Unique(Table tbl,Column col,String constrName)
+    {
+        col.setUnique(true);
+        Unique unique=new Unique();
+        unique.setName(constrName);
+        unique.addColumn(col);
+        tbl.addUnique(unique);
+    }
+
+    /**
+     * Parses a CREATE INDEX command
+     */
+    private void Create_Index() throws ParseException
+    {
+        next();
+        String indexName = token.getStr(); // name of the index
+        next();
+        if (!token.getStr().toUpperCase().equals("ON"))
+        {
+            err("on expected");
+        }
+        next();
+        String tableName = token.getStr(); // name of the table
+        next();
+        if (!token.getStr().equals("("))
+        {
+            err("( expected");
+        }
+        next();
+        String columnName = token.getStr(); // name of the column
+        next();
+        String indexType="";
+        if (!token.getStr().equals(")"))
+        {
+            indexType=token.getStr();
+            next();
+        }
+        next(); // skip )
+
+        Table tbl=appDataDB.getTable(tableName);
+        if (tbl==null)
+        {
+            err("Invalid table name: "+tableName);
+        }
+        Column col=tbl.getColumn(columnName);
+        if (col==null)
+        {
+            err("Invalid column name: "+columnName);
+        }
+        Index index=new Index();
+        index.setName(indexName);
+        index.addColumn(col);
+        tbl.addIndex(index);
+    }
+
+    /**
      * Execute the parser.
      */
     public AppData execute() throws IOException, ParseException
@@ -575,6 +923,10 @@
             if (token.getStr().toUpperCase().equals("CREATE"))
             {
                 Create();
+            }
+            if (token.getStr().toUpperCase().equals("ALTER"))
+            {
+                Alter();
             }
             if (hasTokens())
             {
Index: ./src/java/org/apache/torque/engine/database/model/Index.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-turbine-torque/src/java/org/apache/torque/engine/database/model/Index.java,v
retrieving revision 1.20
diff -u -r1.20 Index.java
--- ./src/java/org/apache/torque/engine/database/model/Index.java       29 Nov 2002 
13:50:29 -0000      1.20
+++ ./src/java/org/apache/torque/engine/database/model/Index.java       29 Nov 2002 
+16:46:44 -0000
@@ -67,6 +67,7 @@
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Jason van Zyl</a>
  * @author <a href="mailto:[EMAIL PROTECTED]>Daniel Rall</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Andreou</a>
  * @version $Id: Index.java,v 1.20 2002/11/29 13:50:29 mpoeschl Exp $
  */
 public class Index
@@ -242,6 +243,14 @@
     public void addColumn(Attributes attrib)
     {
         indexColumns.add(attrib.getValue("name"));
+    }
+
+    /**
+     * Adds a new column to an index.
+     */
+    public void addColumn(Column col)
+    {
+        indexColumns.add(col.getName());
     }
 
     /**
Index: ./src/java/org/apache/torque/engine/sql/SQLScanner.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-turbine-torque/src/java/org/apache/torque/engine/sql/SQLScanner.java,v
retrieving revision 1.3
diff -u -r1.3 SQLScanner.java
--- ./src/java/org/apache/torque/engine/sql/SQLScanner.java     7 May 2002 18:24:43 
-0000       1.3
+++ ./src/java/org/apache/torque/engine/sql/SQLScanner.java     29 Nov 2002 16:48:22 
+-0000
@@ -65,6 +65,7 @@
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Leon Messerschmidt</a>
  * @author <a href="mailto:[EMAIL PROTECTED]";>Jon S. Stevens</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Andreou</a>
  * @version $Id: SQLScanner.java,v 1.3 2002/05/07 18:24:43 mpoeschl Exp $
  */
 public class SQLScanner
@@ -118,11 +119,13 @@
      */
     private void readChar() throws IOException
     {
+        boolean wasLine=(char)chr=='\r';
         chr = in.read();
         if ((char) chr == '\n' || (char) chr == '\r' || (char) chr == '\f')
         {
             col = 0;
-            line++;
+            if (!wasLine || (char) chr != '\n')
+                line++;
         } else col++;
     }
 
@@ -139,7 +142,25 @@
             readChar();
             c = (char) chr;
         }
-        tokens.add(new Token(token,line,col));
+        int start=col-token.length();
+        tokens.add(new Token(token,line,start));
+    }
+
+    /**
+     * Scans an identifier which had started with the negative sign.
+     */
+    private void scanNegativeIdentifier () throws IOException
+    {
+        token = "-";
+        char c = (char) chr;
+        while (chr != -1 && white.indexOf(c) == -1 && special.indexOf(c) == -1)
+        {
+            token = token + (char) chr;
+            readChar();
+            c = (char) chr;
+        }
+        int start=col-token.length();
+        tokens.add(new Token(token,line,start));
     }
 
     /**
@@ -154,11 +175,14 @@
         boolean inCommentSlashStar = false;
         boolean inCommentDash = false;
 
+        boolean inNegative;
+
         tokens = new ArrayList();
         readChar();
         while (chr != -1)
         {
             char c = (char) chr;
+            inNegative=false;
 
             if ((char) c == commentDash)
             {
@@ -167,6 +191,11 @@
                 {
                     inCommentDash = true;
                 }
+                else
+                {
+                    inNegative=true;
+                    c = (char) chr;
+                }
             }
 
             if (inCommentDash)
@@ -208,7 +237,10 @@
             }
             else if (alfanum.indexOf(c) >= 0)
             {
-                scanIdentifier();
+                if (inNegative)
+                    scanNegativeIdentifier();
+                else
+                    scanIdentifier();
             }
             else if (special.indexOf(c) >= 0)
             {
Index: ./src/java/org/apache/torque/engine/database/model/ForeignKey.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-turbine-torque/src/java/org/apache/torque/engine/database/model/ForeignKey.java,v
retrieving revision 1.10
diff -u -r1.10 ForeignKey.java
--- ./src/java/org/apache/torque/engine/database/model/ForeignKey.java  29 Nov 2002 
13:50:29 -0000      1.10
+++ ./src/java/org/apache/torque/engine/database/model/ForeignKey.java  29 Nov 2002 
+16:45:45 -0000
@@ -64,6 +64,7 @@
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Fedor</a>
  * @author <a href="mailto:[EMAIL PROTECTED]";>Daniel Rall</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Andreou</a>
  * @version $Id: ForeignKey.java,v 1.10 2002/11/29 13:50:29 mpoeschl Exp $
  */
 public class ForeignKey
@@ -79,6 +80,8 @@
     // the uppercase equivalent of the onDelete/onUpdate values in the dtd
     private final String NONE    = "NONE";
     private final String SETNULL = "SETNULL";
+    private final String CASCADE = "CASCADE";
+    private final String RESTRICT= "RESTRICT";
 
     /**
      * Default Constructor
@@ -113,7 +116,19 @@
         attrib = attrib.toUpperCase();
         if (attrib.equals(SETNULL))
         {
-            attrib =  "SET NULL";
+            attrib =  "setnull";
+        }
+        else if (attrib.equals(CASCADE))
+        {
+            attrib = "cascade";
+        }
+        else if (attrib.equals(NONE))
+        {
+            attrib = "none";
+        }
+        else if (attrib.equals(RESTRICT))
+        {
+            attrib = "restrict";
         }
         return attrib;
     }
@@ -123,7 +138,7 @@
      */
     public boolean hasOnUpdate()
     {
-       return !onUpdate.equals(NONE);
+       return ! (onUpdate==null) && ! onUpdate.equals("none");
     }
 
     /**
@@ -131,7 +146,7 @@
      */
     public boolean hasOnDelete()
     {
-       return !onDelete.equals(NONE);
+       return ! (onDelete==null) && ! onDelete.equals("none");
     }
 
     /**
@@ -313,7 +328,20 @@
             .append(getForeignTableName())
             .append("\" name=\"")
             .append(getName())
-            .append("\">\n");
+            .append("\"");
+        if (hasOnUpdate())
+        {
+            result.append(" onUpdate=\"")
+                  .append(getOnUpdate())
+                  .append("\"");
+        }
+        if (hasOnDelete())
+        {
+            result.append(" onDelete=\"")
+                  .append(getOnDelete())
+                  .append("\"");
+        }
+        result.append(">\n");
 
         for (int i = 0; i < localColumns.size(); i++)
         {
Index: ./src/java/org/apache/torque/engine/database/model/Table.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-turbine-torque/src/java/org/apache/torque/engine/database/model/Table.java,v
retrieving revision 1.35
diff -u -r1.35 Table.java
--- ./src/java/org/apache/torque/engine/database/model/Table.java       29 Nov 2002 
13:50:29 -0000      1.35
+++ ./src/java/org/apache/torque/engine/database/model/Table.java       29 Nov 2002 
+16:47:10 -0000
@@ -75,6 +75,7 @@
  * @author <a href="mailto:[EMAIL PROTECTED]>John McNally</a>
  * @author <a href="mailto:[EMAIL PROTECTED]>Daniel Rall</a>
  * @author <a href="mailto:byron_foster@[EMAIL PROTECTED]>Byron Foster</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Andreou</a>
  * @version $Id: Table.java,v 1.35 2002/11/29 13:50:29 mpoeschl Exp $
  */
 public class Table implements IDMethod
@@ -1061,6 +1062,23 @@
         if (foreignKeys != null)
         {
             for (Iterator iter = foreignKeys.iterator(); iter.hasNext();)
+            {
+                result.append(iter.next());
+            }
+        }
+
+        if (indices != null)
+        {
+
+            for (Iterator iter = indices.iterator(); iter.hasNext();)
+            {
+                result.append(iter.next());
+            }
+        }
+
+        if (unices != null)
+        {
+            for (Iterator iter = unices.iterator(); iter.hasNext();)
             {
                 result.append(iter.next());
             }

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to