in Benchmarks/SystemSqliteDatabaseManager.cs [669:793]
public static bool Setup(string filename, DBSettings? dbSettingsIn = null)
{
dbSettings = (dbSettingsIn == null) ? new DBSettings() : dbSettingsIn;
if (filename != null)
{
if (SQLiteFilename != filename)
{
SQLiteFilename = filename;
}
}
if (Connections.Count > 0)
{
CloseDatabase();
}
if (Connections == null || Connections.Count == 0)
{
Connections = new List<SystemSQLiteSqlConnectionHolder>();
PopulateConnections();
var settings = GetSettings();
if (settings != null)
{
FirstRun = false;
if (SCHEMA_VERSION != settings.SchemaVersion)
{
Log.Fatal("Database has schema version {settings.SchemaVersion} but database has schema version {SCHEMA_VERSION}.");
Environment.Exit((int)ASA_ERROR.MATCHING_SCHEMA);
}
if (dbSettingsIn != null && settings.ShardingFactor != dbSettingsIn.ShardingFactor)
{
Log.Information($"Requested sharding level of {dbSettingsIn.ShardingFactor} but database was created with {settings.ShardingFactor}. Ignoring request and using {settings.ShardingFactor}.");
}
dbSettings.ShardingFactor = settings.ShardingFactor;
}
else
{
FirstRun = true;
}
PopulateConnections();
if (MainConnection == null)
{
Log.Warning("Failed to set up Main Database connection. Cannot set up database.");
return false;
}
if (FirstRun)
{
try
{
BeginTransaction();
using var cmd2 = new SQLiteCommand(SQL_CREATE_RUNS, MainConnection.Connection, MainConnection.Transaction);
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_RESULTS;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FINDINGS_RESULTS;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FINDINGS_LEVEL_INDEX;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FINDINGS_RESULT_TYPE_INDEX;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FINDINGS_IDENTITY_INDEX;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FINDINGS_LEVEL_RESULT_TYPE_INDEX;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_FILE_MONITORED;
cmd2.ExecuteNonQuery();
cmd2.CommandText = SQL_CREATE_PERSISTED_SETTINGS;
cmd2.ExecuteNonQuery();
SetSettings(new Settings()
{
SchemaVersion = SCHEMA_VERSION,
ShardingFactor = dbSettings.ShardingFactor,
});
Connections.AsParallel().ForAll(cxn =>
{
using (var innerCmd = new SQLiteCommand(SQL_CREATE_COLLECT_RESULTS, cxn.Connection, cxn.Transaction))
{
innerCmd.ExecuteNonQuery();
innerCmd.CommandText = SQL_CREATE_COLLECT_RUN_ID_INDEX;
innerCmd.ExecuteNonQuery();
innerCmd.CommandText = SQL_CREATE_COLLECT_RUN_KEY_IDENTITY_COMBINED_INDEX;
innerCmd.ExecuteNonQuery();
innerCmd.CommandText = SQL_CREATE_COLLECT_RUN_ID_IDENTITY_INDEX;
innerCmd.ExecuteNonQuery();
}
});
}
catch (SQLiteException e)
{
Log.Debug(e, "Failed to set up fresh database.");
Environment.Exit((int)ASA_ERROR.FAILED_TO_CREATE_DATABASE);
}
finally
{
Commit();
}
}
return true;
}
return false;
}