using System; using System.Collections.Generic; // ReSharper disable ConditionalTernaryEqualBranch // ReSharper disable RedundantAssignment // ReSharper disable once CheckNamespace namespace DTS.Common.Settings { /// /// handles storing/retrieving settings from a db /// assumes DB connection is already established or connection information has already been set for db /// public class SettingsDB { private static SettingsDB _instance; private static readonly object LOCK_OBJECT = new object(); private const string CSV_IMPORT_CREATE_DYNAMIC_GROUPS = "CSVImportCreateDynamicGroups"; private const string IMPORT_CREATE_DYNAMIC_GROUPS = "ImportCreateDynamicGroups"; private static SettingsDB Instance { get { lock (LOCK_OBJECT) { return _instance ?? (_instance = new SettingsDB()); } } } private readonly Dictionary _settingsLookup = new Dictionary(); private SettingsDB() { } public static void RefreshSettings() { lock (LOCK_OBJECT) { Instance._settingsLookup.Clear(); } } /// /// retrieve property value given user /// creates with default value if doesn't exist /// /// /// /// /// public static string GetUserValue(string id, string defaultValue, string user) { var key = $"{id}_{user}"; lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(key)) { Instance._settingsLookup[key] = new UserSetting(id, defaultValue, user); } return Instance._settingsLookup[key].PropertyValue; } } /// /// retrieves a global value, creates using default value if property doesn't exist yet /// /// /// /// public static string GetGlobalValue(string id, string defaultValue, bool useCache = true) { lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(id) || !useCache) { //If a setting is being added to the db, and is replacing an old //setting, use the value of the old setting if ((id == IMPORT_CREATE_DYNAMIC_GROUPS) && Instance._settingsLookup.ContainsKey(CSV_IMPORT_CREATE_DYNAMIC_GROUPS)) { defaultValue = Instance._settingsLookup[CSV_IMPORT_CREATE_DYNAMIC_GROUPS].PropertyValue; } Instance._settingsLookup[id] = new GlobalSetting(id, defaultValue); } return Instance._settingsLookup[id].PropertyValue; } } public static void GetAllGlobalValues() { var settings = GlobalSetting.GetAllGlobalSettings(); lock (LOCK_OBJECT) { foreach (var setting in settings) { Instance._settingsLookup[setting.PropertyId] = setting; } } } /// /// returns the global value for given property, or the default value if no value currently exists /// /// /// /// public static double GetGlobalValueDouble(string id, double defaultValue) { var sValue = GetGlobalValue(id, defaultValue.ToString(System.Globalization.CultureInfo.InvariantCulture)); var d = defaultValue; return !double.TryParse(sValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out d) ? defaultValue : d; } public static int GetGlobalValueInt(string id, int defaultValue) { var sValue = GetGlobalValue(id, defaultValue.ToString(System.Globalization.CultureInfo.InvariantCulture)); var d = defaultValue; return !int.TryParse(sValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out d) ? defaultValue : d; } /// /// returns the global value for given property, or the default value if no value currently exists /// /// /// /// public static bool GetGlobalValueBool(string id, bool defaultValue, bool useCache = true) { var sValue = GetGlobalValue(id, defaultValue.ToString(System.Globalization.CultureInfo.InvariantCulture), useCache); var b = defaultValue; return !bool.TryParse(sValue, out b) ? b : b; } public static double[] GetGlobalValueDoubleArray(string id, double[] defaultValues) { var key = $"{id}_x_Count"; var count = GetGlobalValueInt(key, defaultValues.Length); var values = new List(); for (var i = 0; i < count; i++) { var thiskey = $"{id}_x_{i}"; values.Add(i >= defaultValues.Length ? GetGlobalValueDouble(thiskey, 0D) : GetGlobalValueDouble(thiskey, defaultValues[i])); } return values.ToArray(); } public static void SetGlobalValueDoubleArray(string id, double[] values) { var key = $"{id}_x_Count"; SetGlobalValueInt(key, values.Length); for (var i = 0; i < values.Length; i++) { var thiskey = $"{id}_x_{i}"; SetGlobalValueDouble(thiskey, values[i]); } } public static int[] GetGlobalValueIntArray(string id, int[] defaultValues) { var key = $"{id}_x_Count"; var count = GetGlobalValueInt(key, defaultValues.Length); var values = new List(); for (var i = 0; i < count; i++) { try { var thiskey = $"{id}_x_{i}"; values.Add(i >= defaultValues.Length ? GetGlobalValueInt(thiskey, 0) : GetGlobalValueInt(thiskey, defaultValues[i])); } catch (Exception) { /* catch (Exception ex) { APILogger.Log(ex); } */ } } return values.ToArray(); } public static void SetGlobalValueIntArray(string id, int[] values) { var key = $"{id}_x_Count"; SetGlobalValueInt(key, values.Length); for (var i = 0; i < values.Length; i++) { var thiskey = $"{id}_x_{i}"; SetGlobalValueInt(thiskey, values[i]); } } /// /// sets user specific property in database /// /// /// /// public static void SetUserValue(string id, string value, string user) { var key = $"{id}_{user}"; lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(key)) { Instance._settingsLookup[key] = new UserSetting(id, value, user); } Instance._settingsLookup[key].SetValue(value); } } /// /// stores an application global property in the database /// /// /// public static void SetGlobalValue(string id, string value) { lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(id)) { Instance._settingsLookup[id] = new GlobalSetting(id, value); } Instance._settingsLookup[id].SetValue(value); } } /// /// stores an application global property value in the database /// /// /// public static void SetGlobalValueDouble(string id, double value) { lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(id)) { Instance._settingsLookup[id] = new GlobalSetting(id, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } Instance._settingsLookup[id].SetValue(value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } } public static void SetGlobalValueInt(string id, int value) { lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(id)) { Instance._settingsLookup[id] = new GlobalSetting(id, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } Instance._settingsLookup[id].SetValue(value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } } /// /// stores an application global property value in the database /// /// /// public static void SetGlobalValueBoolean(string id, bool value) { lock (LOCK_OBJECT) { if (!Instance._settingsLookup.ContainsKey(id)) { Instance._settingsLookup[id] = new GlobalSetting(id, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } if (id == IMPORT_CREATE_DYNAMIC_GROUPS) { // 36831 The ImportCreateDynamicGroups setting has replaced the CSVImportCreateDynamicGroups setting, but // the old setting needs to still be used by pre-Version 93 clients, so set it whenever the new one is set. // When a pre-Version 93 client sets the old setting, the stored procedure will also set the new one. if (!Instance._settingsLookup.ContainsKey(CSV_IMPORT_CREATE_DYNAMIC_GROUPS)) { Instance._settingsLookup[CSV_IMPORT_CREATE_DYNAMIC_GROUPS] = new GlobalSetting(CSV_IMPORT_CREATE_DYNAMIC_GROUPS, "True"); } //This SetValue call will set both the ImportCreateDynamicGroups (new) and CSVImportCreateDynamicGroups (old) settings. Instance._settingsLookup[CSV_IMPORT_CREATE_DYNAMIC_GROUPS].SetValue(value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } Instance._settingsLookup[id].SetValue(value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } } } }