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 <workspace>/db.ini. If the file
does not exist, it will write it with the following data:
[driver]
id = <database-id-value>
refs #6747
Change-Id: Ie304b480095657e25e694a81cdd5085a4d2c17e9
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.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.ini4j;bundle-version="0.5.4"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Export-Package: org.simantics,
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Export-Package: org.simantics,
import java.io.File;
import java.io.IOException;
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;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.osgi.service.resolver.BundleDescription;
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;
import org.simantics.databoard.Bindings;
import org.simantics.databoard.Databoard;
import org.simantics.datatypes.literal.Font;
/** Set to true when the Simantics Platform is in good-and-go condition */
public boolean running;
/** 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;
/** Database Session */
public Session session;
private Management databasebManagement;
private Session setupDatabase(String databaseDriverId, IProgressMonitor progressMonitor, RecoveryPolicy workspacePolicy, PlatformUserAgent userAgent) throws PlatformException {
if (progressMonitor == null)
progressMonitor = new NullProgressMonitor();
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 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) {
} 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
}
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);
progressMonitor.setTaskName("Creating database at " + dbLocation);
- databasebManagement = serverManager.getManagement(dbLocation);
+ databasebManagement = serverManager.getManagement(dbLocation.toFile());
databasebManagement.create();
databasebManagement.create();
+ currentDatabaseDriver = databaseDriverId;
- return serverManager.createDatabase(dbLocation);
+ return serverManager.createDatabase(dbLocation.toFile());
} catch (DatabaseException e) {
throw new PlatformException(msg, e);
} catch (Throwable e) {
} catch (DatabaseException e) {
throw new PlatformException(msg, e);
} catch (Throwable e) {
session = null;
projectResource = null;
session = null;
projectResource = null;
+ currentDatabaseDriver = null;
DependenciesRelation.assertFinishedTracking();
DependenciesRelation.assertFinishedTracking();
public void reconnect(String databaseDriverId) throws Exception {
// Starts database server.
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);
}
SimanticsPlatform.INSTANCE.startUp(databaseDriverId, null, RecoveryPolicy.ThrowError, OntologyRecoveryPolicy.ThrowError, true, null);
}
+ 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;
+ }
version="0.0.0"\r
unpack="false"/>\r
\r
version="0.0.0"\r
unpack="false"/>\r
\r
+ <plugin\r
+ id="org.ini4j"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r