private bool HandlePropertySetException(SettingsBase settings, SettingsStorageModel property, Exception ex, bool?throwSetException = null)
        {
            throwSetException = throwSetException ?? ThrowPropertySetException;

            if (!throwSetException.Value)
            {
                string caughtExceptionDetails = string.Format("{0}-{1}", ex.GetType().Name, property.Name);

                _periodicReaderErrors.Add(caughtExceptionDetails);

                if (PropertyError != null) //only raise event when not throttling
                {
                    var propertyException = new SettingsPropertyException(
                        String.Format("Error setting property {0}.{1}", settings.Category, property.Name),
                        property.Name,
                        settings.Category,
                        ex);

                    var repeatingErrorEventArgs = new RepeatingErrorEventArgs()
                    {
                        Exception   = propertyException,
                        IsRepeating = _periodicReaderErrors.Contains(caughtExceptionDetails)
                    };

                    PropertyError.Invoke(settings, repeatingErrorEventArgs);
                }
                return(true);
            }
            return(false);
        }
 public bool WriteSetting(SettingsStorageModel setting)
 {
     if (ReadOnly)
     {
         return(false);
     }
     using (var conn = new SqlConnection(_connectionString))
     {
         conn.Open();
         using (var cmd = new SqlCommand(_mergeQuery, conn))
         {
             if (setting.Value != null)
             {
                 cmd.Parameters.Add("@value", SqlDbType.NVarChar).Value = setting.Value;
             }
             else
             {
                 cmd.Parameters.Add("@value", SqlDbType.NVarChar).Value = DBNull.Value;
             }
             cmd.Parameters.Add("@name", System.Data.SqlDbType.VarChar).Value     = setting.Name;
             cmd.Parameters.Add("@category", System.Data.SqlDbType.VarChar).Value = setting.Category;
             return(cmd.ExecuteNonQuery() > 0);
         }
     }
 }
        public IEnumerable <SettingsStorageModel> ReadSettings(IList <string> categories, DateTime?lastChangedMin = null)
        {
            if (categories == null || categories.Count == 0)
            {
                return(null);
            }
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    if (lastChangedMin.HasValue)
                    {
                        cmd.Parameters.Add("@minTime", System.Data.SqlDbType.DateTime).Value = lastChangedMin;
                    }
                    var parameters = new string[categories.Count];
                    for (var i = 0; i < categories.Count; i++)
                    {
                        parameters[i] = string.Format("@cat{0}", i);
                        cmd.Parameters.AddWithValue(parameters[i], categories[i]);
                    }
                    var query = string.Format("SELECT category, name, value, UpdatedAt FROM {0} WHERE category in ({1})", _settingsTableName, string.Join(", ", parameters));
                    if (lastChangedMin.HasValue)
                    {
                        query += " AND UpdatedAt > @minTime";
                    }
                    cmd.CommandText = query;

                    using (var reader = cmd.ExecuteReader())
                    {
                        var result = new List <SettingsStorageModel>(42);
                        while (reader.Read())
                        {
                            var setting = new SettingsStorageModel()
                            {
                                Category  = reader.GetString(0),
                                Name      = reader.GetString(1),
                                Value     = reader.IsDBNull(2) ? null : reader.GetString(2),
                                UpdatedAt = reader.GetDateTime(3)
                            };
                            result.Add(setting);
                        }
                        return(result);
                    }
                }
            }
        }
 public bool WriteSetting(SettingsStorageModel s)
 {
     var existing = Content.Single(c => c.Category == s.Category && c.Name == s.Name);
     if (existing == null)
     {
         s.UpdatedAt = DateTime.UtcNow;
         Content.Add(s);
         return true;
     }
     else
     {
         existing.Value = s.Value;
         existing.UpdatedAt = DateTime.UtcNow;
         return false;
     }
 }
        public bool WriteSetting(SettingsStorageModel s)
        {
            var existing = Content.Single(c => c.Category == s.Category && c.Name == s.Name);

            if (existing == null)
            {
                s.UpdatedAt = DateTime.UtcNow;
                Content.Add(s);
                return(true);
            }
            else
            {
                existing.Value     = s.Value;
                existing.UpdatedAt = DateTime.UtcNow;
                return(false);
            }
        }
        protected virtual SettingsStorageModel ToDbModel(PropertyInfo property, SettingsBase settings)
        {
            if (!property.CanRead || !property.CanWrite)
            {
                return(null);
            }
            if (property.Name == "ReadOnly") //system property
            {
                return(null);
            }
            var value = property.GetValue(settings, null);
            var model = new SettingsStorageModel()
            {
                Category  = settings.Category,
                UpdatedAt = DateTime.UtcNow,
                Name      = property.Name
            };

            model.Value = Converter.ConvertToString(value);
            return(model);
        }
        public IEnumerable<SettingsStorageModel> ReadSettings(IList<string> categories, DateTime? lastChangedMin = null)
        {
            if (categories == null || categories.Count == 0)
                return null;
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    if (lastChangedMin.HasValue)
                        cmd.Parameters.Add("@minTime", System.Data.SqlDbType.DateTime).Value = lastChangedMin;
                    var parameters = new string[categories.Count];
                    for (var i = 0; i < categories.Count; i++)
                    {
                        parameters[i] = string.Format("@cat{0}", i);
                        cmd.Parameters.AddWithValue(parameters[i], categories[i]);
                    }
                    var query = string.Format("SELECT category, name, value, UpdatedAt FROM {0} WHERE category in ({1})", _settingsTableName, string.Join(", ", parameters));
                    if (lastChangedMin.HasValue)
                        query += " AND UpdatedAt > @minTime";
                    cmd.CommandText = query;

                    using (var reader = cmd.ExecuteReader())
                    {
                        var result = new List<SettingsStorageModel>(42);
                        while (reader.Read())
                        {
                            var setting = new SettingsStorageModel()
                            {
                                Category = reader.GetString(0),
                                Name = reader.GetString(1),
                                Value = reader.IsDBNull(2) ? null : reader.GetString(2),
                                UpdatedAt = reader.GetDateTime(3)
                            };
                            result.Add(setting);
                        }
                        return result;
                    }
                }
            }
        }
        public bool WriteSetting(SettingsStorageModel setting)
        {
            if (ReadOnly)
                return false;
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var cmd = new SqlCommand(_mergeQuery, conn))
                {
                    if (setting.Value != null)
                        cmd.Parameters.Add("@value", SqlDbType.NVarChar).Value = setting.Value;
                    else
                        cmd.Parameters.Add("@value", SqlDbType.NVarChar).Value = DBNull.Value;
                    cmd.Parameters.Add("@name", System.Data.SqlDbType.VarChar).Value = setting.Name;
                    cmd.Parameters.Add("@category", System.Data.SqlDbType.VarChar).Value = setting.Category;
                    return cmd.ExecuteNonQuery() > 0;
                }

            }
        }