/// <summary> /// Получает родословную кролика с заданным rabId /// </summary> /// <param name="rabId">ID кролика</param> /// <param name="con"></param> /// <param name="lineage">Стэк родословной для предотвращения рекурсии</param> /// <returns></returns> private static RabTreeData getRabbitGenTree(MySqlConnection con, int rabId, int birthplace, int nameId, Stack <int> lineage)//, int level) { if (rabId == 0) { return(null); } //проверка на рекурсию, которая могла возникнуть после конвертации из старой mia-файла if (lineage.Count > 700) { //_logger.Warn("cnt:" + lineage.Count.ToString() + " we have suspect infinity inheritance loop: " + String.Join(",", Array.ConvertAll<int, string>(lineage.ToArray(), new Converter<int, string>(convIntToString)))); return(null); } lineage.Push(rabId); MySqlCommand cmd = new MySqlCommand("", con); MySqlDataReader rd = null; RabAliveState state = RabAliveState.ALIVE; bool inFarm = true; string query = @"SELECT r_id, {0:s} name, Coalesce(r_name,0) AS r_name, Coalesce(r_surname,0) AS r_surname, Coalesce(r_secname,0) AS r_secname, Coalesce(r_mother, 0) AS r_mother, Coalesce(r_father, 0) AS r_father, r_bon, r_born, r_breed, b_short_name, TO_DAYS(NOW())-TO_DAYS(r_born) age, Coalesce(r_birthplace,0) birthplace FROM {1:s} INNER JOIN breeds ON b_id = r_breed WHERE r_id={2:d} LIMIT 1;"; #if !DEMO if (birthplace != 0) //если ищем импортированного кролика { List <OneImport> lst = Import.Search(con, new Filters(Filters.RAB_ID, rabId.ToString())); inFarm = lst.Count > 0; ///если кролик не был импортирован в поголовье ///может возникнуть ситуация, что импортированный кролик имеет id родителя, который содержится и в import_ascendants и в imports if (inFarm && Import.AscendantExists(con, rabId, birthplace)) ///устранение неоднозначности { inFarm = RabbitGetter.GetRabbit(con, rabId).NameID == nameId; } } #endif if (inFarm) { cmd.CommandText = String.Format(query, "rabname(r_id,1)", "rabbits", rabId); rd = cmd.ExecuteReader(); if (!rd.HasRows) { rd.Close(); cmd.CommandText = String.Format(query, "deadname(r_id,1)", "dead", rabId); rd = cmd.ExecuteReader(); state = RabAliveState.DEAD; } } if (!inFarm) { cmd.CommandText = String.Format(query, String.Format("ascname(r_id,{0:d},1)", birthplace), "import_ascendants", rabId); rd = cmd.ExecuteReader(); state = RabAliveState.IMPORTED_ASCENDANT; } RabTreeData res = null; if (rd != null && rd.Read()) { res = new RabTreeData( rd.GetInt32("r_id"), rd.GetString("name"), rd.GetInt32("r_name"), rd.GetDateTime("r_born"), rd.GetInt32("r_breed") ); res.Bon = Rabbit.GetFBon(rd.GetString("r_bon"), true); res.BreedShortName = rd.GetString("b_short_name"); res.BirthPlace = rd.GetInt32("birthplace"); int mom = rd.GetInt32("r_mother"); int dad = rd.GetInt32("r_father"); int surname = rd.GetInt32("r_surname"); int secname = rd.GetInt32("r_secname"); rd.Close(); res.State = state; RabTreeData m = getRabbitGenTree(con, mom, birthplace, surname, lineage); RabTreeData d = getRabbitGenTree(con, dad, birthplace, secname, lineage); if (m != null) { res.Mother = m; } if (d != null) { res.Father = d; } } rd.Close(); return(res); }
public List <OneImport> ImportSearch(Filters f) { return(Import.Search(sql, f)); }