in Lib/Utils/SqliteDatabaseManager.cs [915:1021]
public override ASA_ERROR Setup()
{
// Clean up if we were already open.
CloseDatabase();
if (!EstablishMainConnection())
{
Log.Fatal(Strings.Get("FailedToEstablishMainConnection"), Location);
return ASA_ERROR.FAILED_TO_ESTABLISH_MAIN_DB_CONNECTION;
}
var settingsFromDb = GetSettings();
if (settingsFromDb != null)
{
FirstRun = false;
if (SCHEMA_VERSION != settingsFromDb.SchemaVersion)
{
Log.Fatal(Strings.Get("WrongSchema"), settingsFromDb.SchemaVersion, SCHEMA_VERSION);
return ASA_ERROR.MATCHING_SCHEMA;
}
if (settingsFromDb.ShardingFactor != dbSettings.ShardingFactor)
{
Log.Information(Strings.Get("InvalidShardingRequest"), dbSettings.ShardingFactor, settingsFromDb.ShardingFactor);
}
dbSettings.ShardingFactor = settingsFromDb.ShardingFactor;
}
else
{
FirstRun = true;
}
PopulateConnections();
if (MainConnection == null)
{
Log.Fatal(Strings.Get("FailedToEstablishMainConnection"), Location);
return ASA_ERROR.FAILED_TO_ESTABLISH_MAIN_DB_CONNECTION;
}
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_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.");
return ASA_ERROR.FAILED_TO_CREATE_DATABASE;
}
finally
{
Commit();
}
}
return ASA_ERROR.NONE;
}