You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2006/05/15 02:25:31 UTC
svn commit: r406473 - in /db/ddlutils/trunk/src:
java/org/apache/ddlutils/platform/
java/org/apache/ddlutils/platform/oracle/ test/org/apache/ddlutils/
test/org/apache/ddlutils/dynabean/
Author: tomdz
Date: Sun May 14 17:25:30 2006
New Revision: 406473
URL: http://svn.apache.org/viewcvs?rev=406473&view=rev
Log:
Fixed alteration test so that they now use the catalog and schema if specified
Enhanced alteration support for Oracle
Introduced new sql statement tokenizer that splits in row-mode
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
db/ddlutils/trunk/src/test/org/apache/ddlutils/TestDatabaseWriterBase.java
db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java?rev=406473&r1=406472&r2=406473&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/PlatformImplBase.java Sun May 14 17:25:30 2006
@@ -36,7 +36,6 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.StringTokenizer;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.PropertyUtils;
@@ -56,6 +55,7 @@
import org.apache.ddlutils.model.TypeMap;
import org.apache.ddlutils.util.Jdbc3Utils;
import org.apache.ddlutils.util.JdbcSupport;
+import org.apache.ddlutils.util.SqlTokenizer;
/**
* Base class for platform implementations.
@@ -224,15 +224,17 @@
int errors = 0;
int commandCount = 0;
+ // we tokenize the SQL along the delimiters, and we also make sure that only delimiters
+ // at the end of a line or the end of the string are used (row mode)
try
{
statement = connection.createStatement();
-
- StringTokenizer tokenizer = new StringTokenizer(sql, ";");
- while (tokenizer.hasMoreTokens())
+ SqlTokenizer tokenizer = new SqlTokenizer(sql);
+
+ while (tokenizer.hasMoreStatements())
{
- String command = tokenizer.nextToken();
+ String command = tokenizer.getNextStatement();
// ignore whitespace
command = command.trim();
@@ -665,7 +667,8 @@
StringWriter buffer = new StringWriter();
getSqlBuilder().setWriter(buffer);
- getSqlBuilder().alterDatabase(currentModel, desiredModel, doDrops, modifyColumns);
+ //getSqlBuilder().alterDatabase(currentModel, desiredModel, doDrops, modifyColumns);
+ getSqlBuilder().alterDatabase2(currentModel, desiredModel, null);
sql = buffer.toString();
}
catch (IOException ex)
@@ -698,7 +701,8 @@
StringWriter buffer = new StringWriter();
getSqlBuilder().setWriter(buffer);
- getSqlBuilder().alterDatabase(currentModel, desiredModel, params, doDrops, modifyColumns);
+ //getSqlBuilder().alterDatabase(currentModel, desiredModel, params, doDrops, modifyColumns);
+ getSqlBuilder().alterDatabase2(currentModel, desiredModel, params);
sql = buffer.toString();
}
catch (IOException ex)
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java?rev=406473&r1=406472&r2=406473&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Sun May 14 17:25:30 2006
@@ -766,7 +766,7 @@
{
ForeignKey targetFk = targetTable.getForeignKey(fkIdx);
ForeignKey sourceFk = sourceTable.findForeignKey(targetFk, caseSensitive);
- String refName = targetFk.getForeignTable().getName();
+ String refName = targetFk.getForeignTableName();
if (!caseSensitive)
{
@@ -2180,7 +2180,7 @@
{
boolean shouldUseQuotes = !TypeMap.isNumericType(typeCode);
- if (shouldUseQuotes && (defaultValue != null))
+ if (shouldUseQuotes)
{
// characters are only escaped when within a string literal
print(getPlatformInfo().getValueQuoteToken());
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java?rev=406473&r1=406472&r2=406473&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/oracle/Oracle8Builder.java Sun May 14 17:25:30 2006
@@ -24,6 +24,7 @@
import org.apache.ddlutils.Platform;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Index;
import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.model.TypeMap;
import org.apache.ddlutils.platform.SqlBuilder;
@@ -108,6 +109,18 @@
/**
* {@inheritDoc}
*/
+ public void writeExternalIndexDropStmt(Table table, Index index) throws IOException
+ {
+ // Index names in Oracle are unique to a schema and hence Oracle does not
+ // use the ON <tablename> clause
+ print("DROP INDEX ");
+ printIdentifier(getIndexName(index));
+ printEndOfStatement();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public void createTable(Database database, Table table, Map parameters) throws IOException
{
// lets create any sequences
@@ -124,17 +137,24 @@
for (int idx = 0; idx < columns.length; idx++)
{
+ String columnName = getColumnName(columns[idx]);
+ String triggerName = getConstraintName("trg", table, columns[idx].getName(), null);
+
+ // note that the BEGIN ... SELECT ... END; is all in one line and does
+ // not contain a semicolon except for the END-one
+ // this way, the tokenizer will not split the statement before the END
print("CREATE OR REPLACE TRIGGER ");
- printIdentifier(getConstraintName("trg", table, columns[idx].getName(), null));
+ printIdentifier(triggerName);
print(" BEFORE INSERT ON ");
printIdentifier(getTableName(table));
- println(" FOR EACH ROW");
- println("BEGIN");
- print("SELECT ");
+ print(" REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW WHEN (new.");
+ printIdentifier(columnName);
+ println(" IS NULL)");
+ print("BEGIN SELECT ");
printIdentifier(getConstraintName("seq", table, columns[idx].getName(), null));
print(".nextval INTO :new.");
- printIdentifier(getColumnName(columns[idx]));
- print(" FROM dual");
+ printIdentifier(columnName);
+ print(" FROM dual END");
printEndOfStatement();
}
}
@@ -142,24 +162,28 @@
/**
* {@inheritDoc}
*/
- protected void writeColumnDefaultValue(Table table, Column column) throws IOException
+ protected void printDefaultValue(Object defaultValue, int typeCode) throws IOException
{
- String nativeDefault = getNativeDefaultValue(column);
- boolean shouldUseQuotes = !TypeMap.isNumericType(column.getTypeCode()) && !nativeDefault.startsWith("TO_DATE(");
-
- if (shouldUseQuotes)
+ if (defaultValue != null)
{
- print(getPlatformInfo().getValueQuoteToken());
- print(escapeStringValue(nativeDefault));
- print(getPlatformInfo().getValueQuoteToken());
- }
- else
- {
- print(nativeDefault);
+ String defaultValueStr = defaultValue.toString();
+ boolean shouldUseQuotes = !TypeMap.isNumericType(typeCode) && !defaultValueStr.startsWith("TO_DATE(");
+
+ if (shouldUseQuotes)
+ {
+ // characters are only escaped when within a string literal
+ print(getPlatformInfo().getValueQuoteToken());
+ print(escapeStringValue(defaultValueStr));
+ print(getPlatformInfo().getValueQuoteToken());
+ }
+ else
+ {
+ print(defaultValueStr);
+ }
}
- }
+ }
- /**
+ /**
* {@inheritDoc}
*/
protected String getNativeDefaultValue(Column column)
@@ -203,4 +227,14 @@
{
// we're using sequences instead
}
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void createTemporaryTable(Database database, Table table, Map parameters) throws IOException
+ {
+ // we don't want the auto-increment triggers/sequences for the temporary table
+ super.createTable(database, table, parameters);
+ }
+
}
Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/TestDatabaseWriterBase.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/TestDatabaseWriterBase.java?rev=406473&r1=406472&r2=406473&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/TestDatabaseWriterBase.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/TestDatabaseWriterBase.java Sun May 14 17:25:30 2006
@@ -266,13 +266,17 @@
*/
protected void alterDatabase(Database model) throws DynaSqlException
{
+ Properties props = getTestProperties();
+ String catalog = props.getProperty(DDLUTILS_PROPERTY_PREFIX + "catalog");
+ String schema = props.getProperty(DDLUTILS_PROPERTY_PREFIX + "schema");
+
try
{
_model = model;
_model.resetDynaClassCache();
getPlatform().setSqlCommentsOn(false);
- getPlatform().alterTables(_model, true, true, false);
+ getPlatform().alterTables(catalog, schema, null, _model, true, true, false);
}
catch (Exception ex)
{
Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java?rev=406473&r1=406472&r2=406473&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java Sun May 14 17:25:30 2006
@@ -20,6 +20,7 @@
import org.apache.commons.beanutils.DynaBean;
import org.apache.ddlutils.TestDatabaseWriterBase;
+import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.platform.ModelBasedResultSetIterator;
/**
@@ -61,14 +62,15 @@
" <TestTable Id='3' Text='Text 3'/>"+
"</data>");
- ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(), "SELECT * FROM TestTable");
- DynaBean bean = null;
+ ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(),
+ "SELECT * FROM TestTable",
+ new Table[] { getModel().getTable(0) });
assertTrue(it.hasNext());
// we call the method a second time to assert that the result set does not get advanced twice
assertTrue(it.hasNext());
- bean = (DynaBean)it.next();
+ DynaBean bean = (DynaBean)it.next();
assertEquals(new Integer(1),
getPropertyValue(bean, "Id"));
@@ -119,7 +121,9 @@
" <TestTable Id='3' Text='Text 3'/>"+
"</data>");
- List beans = getPlatform().fetch(getModel(), "SELECT * FROM TestTable");
+ List beans = getPlatform().fetch(getModel(),
+ "SELECT * FROM TestTable",
+ new Table[] { getModel().getTable(0) });
assertEquals(3,
beans.size());
@@ -174,12 +178,13 @@
" <TestTable2 Id='3' Avalue='Text 3'/>"+
"</data>");
- ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(), "SELECT Id1, Avalue FROM TestTable1, TestTable2 WHERE Id2 = Id");
- DynaBean bean = null;
+ ModelBasedResultSetIterator it = (ModelBasedResultSetIterator)getPlatform().query(getModel(),
+ "SELECT Id1, Avalue FROM TestTable1, TestTable2 WHERE Id2 = Id",
+ new Table[] { getModel().getTable(0), getModel().getTable(1) });
assertTrue(it.hasNext());
- bean = (DynaBean)it.next();
+ DynaBean bean = (DynaBean)it.next();
assertEquals(new Integer(2),
getPropertyValue(bean, "Id1"));