using System; using System.IO; using System.Runtime.Serialization; using Arrowgene.Ddon.Shared; namespace Arrowgene.Ddon.Database { [DataContract] public class DatabaseSetting { public DatabaseSetting() { Type = "sqlite"; DatabaseFolder = Path.Combine(Util.ExecutingDirectory(), "Files/Database"); Host = "localhost"; Port = 3306; Database = "Ddon"; User = string.Empty; Password = string.Empty; EnablePooling = true; EnableTracing = true; BufferSize = 32768; // SQLite-only WipeOnStartup = false; // PSQL-only NoResetOnClose = true; // PSQL-only MaxAutoPrepare = 200; string envDbType = Environment.GetEnvironmentVariable("DB_TYPE"); if (!string.IsNullOrEmpty(envDbType)) { Type = envDbType; } string envDbFolder = Environment.GetEnvironmentVariable("DB_FOLDER"); if (!string.IsNullOrEmpty(envDbFolder)) { DatabaseFolder = envDbFolder; } string envDbHost = Environment.GetEnvironmentVariable("DB_HOST"); if (!string.IsNullOrEmpty(envDbHost)) { Host = envDbHost; } string envDbPort = Environment.GetEnvironmentVariable("DB_PORT"); if (!string.IsNullOrEmpty(envDbPort)) { Port = Convert.ToInt16(envDbPort); } string envDbDatabase = Environment.GetEnvironmentVariable("DB_DATABASE"); if (!string.IsNullOrEmpty(envDbDatabase)) { Database = envDbDatabase; } string envDbUser = Environment.GetEnvironmentVariable("DB_USER"); if (!string.IsNullOrEmpty(envDbUser)) { User = envDbUser; } string envDbPass = Environment.GetEnvironmentVariable("DB_PASS"); if (!string.IsNullOrEmpty(envDbPass)) { Password = envDbPass; } string envDbEnablePooling = Environment.GetEnvironmentVariable("DB_ENABLE_POOLING"); if (!string.IsNullOrEmpty(envDbEnablePooling)) { EnablePooling = Convert.ToBoolean(envDbEnablePooling); } // SQLite-only string envDbWipeOnStartup = Environment.GetEnvironmentVariable("DB_WIPE_ON_STARTUP"); if (!string.IsNullOrEmpty(envDbWipeOnStartup)) { WipeOnStartup = Convert.ToBoolean(envDbWipeOnStartup); } string envDbEnableTracing = Environment.GetEnvironmentVariable("DB_ENABLE_TRACING"); if (!string.IsNullOrEmpty(envDbEnableTracing)) { EnableTracing = Convert.ToBoolean(envDbEnableTracing); } // PSQL-only string envDbBufferSize = Environment.GetEnvironmentVariable("DB_BUFFER_SIZE"); if (!string.IsNullOrEmpty(envDbBufferSize)) { BufferSize = Convert.ToUInt32(envDbBufferSize); } // PSQL-only string envDbResetOnClose = Environment.GetEnvironmentVariable("DB_NO_RESET_ON_CLOSE"); if (!string.IsNullOrEmpty(envDbResetOnClose)) { NoResetOnClose = Convert.ToBoolean(envDbResetOnClose); } // PSQL-only string envDbMaxAutoPrepare = Environment.GetEnvironmentVariable("DB_MAX_AUTO_PREPARE"); if (!string.IsNullOrEmpty(envDbMaxAutoPrepare)) { MaxAutoPrepare = Convert.ToUInt32(envDbMaxAutoPrepare); } } public DatabaseSetting(DatabaseSetting databaseSettings) { Type = databaseSettings.Type; DatabaseFolder = databaseSettings.DatabaseFolder; Host = databaseSettings.Host; Port = databaseSettings.Port; User = databaseSettings.User; Password = databaseSettings.Password; Database = databaseSettings.Database; WipeOnStartup = databaseSettings.WipeOnStartup; BufferSize = databaseSettings.BufferSize; // SQLite-only EnableTracing = databaseSettings.EnableTracing; // PSQL-only NoResetOnClose = databaseSettings.NoResetOnClose; MaxAutoPrepare = databaseSettings.MaxAutoPrepare; } [DataMember(Order = 0)] public string Type { get; set; } [DataMember(Order = 1)] public string DatabaseFolder { get; set; } [DataMember(Order = 2)] public string Host { get; set; } [DataMember(Order = 3)] public short Port { get; set; } [DataMember(Order = 4)] public string User { get; set; } [DataMember(Order = 5)] public string Password { get; set; } [DataMember(Order = 6)] public string Database { get; set; } [DataMember(Order = 7)] public bool WipeOnStartup { get; set; } /// /// Behavior differs per DB: /// - SQLite: Enable increased logging via trace events. /// - PSQL: Enable IncludeErrorDetail. /// [DataMember(Order = 8)] public bool EnableTracing { get; set; } /// /// Behavior differs per DB: /// - SQLite: Adjust cache size in kibibytes. See: https://sqlite.org/pragma.html#pragma_cache_size /// - PSQL: Adjust read, write, socket receive and socket send buffers. See: https://www.npgsql.org/doc/performance.html#reading-large-values /// [DataMember(Order = 9)] public uint BufferSize { get; set; } /// /// PSQL-only setting to control "DISCARD ALL" usage. /// https://www.npgsql.org/doc/performance.html#pooled-connection-reset /// https://www.npgsql.org/doc/compatibility.html#pgbouncer /// Set this to true when using PgBouncer. /// [DataMember(Order = 10)] public bool NoResetOnClose { get; set; } /// /// Whether to enable built-in pooling at driver-level. /// For use cases where an external connection pool exists e.g. PgBouncer this should be turned off. /// [DataMember(Order = 11)] public bool EnablePooling { get; set; } /// /// PSQL-only setting to control how many statements to prepare and keep at most. /// https://www.npgsql.org/doc/prepare.html#automatic-preparation /// [DataMember(Order = 12)] public uint MaxAutoPrepare { get; set; } } }