diff options
author | Eike Stepper | 2013-03-08 08:35:06 +0000 |
---|---|---|
committer | Eike Stepper | 2013-03-08 08:38:52 +0000 |
commit | f2879b592ade925aa9b793a36e3884efc63e52ba (patch) | |
tree | 10a53f26fdf77b43327354c326c5cb115053bb8d /plugins/org.eclipse.net4j.db | |
parent | c811a8460f00883d9f81b8429e1b3f908f73493a (diff) | |
download | cdo-f2879b592ade925aa9b793a36e3884efc63e52ba.tar.gz cdo-f2879b592ade925aa9b793a36e3884efc63e52ba.tar.xz cdo-f2879b592ade925aa9b793a36e3884efc63e52ba.zip |
[401763] Make CDO Server more robust against data dictionary changes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=401763
Diffstat (limited to 'plugins/org.eclipse.net4j.db')
4 files changed, 41 insertions, 55 deletions
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBDatabase.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBDatabase.java index ef313c5004..82c00288cf 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBDatabase.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBDatabase.java @@ -11,7 +11,6 @@ package org.eclipse.net4j.db; import org.eclipse.net4j.db.ddl.IDBSchema; -import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor; import org.eclipse.net4j.util.collection.Closeable; import org.eclipse.net4j.util.container.IContainer; @@ -35,10 +34,6 @@ public interface IDBDatabase extends IContainer<IDBTransaction>, Closeable public IDBSchemaTransaction getSchemaTransaction(); - public void ensureSchema(IDBSchema schema, IDBDeltaVisitor.Filter.Policy policy); - - public void ensureSchema(IDBSchema schema); - public IDBTransaction openTransaction(); public IDBTransaction[] getTransactions(); diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBSchemaTransaction.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBSchemaTransaction.java index 5248cba6f5..d782936db3 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBSchemaTransaction.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBSchemaTransaction.java @@ -11,6 +11,10 @@ package org.eclipse.net4j.db; import org.eclipse.net4j.db.ddl.IDBSchema; +import org.eclipse.net4j.db.ddl.delta.IDBDelta.ChangeKind; +import org.eclipse.net4j.db.ddl.delta.IDBDelta.DeltaType; +import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor; +import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor.Filter.Policy; import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta; import org.eclipse.net4j.util.collection.Closeable; @@ -22,11 +26,18 @@ import org.eclipse.net4j.util.collection.Closeable; */ public interface IDBSchemaTransaction extends Closeable { + public static final Policy DEFAULT_ENSURE_SCHEMA_POLICY = // + new IDBDeltaVisitor.Filter.Policy().allow(DeltaType.SCHEMA, ChangeKind.CHANGE).allow(ChangeKind.ADD).freeze(); + public IDBDatabase getDatabase(); public IDBTransaction getTransaction(); - public IDBSchema getSchema(); + public IDBSchema getWorkingCopy(); + + public IDBSchemaDelta ensureSchema(IDBSchema schema, IDBDeltaVisitor.Filter.Policy policy); + + public IDBSchemaDelta ensureSchema(IDBSchema schema); public IDBSchemaDelta getSchemaDelta(); diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBDatabase.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBDatabase.java index c1fac3c719..c52be7c5a3 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBDatabase.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBDatabase.java @@ -14,14 +14,7 @@ import org.eclipse.net4j.db.DBUtil; import org.eclipse.net4j.db.DBUtil.RunnableWithConnection; import org.eclipse.net4j.db.IDBConnectionProvider; import org.eclipse.net4j.db.IDBDatabase; -import org.eclipse.net4j.db.IDBSchemaTransaction; import org.eclipse.net4j.db.IDBTransaction; -import org.eclipse.net4j.db.ddl.IDBSchema; -import org.eclipse.net4j.db.ddl.delta.IDBDelta.ChangeKind; -import org.eclipse.net4j.db.ddl.delta.IDBDelta.DeltaType; -import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor; -import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor.Filter.Policy; -import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta; import org.eclipse.net4j.spi.db.DBAdapter; import org.eclipse.net4j.spi.db.DBSchema; import org.eclipse.net4j.util.WrappedException; @@ -36,9 +29,6 @@ import java.util.LinkedList; */ public final class DBDatabase extends SetContainer<IDBTransaction> implements IDBDatabase { - private static final Policy DEFAULT_ENSURE_SCHEMA_POLICY = // - new IDBDeltaVisitor.Filter.Policy().allow(DeltaType.SCHEMA, ChangeKind.CHANGE).allow(ChangeKind.ADD).freeze(); - private DBAdapter adapter; private IDBConnectionProvider connectionProvider; @@ -124,38 +114,6 @@ public final class DBDatabase extends SetContainer<IDBTransaction> implements ID return schemaTransaction; } - public void ensureSchema(IDBSchema schema, IDBDeltaVisitor.Filter.Policy policy) - { - IDBSchemaTransaction schemaTransaction = null; - - try - { - schemaTransaction = openSchemaTransaction(); - IDBSchema workingCopy = schemaTransaction.getSchema(); - - IDBSchemaDelta delta = schema.compare(workingCopy); - - IDBDeltaVisitor.Copier copier = new IDBDeltaVisitor.Copier(policy); - delta.accept(copier); - IDBSchemaDelta result = copier.getResult(); - - result.applyTo(workingCopy); - schemaTransaction.commit(); - } - finally - { - if (schemaTransaction != null) - { - schemaTransaction.close(); - } - } - } - - public void ensureSchema(IDBSchema schema) - { - ensureSchema(schema, DEFAULT_ENSURE_SCHEMA_POLICY); - } - public DBTransaction openTransaction() { DBTransaction transaction = new DBTransaction(this); diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java index acf371ea4b..c5da299906 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java @@ -14,6 +14,9 @@ import org.eclipse.net4j.db.DBException; import org.eclipse.net4j.db.DBUtil; import org.eclipse.net4j.db.DBUtil.RunnableWithConnection; import org.eclipse.net4j.db.IDBSchemaTransaction; +import org.eclipse.net4j.db.ddl.IDBSchema; +import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor; +import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta; import org.eclipse.net4j.internal.db.ddl.delta.DBSchemaDelta; import org.eclipse.net4j.spi.db.DBAdapter; import org.eclipse.net4j.spi.db.DBSchema; @@ -32,14 +35,14 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable private DBSchema oldSchema; - private DBSchema schema; + private DBSchema workingCopy; public DBSchemaTransaction(DBDatabase database) { this.database = database; oldSchema = database.getSchema(); - schema = new DBSchema(oldSchema); + workingCopy = new DBSchema(oldSchema); } public DBDatabase getDatabase() @@ -57,14 +60,33 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable transaction = getTransaction; } - public DBSchema getSchema() + public DBSchema getWorkingCopy() { - return schema; + return workingCopy; + } + + public IDBSchemaDelta ensureSchema(IDBSchema schema, IDBDeltaVisitor.Filter.Policy policy) + { + IDBSchema workingCopy = getWorkingCopy(); + + IDBDeltaVisitor.Copier copier = new IDBDeltaVisitor.Copier(policy); + IDBSchemaDelta delta = schema.compare(workingCopy); + delta.accept(copier); + + DBSchemaDelta result = (DBSchemaDelta)copier.getResult(); + result.setName(workingCopy.getName()); + result.applyTo(workingCopy); + return result; + } + + public IDBSchemaDelta ensureSchema(IDBSchema schema) + { + return ensureSchema(schema, DEFAULT_ENSURE_SCHEMA_POLICY); } public DBSchemaDelta getSchemaDelta() { - return (DBSchemaDelta)schema.compare(oldSchema); + return (DBSchemaDelta)workingCopy.compare(oldSchema); } public DBSchemaDelta commit() @@ -112,12 +134,12 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable database.closeSchemaTransaction(); transaction = null; oldSchema = null; - schema = null; + workingCopy = null; } } public boolean isClosed() { - return schema == null; + return workingCopy == null; } } |