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; 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); }