public LimiterManager(IDbConnection db)
        {
            this.db = db;

            var sql = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ?
                                          (IQueryBuilder) new SqliteQueryCreator() : (IQueryBuilder) new MysqlQueryCreator());

            sql.EnsureTableStructure(new SqlTable("Limiters",
                                                  new SqlColumn("AccountName", MySqlDbType.VarChar, 32)
            {
                Primary = true
            },
                                                  new SqlColumn("Chests", MySqlDbType.Text),
                                                  new SqlColumn(db.GetSqlType() == SqlType.Mysql ? "`Limit`" : "Limit", MySqlDbType.Int32)
                                                  ));

            using (var result = db.QueryReader("SELECT * FROM `Limiters`"))
            {
                while (result.Read())
                {
                    Limiter limiter = new Limiter(result.Get <string>("AccountName"), result.Get <int>("Limit"));
                    limiter.LoadChests(result.Get <string>("Chests"));
                    limiters.Add(limiter);
                }
            }
        }
        public Task <ReturnTypes> UpdateChests(string accountName, List <int> value)
        {
            return(Task.Run <ReturnTypes>(() =>
            {
                try
                {
                    lock (syncLock)
                    {
                        Limiter limiter = limiters.Find(l => l.AccountName == accountName);
                        if (limiter == null)
                        {
                            return ReturnTypes.NullOrCorrupt;
                        }

                        limiter.Chests = value;
                        return db.Query("UPDATE `Limiters` SET `Chests` = @1 WHERE `AccountName` = @0",
                                        accountName, value.Serialize()) == 1 ? ReturnTypes.Success : ReturnTypes.NullOrCorrupt;
                    }
                }
                catch (Exception ex)
                {
                    TShock.Log.Error(ex.ToString());
                    return ReturnTypes.Exception;
                }
            }));
        }
        public Task <ReturnTypes> UpdateLimit(string accountName, int value)
        {
            return(Task.Run(() =>
            {
                try
                {
                    lock (syncLock)
                    {
                        Limiter limiter = limiters.Find(l => l.AccountName == accountName);
                        if (limiter == null)
                        {
                            return ReturnTypes.NullOrCorrupt;
                        }

                        limiter.Limit = value;
                        return db.Query("UPDATE `Limiters` SET `Limit` = @1 WHERE `AccountName` = @0",
                                        accountName, value) == 1 ? ReturnTypes.Success : ReturnTypes.NullOrCorrupt;
                    }
                }
                catch (Exception ex)
                {
                    TShock.Log.ConsoleError(ex.ToString());
                    return ReturnTypes.Exception;
                }
            }));
        }
 public Task <ReturnTypes> ReloadAsync()
 {
     return(Task.Run(() =>
     {
         try
         {
             lock (syncLock)
             {
                 limiters.Clear();
                 using (var result = db.QueryReader("SELECT * FROM `Limiters`"))
                 {
                     while (result.Read())
                     {
                         Limiter limiter = new Limiter(result.Get <string>("AccountName"), result.Get <int>("Limit"));
                         limiter.LoadChests(result.Get <string>("Chests"));
                         limiters.Add(limiter);
                     }
                 }
                 return ReturnTypes.Success;
             }
         }
         catch (Exception ex)
         {
             TShock.Log.ConsoleError(ex.ToString());
             return ReturnTypes.Exception;
         }
     }));
 }
 public Task <ReturnTypes> AddAsync(Limiter value)
 {
     return(Task.Run(() =>
     {
         try
         {
             lock (syncLock)
             {
                 limiters.Add(value);
                 return db.Query("INSERT INTO `Limiters` (`AccountName`, `Chests`, `Limit`) VALUES (@0, @1, @2)",
                                 value.AccountName, value.Chests.Serialize(), value.Limit) == 1 ? ReturnTypes.Success : ReturnTypes.NullOrCorrupt;
             }
         }
         catch (Exception ex)
         {
             TShock.Log.Error(ex.ToString());
             return ReturnTypes.Exception;
         }
     }));
 }