/// <summary> /// Списывает кролика. /// Если кролик подсосный, то обнуляет поле с Кормилицей. /// Если кролик кормилица, то обнуляет детям поле с кормилицей /// </summary> /// <param name="sql">sql-подключение</param> /// <param name="rid">ID кролика</param> /// <param name="when">Дата списания</param> /// <param name="reason">Причина списания</param> /// <param name="notes">Заметки</param> public static void killRabbit(MySqlConnection sql, int rid, int daysPast, int reason, string notes) { if (rid == 0) { return; } string when = DBHelper.DaysPastSqlDate(daysPast); AddressR a = freeTier(sql, rid); freeName(sql, rid); MySqlCommand cmd = new MySqlCommand(String.Format("SELECT COALESCE(r_parent, 0) AS r_parent FROM rabbits WHERE r_id={0:d};", rid), sql); if (cmd.ExecuteScalar().ToString() != "0") //если подсосный { cmd.CommandText = String.Format("UPDATE rabbits SET r_parent = NULL WHERE r_id={0:d};", rid); cmd.ExecuteNonQuery(); } else { // если не подсосный, то ищем подсосных cmd = new MySqlCommand(String.Format("SELECT r_id FROM rabbits WHERE r_parent = {0:d};", rid), sql); MySqlDataReader rd = cmd.ExecuteReader(); if (rd.Read()) { int c1 = rd.GetInt32("r_id"); rd.Close(); if (c1 != 0) { RabbitGetter.placeRabbit(sql, c1, a.Farm, a.Floor, a.Section); cmd.CommandText = String.Format("UPDATE rabbits SET r_parent = NULL WHERE r_id={0:d};", c1); cmd.ExecuteNonQuery(); } } else { rd.Close(); } } cmd.CommandText = String.Format("UPDATE rabbits SET r_parent = NULL, r_farm={1}, r_tier={2}, r_area={3}, r_tier_id={4} WHERE r_parent={0};", rid, DBHelper.Nullable(a.Farm), DBHelper.Nullable(a.TierId), a.Section, a.Floor ); cmd.ExecuteNonQuery(); cmd.CommandText = String.Format(@"COMMIT; CALL killRabbitDate({0:d}, {1:d}, '{2:s}', {3:s});", rid, reason, notes, when); cmd.ExecuteNonQuery(); }
/// <summary> /// Освобождает клетку, в которой сидел кролик. /// </summary> /// <param name="rabbit">ID кролика, который сидит в клетке</param> public static AddressR freeTier(MySqlConnection sql, int rabbit) { MySqlCommand cmd = new MySqlCommand(String.Format(@"SELECT r_id, r_farm, r_tier, r_tier_id, r_area, t_busy1, t_busy2, t_busy3, t_busy4, Coalesce(m_upper,0) AS m_upper, Coalesce(m_lower,0) AS m_lower, m_id FROM rabbits LEFT JOIN tiers ON r_tier = t_id LEFT JOIN minifarms ON r_farm = m_id WHERE r_id={0:d}", rabbit), sql); MySqlDataReader rd = cmd.ExecuteReader(); AddressR a = null; if (rd.Read()) { a = new AddressR( DBHelper.GetNullableInt(rd, "r_farm"), DBHelper.GetNullableInt(rd, "r_tier_id"), rd.GetInt32("r_area"), DBHelper.GetNullableInt(rd, "r_tier") ); int bs = DBHelper.GetNullableInt(rd, "t_busy" + (a.Section + 1).ToString()); if (bs != rabbit) { a.TierId = 0; } } rd.Close(); if (a != null) { cmd.CommandText = String.Format("UPDATE tiers SET t_busy{0:d}=0 WHERE t_id={1:d};", a.Section + 1, a.TierId); cmd.ExecuteNonQuery();///Освобождает клетку ///Проверяет наличие кролика в таблице rabbits с таким же адресом cmd.CommandText = String.Format(@"SELECT r_id FROM rabbits WHERE r_farm={0:d} AND r_tier={1:d} AND r_tier_id={2:d} AND r_area={3:d} AND r_id<>{4:d} AND r_parent IS NULL LIMIT 1;", DBHelper.Nullable(a.Farm), DBHelper.Nullable(a.TierId), a.Floor, a.Section, rabbit); rd = cmd.ExecuteReader(); if (rd.Read()) ///если имеется, то клетка в таблице tiers заселяется найденным кроликом { cmd.CommandText = String.Format("UPDATE tiers SET t_busy{0:d}={2:d} WHERE t_id={1:d};", a.Section + 1, a.TierId, rd.GetInt32("r_id")); rd.Close(); cmd.ExecuteNonQuery(); } else { rd.Close(); } } return(a); }