public override ASA_ERROR Setup()

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