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]>