From: Tuukka Lehtonen Date: Fri, 7 Oct 2016 14:19:48 +0000 (+0300) Subject: Platform startup now reads the used database driver from /db.ini X-Git-Tag: v1.25.0~73 X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=commitdiff_plain;h=27d90ffb0fb9b2ed86be12c5444ad2a71a8c81d9 Platform startup now reads the used database driver from /db.ini Previously it was possible to use the wrong database driver for a workspace if the default driver was changed in the code. Now, SimanticsPlatform.setupDatabase will read the database driver used for the opened workspace from an ini file /db.ini. If the file does not exist, it will write it with the following data: [driver] id = refs #6747 Change-Id: Ie304b480095657e25e694a81cdd5085a4d2c17e9 --- diff --git a/bundles/org.simantics/META-INF/MANIFEST.MF b/bundles/org.simantics/META-INF/MANIFEST.MF index 90161d598..48ce23f0e 100644 --- a/bundles/org.simantics/META-INF/MANIFEST.MF +++ b/bundles/org.simantics/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, org.simantics.scl.compiler;bundle-version="0.4.0", org.simantics.platform.ui.ontology;bundle-version="1.0.0", org.simantics.db.procore;bundle-version="1.1.0", - org.slf4j.api + org.slf4j.api, + org.ini4j;bundle-version="0.5.4" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.simantics, diff --git a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java index 11013eaf7..cf4928fe7 100644 --- a/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java +++ b/bundles/org.simantics/src/org/simantics/SimanticsPlatform.java @@ -19,6 +19,8 @@ import static org.simantics.db.common.utils.Transaction.writeGraph; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -39,6 +41,8 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.osgi.service.resolver.BundleDescription; +import org.ini4j.Ini; +import org.ini4j.InvalidFileFormatException; import org.simantics.databoard.Bindings; import org.simantics.databoard.Databoard; import org.simantics.datatypes.literal.Font; @@ -155,6 +159,9 @@ public class SimanticsPlatform implements LifecycleListener { /** Set to true when the Simantics Platform is in good-and-go condition */ public boolean running; + /** ID of the database driver that the platform is currently using */ + private String currentDatabaseDriver; + /** Database Session */ public Session session; private Management databasebManagement; @@ -204,24 +211,31 @@ public class SimanticsPlatform implements LifecycleListener { private Session setupDatabase(String databaseDriverId, IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, PlatformUserAgent userAgent) throws PlatformException { if (progressMonitor == null) progressMonitor = new NullProgressMonitor(); - File dbLocation = Platform.getLocation().append("db").toFile(); + Path workspaceLocation = Platform.getLocation().toFile().toPath(); + Path dbLocation = workspaceLocation.resolve("db"); + Path dbIniPath = workspaceLocation.resolve("db.ini"); + // The driver file overrides any command line arguments to prevent + // using the wrong driver for an existing database directory. ServerManager serverManager; try { - serverManager = ServerManagerFactory.create(databaseDriverId, dbLocation.getAbsolutePath()); + Ini dbIni = loadOrCreateDatabaseIni(dbIniPath, databaseDriverId); + databaseDriverId = dbIni.get("driver", "id"); + serverManager = ServerManagerFactory.create(databaseDriverId, dbLocation.toAbsolutePath().toString()); } catch (DatabaseException | IOException e) { - throw new PlatformException("Failed to initialize Server Manager", e); + throw new PlatformException("Failed to initialize database ServerManager with driver " + databaseDriverId, e); } progressMonitor.beginTask("Setting up Simantics Database", 100); progressMonitor.setTaskName("Asserting Database is installed."); String msg = "Failed to initialize Simantics database."; try { // Create database - log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Creating database at " + dbLocation)); + log.log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Initializing database at " + dbLocation + " with driver " + databaseDriverId)); progressMonitor.setTaskName("Creating database at " + dbLocation); - databasebManagement = serverManager.getManagement(dbLocation); + databasebManagement = serverManager.getManagement(dbLocation.toFile()); databasebManagement.create(); + currentDatabaseDriver = databaseDriverId; // Create layer0. - return serverManager.createDatabase(dbLocation); + return serverManager.createDatabase(dbLocation.toFile()); } catch (DatabaseException e) { throw new PlatformException(msg, e); } catch (Throwable e) { @@ -970,6 +984,7 @@ public class SimanticsPlatform implements LifecycleListener { session = null; projectResource = null; + currentDatabaseDriver = null; DependenciesRelation.assertFinishedTracking(); @@ -1032,6 +1047,8 @@ public class SimanticsPlatform implements LifecycleListener { public void reconnect(String databaseDriverId) throws Exception { // Starts database server. + if (currentDatabaseDriver != null) + databaseDriverId = currentDatabaseDriver; SimanticsPlatform.INSTANCE.startUp(databaseDriverId, null, RecoveryPolicy.ThrowError, OntologyRecoveryPolicy.ThrowError, true, null); } @@ -1043,5 +1060,17 @@ public class SimanticsPlatform implements LifecycleListener { } } -} + private Ini loadOrCreateDatabaseIni(Path path, String databaseDriverId) + throws InvalidFileFormatException, IOException + { + File f = path.toFile(); + Ini dbIni = Files.isRegularFile(path) ? new Ini(f) : new Ini(); + String iniId = dbIni != null ? dbIni.get("driver", "id") : null; + if (iniId == null) { + dbIni.put("driver", "id", databaseDriverId); + dbIni.store(f); + } + return dbIni; + } +} diff --git a/features/org.simantics.platform.feature/feature.xml b/features/org.simantics.platform.feature/feature.xml index 4dfdc00ff..1b348f3b2 100644 --- a/features/org.simantics.platform.feature/feature.xml +++ b/features/org.simantics.platform.feature/feature.xml @@ -111,4 +111,11 @@ version="0.0.0" unpack="false"/> + +