[401763] Make CDO Server more robust against data dictionary changes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=401763
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java
index f2e85ab..3bd14d1 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java
@@ -620,8 +620,16 @@
database = DBUtil.openDatabase(dbAdapter, dbConnectionProvider, repository.getName());
IDBSchemaTransaction schemaTransaction = database.openSchemaTransaction();
- schemaTransaction.ensureSchema(CDODBSchema.INSTANCE);
- schemaTransaction.commit();
+
+ try
+ {
+ schemaTransaction.ensureSchema(CDODBSchema.INSTANCE);
+ schemaTransaction.commit();
+ }
+ finally
+ {
+ schemaTransaction.close();
+ }
LifecycleUtil.activate(idHandler);
LifecycleUtil.activate(metaDataManager);
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/DBUtil.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/DBUtil.java
index ea485c7..8f11061 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/DBUtil.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/DBUtil.java
@@ -40,8 +40,10 @@
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* A utility class with various static factory and convenience methods.
@@ -387,7 +389,7 @@
@Deprecated
public static List<String> getAllSchemaTableNames(DatabaseMetaData metaData)
{
- return getAllSchemaNames(metaData);
+ return new ArrayList<String>(getAllSchemaNames(metaData));
}
/**
@@ -398,7 +400,7 @@
try
{
DatabaseMetaData metaData = connection.getMetaData();
- return getAllSchemaNames(metaData);
+ return new ArrayList<String>(getAllSchemaNames(metaData));
}
catch (SQLException ex)
{
@@ -409,13 +411,13 @@
/**
* @since 4.2
*/
- public static List<String> getAllSchemaNames(DatabaseMetaData metaData)
+ public static Set<String> getAllSchemaNames(DatabaseMetaData metaData)
{
ResultSet schemas = null;
try
{
- List<String> names = new ArrayList<String>();
+ Set<String> names = new HashSet<String>();
schemas = metaData.getSchemas();
while (schemas.next())
{
@@ -446,7 +448,7 @@
if (dbName != null)
{
dbName = dbName.toUpperCase();
- List<String> schemaNames = getAllSchemaNames(metaData);
+ Set<String> schemaNames = getAllSchemaNames(metaData);
if (!schemaNames.contains(dbName))
{
dbName = null;
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
index d111d42..ca043bc 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
@@ -152,6 +152,12 @@
String schemaName = schema.getName();
DatabaseMetaData metaData = connection.getMetaData();
+ Set<String> schemaNames = DBUtil.getAllSchemaNames(metaData);
+ if (!schemaNames.contains(schemaName))
+ {
+ schemaName = null;
+ }
+
ResultSet tables = metaData.getTables(null, schemaName, null, new String[] { "TABLE" });
while (tables.next())
{