Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2013-03-08 08:35:06 +0000
committerEike Stepper2013-03-08 08:38:52 +0000
commitf2879b592ade925aa9b793a36e3884efc63e52ba (patch)
tree10a53f26fdf77b43327354c326c5cb115053bb8d /plugins/org.eclipse.net4j.db
parentc811a8460f00883d9f81b8429e1b3f908f73493a (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBDatabase.java5
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/IDBSchemaTransaction.java13
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBDatabase.java42
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java36
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;
}
}

Back to the top