コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: db.mysql.cs プロジェクト: x-plora/miakro911
 public List <OneImport> ImportSearch(Filters f)
 {
     return(Import.Search(sql, f));
 }