public static ASA_ERROR Setup(string filename, DBSettings?dbSettingsIn = null) { // Clean up if we were already open. CloseDatabase(); dbSettings = (dbSettingsIn == null) ? new DBSettings() : dbSettingsIn; if (filename != null) { if (SqliteFilename != filename) { SqliteFilename = filename; } } if (!EstablishMainConnection()) { Log.Fatal(Strings.Get("FailedToEstablishMainConnection"), SqliteFilename); return(ASA_ERROR.FAILED_TO_ESTABLISH_MAIN_DB_CONNECTION); } var settingsFromDb = GetSettings(); if (settingsFromDb != null) { dbSettings.ShardingFactor = settingsFromDb.ShardingFactor; FirstRun = false; if (SCHEMA_VERSION != settingsFromDb.SchemaVersion) { Log.Fatal(Strings.Get("WrongSchema"), settingsFromDb.SchemaVersion, SCHEMA_VERSION); return(ASA_ERROR.MATCHING_SCHEMA); } if (dbSettingsIn != null && settingsFromDb.ShardingFactor != dbSettingsIn.ShardingFactor) { Log.Information(Strings.Get("InvalidShardingRequest"), dbSettingsIn.ShardingFactor, dbSettings.ShardingFactor); } AsaTelemetry.SetEnabled(settingsFromDb.TelemetryEnabled); } else { FirstRun = true; } PopulateConnections(); if (MainConnection == null) { Log.Fatal(Strings.Get("FailedToEstablishMainConnection"), SqliteFilename); 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_FILE_MONITORED; cmd2.ExecuteNonQuery(); cmd2.CommandText = SQL_CREATE_PERSISTED_SETTINGS; cmd2.ExecuteNonQuery(); SetSettings(new Settings() { SchemaVersion = SCHEMA_VERSION, ShardingFactor = dbSettings.ShardingFactor, TelemetryEnabled = true }); 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); }
public static bool Setup(string filename, DBSettings?dbSettingsIn = null) { JsonSerializer.SetDefaultResolver(StandardResolver.ExcludeNull); 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; AsaTelemetry.SetEnabled(settings.TelemetryEnabled); } 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, TelemetryEnabled = true }); 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); }