Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java')
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java170
1 files changed, 145 insertions, 25 deletions
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
index 93defc4a6b..279694f3e0 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
@@ -10,9 +10,17 @@
*/
package org.eclipse.net4j.internal.db.ddl.delta;
+import org.eclipse.net4j.db.DBType;
+import org.eclipse.net4j.db.ddl.IDBField;
+import org.eclipse.net4j.db.ddl.IDBIndex;
+import org.eclipse.net4j.db.ddl.IDBIndexField;
import org.eclipse.net4j.db.ddl.IDBSchema;
import org.eclipse.net4j.db.ddl.IDBTable;
+import org.eclipse.net4j.db.ddl.delta.IDBDelta;
import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor;
+import org.eclipse.net4j.db.ddl.delta.IDBFieldDelta;
+import org.eclipse.net4j.db.ddl.delta.IDBIndexDelta;
+import org.eclipse.net4j.db.ddl.delta.IDBIndexFieldDelta;
import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta;
import org.eclipse.net4j.db.ddl.delta.IDBTableDelta;
import org.eclipse.net4j.internal.db.ddl.DBTable;
@@ -22,6 +30,7 @@ import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -49,7 +58,10 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta
public void compare(IDBTable table, IDBTable oldTable)
{
DBTableDelta tableDelta = new DBTableDelta(DBSchemaDelta.this, (DBTable)table, (DBTable)oldTable);
- addTableDelta(tableDelta);
+ if (!tableDelta.isEmpty())
+ {
+ addTableDelta(tableDelta);
+ }
}
});
}
@@ -61,50 +73,37 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta
{
}
- public Map<String, IDBTableDelta> getTableDeltas()
- {
- return Collections.unmodifiableMap(tableDeltas);
- }
-
- public boolean isEmpty()
+ public DeltaType getDeltaType()
{
- return tableDeltas.isEmpty();
+ return DeltaType.SCHEMA;
}
- public DBTableDelta[] getElements()
+ public Map<String, IDBTableDelta> getTableDeltas()
{
- DBTableDelta[] elements = tableDeltas.values().toArray(new DBTableDelta[tableDeltas.size()]);
- Arrays.sort(elements);
- return elements;
+ return Collections.unmodifiableMap(tableDeltas);
}
- public int compareTo(IDBSchemaDelta o)
+ public IDBTableDelta[] getTableDeltasSortedByName()
{
- return getName().compareTo(o.getName());
+ IDBTableDelta[] result = tableDeltas.values().toArray(new IDBTableDelta[tableDeltas.size()]);
+ Arrays.sort(result);
+ return result;
}
public void addTableDelta(IDBTableDelta tableDelta)
{
tableDeltas.put(tableDelta.getName(), tableDelta);
+ resetElements();
}
- public void accept(IDBDeltaVisitor visitor)
- {
- visitor.visit(this);
- for (DBTableDelta tableDelta : getElements())
- {
- tableDelta.accept(visitor);
- }
- }
-
- public DBSchema getElement(IDBSchema schema)
+ public DBSchema getSchemaElement(IDBSchema schema)
{
return (DBSchema)schema;
}
public void applyTo(IDBSchema schema)
{
- IDBDeltaVisitor visitor = new IDBDeltaVisitor.Applier(schema);
+ IDBDeltaVisitor visitor = new DBSchemaDelta.Applier(schema);
accept(visitor);
}
@@ -114,4 +113,125 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta
return MessageFormat.format("DBSchemaDelta[name={0}, kind={1}, tableDeltas={2}]", getName(), getChangeKind(),
tableDeltas.values());
}
+
+ @Override
+ protected void doAccept(IDBDeltaVisitor visitor)
+ {
+ visitor.visit(this);
+ }
+
+ @Override
+ protected void collectElements(List<IDBDelta> elements)
+ {
+ elements.addAll(tableDeltas.values());
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class Applier extends IDBDeltaVisitor.Default
+ {
+ private final IDBSchema schema;
+
+ public Applier(IDBSchema schema)
+ {
+ this.schema = schema;
+ }
+
+ public final IDBSchema getSchema()
+ {
+ return schema;
+ }
+
+ @Override
+ public void added(IDBTableDelta delta)
+ {
+ String name = delta.getName();
+ schema.addTable(name);
+ }
+
+ @Override
+ public void removed(IDBTableDelta delta)
+ {
+ IDBTable table = delta.getSchemaElement(schema);
+ table.remove();
+ }
+
+ @Override
+ public void changed(IDBTableDelta delta)
+ {
+ }
+
+ @Override
+ public void added(IDBFieldDelta delta)
+ {
+ String name = delta.getName();
+ DBType type = delta.getPropertyValue(IDBFieldDelta.TYPE_PROPERTY);
+ int precision = delta.getPropertyValue(IDBFieldDelta.PRECISION_PROPERTY);
+ int scale = delta.getPropertyValue(IDBFieldDelta.SCALE_PROPERTY);
+ boolean notNull = delta.getPropertyValue(IDBFieldDelta.NOT_NULL_PROPERTY);
+
+ IDBTable table = delta.getParent().getSchemaElement(schema);
+ table.addField(name, type, precision, scale, notNull);
+ }
+
+ @Override
+ public void removed(IDBFieldDelta delta)
+ {
+ IDBField field = delta.getSchemaElement(schema);
+ field.remove();
+ }
+
+ @Override
+ public void changed(IDBFieldDelta delta)
+ {
+ }
+
+ @Override
+ public void added(IDBIndexDelta delta)
+ {
+ String name = delta.getName();
+ IDBIndex.Type type = delta.getPropertyValue(IDBIndexDelta.TYPE_PROPERTY);
+
+ IDBTable table = delta.getParent().getSchemaElement(schema);
+ table.addIndex(name, type);
+ }
+
+ @Override
+ public void removed(IDBIndexDelta delta)
+ {
+ IDBIndex index = delta.getSchemaElement(schema);
+ index.remove();
+ }
+
+ @Override
+ public void changed(IDBIndexDelta delta)
+ {
+ }
+
+ @Override
+ public void added(IDBIndexFieldDelta delta)
+ {
+ IDBIndexDelta parent = delta.getParent();
+ IDBTable table = parent.getParent().getSchemaElement(schema);
+
+ String name = delta.getName();
+ IDBField field = table.getField(name);
+
+ IDBIndex index = parent.getSchemaElement(schema);
+ index.addIndexField(field);
+ }
+
+ @Override
+ public void removed(IDBIndexFieldDelta delta)
+ {
+ IDBIndexField indexField = delta.getSchemaElement(schema);
+ indexField.remove();
+ }
+
+ @Override
+ public void changed(IDBIndexFieldDelta delta)
+ {
+ }
+ }
}

Back to the top