Пример #1
0
        private void Run()
        {
            string splitsPaths = ConfigurationManager.AppSettings["splitspath"];

            while (m_continue)
            {
                try
                {
                    if (m_connection.State != ConnectionState.Open)
                    {
                        if (m_connection is System.Data.H2.H2Connection)
                        {
                            (m_connection as System.Data.H2.H2Connection).Open("root", "");
                        }
                        else
                        {
                            m_connection.Open();
                        }
                    }

                    string paramOper = "?";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection)
                    {
                        paramOper = "?date";
                    }

                    /*Detect eventtype*/

                    string     scmd = "select eventForm from events where eventid = " + m_eventID;
                    IDbCommand cmd  = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    var  form    = cmd.ExecuteScalar() as string;
                    bool isRelay = form.ToLower().Contains("relay");

                    /* detect ola version*/
                    scmd            = "select versionNumber from Version";
                    cmd             = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    int version = Convert.ToInt32(cmd.ExecuteScalar());

                    string baseCommand      = "select results.bibNumber, results.individualCourseId, results.rawDataFromElectronicPunchingCardsId, results.modifyDate, results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, results.runnerStatus, results.entryid, results.allocatedStartTime, results.starttime, entries.allocationControl, entries.allocationEntryId from results, entries, Persons, organisations, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and results.modifyDate > " + paramOper;
                    string splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.entryid, results.allocatedStartTime, results.starttime, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, splittimes.passedCount,entries.allocationControl, entries.allocationEntryId from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, organisations, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and  splitTimes.modifyDate > " + paramOper;

                    RelayEventCache relayEventCache = null;


                    if (isRelay)
                    {
                        relayEventCache = new RelayEventCache {
                            Configuration = new EventConfiguration()
                        };
                        relayEventCache.OnLogMessage    += FireLogMsg;
                        relayEventCache.OnResultChanged += FireOnResult;

                        /*Detect changeover-types for all classes/legs*/
                        cmd.CommandText =
                            "select ec.shortName, rc.relayLeg, rc.allocationMethod from raceclasses rc, eventClasses ec where ec.eventclassId = rc.eventClassId and rc.eventRaceId=" +
                            m_eventRaceId;

                        using (var classReader = cmd.ExecuteReader())
                        {
                            while (classReader.Read())
                            {
                                relayEventCache.Configuration.AddClassLeg(classReader["shortName"].ToString(),
                                                                          Convert.ToInt32(classReader["relayLeg"].ToString()),
                                                                          String.Compare(classReader["allocationMethod"].ToString(), "relayLastRunner", StringComparison.OrdinalIgnoreCase) == 0
                                        ? SummaryMethod.LastRunnerOnPreviousLeg
                                        : SummaryMethod.FirstRunnerOnPreviousLeg);
                            }
                            classReader.Close();
                        }


                        baseCommand      = "select results.bibNumber, results.individualCourseId, results.rawDataFromElectronicPunchingCardsId, results.modifyDate,results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName, raceclasses.relayleg, results.runnerStatus, results.resultId as entryId, results.finishTime, results.allocatedStartTime, results.starttime from results, entries, Persons, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and  results.modifyDate > " + paramOper + " order by relayLeg";
                        splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.resultId as entryId, results.allocatedStartTime, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName,raceclasses.relayleg, splittimes.passedCount,results.allocatedStartTime, results.starttime from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and splitTimes.modifyDate > " + paramOper;
                    }

                    if (m_recreateRadioControls)
                    {
                        ReadRadioControls();
                    }

                    cmd.CommandText = baseCommand;
                    IDbCommand cmdSplits     = m_connection.CreateCommand();
                    IDbCommand cmdSplitTimes = m_connection.CreateCommand();
                    cmdSplits.CommandText = splitbaseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        param.DbType = DbType.String;
                        param.Value  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        param.DbType = DbType.DateTime;
                        param.Value  = DateTime.Now;
                    }


                    IDbDataParameter splitparam = cmdSplits.CreateParameter();
                    splitparam.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        splitparam.DbType = DbType.String;
                        splitparam.Value  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        splitparam.DbType = DbType.DateTime;
                        splitparam.Value  = DateTime.Now;
                    }

                    DateTime lastDateTime      = DateTime.Now.AddMonths(-120);
                    DateTime lastSplitDateTime = DateTime.Now.AddMonths(-120);
                    param.Value      = lastDateTime;
                    splitparam.Value = lastSplitDateTime;

                    cmd.Parameters.Add(param);
                    cmdSplits.Parameters.Add(splitparam);

                    FireLogMsg("OLA Monitor thread started");
                    IDataReader reader      = null;
                    var         runnerPairs = new Dictionary <int, RunnerPair>();
                    while (m_continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/
                            if (cmd is MySql.Data.MySqlClient.MySqlCommand || m_connection is System.Data.H2.H2Connection)
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value       = lastDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                            }
                            else
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value       = lastDateTime;
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime;
                            }

                            List <object[]> splitsToRead = null;
                            if (!string.IsNullOrEmpty(splitsPaths))
                            {
                                splitsToRead = new List <object[]>();
                            }

                            cmd.Prepare();
                            reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                int    time = 0, runnerID = 0, iStartTime = 0;
                                string famName = "", fName = "", club = "", classN = "", status = "";

                                try
                                {
                                    DateTime modDate = GetDbDateTime(reader, "modifyDate");
                                    lastDateTime = (modDate > lastDateTime ? modDate : lastDateTime);
                                    runnerID     = Convert.ToInt32(reader["entryid"].ToString());

                                    time = -9;
                                    if (reader["totaltime"] != null && reader["totaltime"] != DBNull.Value)
                                    {
                                        time = Convert.ToInt32(reader["totalTime"].ToString());
                                    }

                                    famName = (reader["lastname"] as string);
                                    fName   = (reader["firstname"] as string);

                                    lastRunner = (string.IsNullOrEmpty(fName) ? "" : (fName + " ")) + famName;

                                    club   = (reader["clubname"] as string);
                                    classN = (reader["shortname"] as string);
                                    status = reader["runnerStatus"] as string; // reader.GetString(7);

                                    DateTime startTime = DateTime.MinValue;

                                    if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        startTime = GetDbDateTime(reader, "allocatedStartTime");
                                    }
                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        startTime = GetDbDateTime(reader, "starttime");
                                    }

                                    iStartTime = 0;
                                    if (startTime > DateTime.MinValue)
                                    {
                                        iStartTime = (int)(startTime.TimeOfDay.TotalSeconds * 100);
                                    }
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }


                                /*
                                 *  time is seconds * 100
                                 *
                                 * valid status is
                                 *  notStarted
                                 *  finishedTimeOk
                                 *  finishedPunchOk
                                 *  disqualified
                                 *  finished
                                 *  movedUp
                                 *  walkOver
                                 *  started
                                 *  passed
                                 *  notValid
                                 *  notActivated
                                 *  notParticipating
                                 */
                                //EMMAClient.RunnerStatus rstatus = EMMAClient.RunnerStatus.Passed;
                                int rstatus = 0;
                                switch (status)
                                {
                                case "started":
                                    rstatus = 9;
                                    break;

                                case "notActivated":
                                    rstatus = 10;
                                    //rstatus = EMMAClient.RunnerStatus.NotStartedYet;
                                    break;

                                case "notStarted":
                                    rstatus = 1;
                                    //rstatus = EMMAClient.RunnerStatus.NotStarted;
                                    break;

                                case "disqualified":
                                    rstatus = 4;
                                    break;

                                case "notValid":
                                    rstatus = 3;
                                    //rstatus = EMMAClient.RunnerStatus.MissingPunch;
                                    break;

                                case "notParticipating":
                                    rstatus = 999;
                                    break;

                                case "walkOver":
                                    rstatus = 11;
                                    //rstatus = EMMAClient.RunnerStatus.WalkOver;
                                    break;

                                case "movedUp":
                                    rstatus = 12;
                                    break;
                                }
                                if (rstatus != 999)
                                {
                                    if (isRelay)
                                    {
                                        relayEventCache.SetTeamLegResult(runnerID, classN, club, fName + " " + famName, Convert.ToInt32(reader["relayLeg"].ToString()),
                                                                         iStartTime, time, rstatus);
                                    }
                                    else
                                    {
                                        var res = new Result {
                                            ID         = runnerID,
                                            RunnerName = fName + " " + famName,
                                            RunnerClub = club,
                                            Class      = classN,
                                            StartTime  = iStartTime,
                                            Time       = time,
                                            Status     = rstatus
                                        };

                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, runnerID, res);
                                    }
                                }
                            }
                            reader.Close();
                            #region readsplits
                            if (splitsToRead != null && splitsToRead.Count > 0)
                            {
                                while (splitsToRead.Count > 0)
                                {
                                    object[] toRead = splitsToRead[0];
                                    splitsToRead.RemoveAt(0);
                                    int      bibNumber = (int)toRead[0];
                                    int      courseId  = (int)toRead[1];
                                    int      rawDataId = (int)toRead[2];
                                    DateTime startTime = (DateTime)toRead[3];
                                    int      time      = (int)toRead[4];

                                    cmdSplitTimes.CommandText = @"select ordered, punchingCode from punchingUnits pu, controlspunchingunits cpu, coursesWayPointControls cwp where
 cwp.controlId = cpu.control and cpu.punchingUnit=pu.punchingUnitId and cwp.courseId=" + courseId + " order by ordered";

                                    List <int[]> courseWayPointCodes = new List <int[]>();
                                    using (var splreader = cmdSplitTimes.ExecuteReader())
                                    {
                                        int lastOrder = -1;
                                        while (splreader.Read())
                                        {
                                            int code  = Convert.ToInt32(splreader["punchingCode"]);
                                            int order = Convert.ToInt32(splreader["ordered"]);
                                            if (courseWayPointCodes.Count == 0 || order > lastOrder)
                                            {
                                                courseWayPointCodes.Add(new int[] { code });
                                            }
                                            else
                                            {
                                                var l = new List <int>(courseWayPointCodes[courseWayPointCodes.Count - 1]);
                                                l.Add(code);
                                                courseWayPointCodes[courseWayPointCodes.Count - 1] = l.ToArray();
                                            }
                                        }
                                        splreader.Close();
                                    }

                                    DateTime cardReadTime = DateTime.MinValue;
                                    cmdSplitTimes.CommandText = @"select readInTime from rawdatafromelectronicpunchingcards where Id=" + rawDataId;
                                    using (var splreader = cmdSplitTimes.ExecuteReader())
                                    {
                                        int lastOrder = -1;
                                        if (splreader.Read())
                                        {
                                            cardReadTime = Convert.ToDateTime(splreader["readInTime"]);
                                        }
                                        splreader.Close();
                                    }

                                    cmdSplitTimes.CommandText = @"select punchingCode, punchingTime from rawpunches where rawCardId=" + rawDataId + " order by controlNUmber";
                                    List <int[]> punches = new List <int[]>();
                                    using (var splreader = cmdSplitTimes.ExecuteReader())
                                    {
                                        while (splreader.Read())
                                        {
                                            punches.Add(new int[] { Convert.ToInt32(splreader["punchingCode"]), Convert.ToInt32(splreader["punchingTime"]) });
                                        }
                                        splreader.Close();
                                    }


                                    int curIdx        = punches.Count - 1;
                                    int timeAtReadOut = -1;
                                    while (curIdx > 0)
                                    {
                                        if (punches[curIdx][0] >= 250 && punches[curIdx][0] <= 254)
                                        {
                                            timeAtReadOut = punches[curIdx][1];
                                            break;
                                        }
                                        curIdx--;
                                    }

                                    DateTime[] splits = new DateTime[courseWayPointCodes.Count];

                                    int wayPointIx = courseWayPointCodes.Count - 1;
                                    if (timeAtReadOut > 0)
                                    {
                                        curIdx--;
                                        while (curIdx >= 0 && wayPointIx >= 0)
                                        {
                                            int punch = punches[curIdx][0];
                                            if (Array.IndexOf <int>(courseWayPointCodes[wayPointIx], punch) >= 0)
                                            {
                                                DateTime punchTime = cardReadTime.AddSeconds(-1 * (timeAtReadOut - punches[curIdx][1]));
                                                //splits.Add(new object[] { punches[curIdx]);
                                                splits[wayPointIx] = punchTime;
                                                wayPointIx--;
                                            }
                                            curIdx--;
                                        }
                                    }

                                    using (var xml = XmlWriter.Create(Path.Combine(splitsPaths, bibNumber + ".xml"), new XmlWriterSettings()
                                    {
                                        Indent = true
                                    }))
                                    {
                                        xml.WriteStartDocument();
                                        xml.WriteStartElement("splits");
                                        xml.WriteAttributeString("bibNumber", bibNumber.ToString());
                                        xml.WriteAttributeString("startTime", startTime.ToString("yyyy-MM-dd HH:mm:ss"));
                                        xml.WriteAttributeString("totalTimeSeconds", time.ToString());
                                        for (int i = 0; i < splits.Length; i++)
                                        {
                                            xml.WriteStartElement("split");
                                            xml.WriteAttributeString("control", (i + 1).ToString());
                                            xml.WriteAttributeString("punchTime", splits[i].ToString("yyyy-MM-dd HH:mm:ss"));
                                            xml.WriteAttributeString("splitTimeSeconds", ((int)(i > 0 ? (splits[i] - splits[i - 1]).TotalSeconds : 0)).ToString());
                                            xml.WriteEndElement();
                                        }
                                        xml.WriteEndElement();
                                    }
                                }
                            }
                            #endregion

                            reader = cmdSplits.ExecuteReader();
                            while (reader.Read())
                            {
                                try
                                {
                                    DateTime mod = GetDbDateTime(reader, "modifyDate");

                                    lastSplitDateTime = (mod > lastSplitDateTime ? mod : lastSplitDateTime);

                                    string   tTime   = Convert.ToString(reader[1]);
                                    DateTime pTime   = GetDbDateTime(reader, "passedTime");
                                    int      sCont   = reader.GetInt32(2);
                                    int      entryid = Convert.ToInt32(reader["entryid"].ToString());
                                    DateTime startTime;

                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        startTime = GetDbDateTime(reader, "starttime");
                                    }
                                    else if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        startTime = GetDbDateTime(reader, "allocatedStartTime");
                                    }
                                    else
                                    {
                                        continue;
                                    }
                                    int passedCount = Convert.ToInt32(reader["passedCount"].ToString());

                                    TimeSpan rTid = pTime - startTime;

                                    double time  = rTid.TotalMilliseconds / 10;
                                    var    times = new List <ResultStruct>();
                                    var    t     = new ResultStruct {
                                        ControlCode = sCont + 1000 * passedCount,
                                        ControlNo   = 0,
                                        Time        = (int)time
                                    };
                                    times.Add(t);

                                    var    sfamName = reader["lastname"] as string;
                                    var    sfName   = reader["firstname"] as string;
                                    string name     = (string.IsNullOrEmpty(sfName) ? "" : (sfName + " ")) + sfamName;

                                    var club   = reader["clubname"] as string;
                                    var classn = reader["shortname"] as string;

                                    if (isRelay)
                                    {
                                        relayEventCache.SetTeamLegSplitResult(entryid, classn, club, name, Convert.ToInt32(reader["relayLeg"].ToString()), (int)startTime.TimeOfDay.TotalSeconds * 100, sCont, (int)time, passedCount);
                                    }
                                    else
                                    {
                                        var res = new Result
                                        {
                                            ID         = entryid,
                                            RunnerName = name,
                                            RunnerClub = club,
                                            Class      = classn,
                                            StartTime  = 0,
                                            Time       = -2,
                                            Status     = 0,
                                            SplitTimes = times
                                        };
                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, entryid, res);
                                    }
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }
                            }
                            reader.Close();

                            Thread.Sleep(1000);
                        }
                        catch (Exception ee)
                        {
                            if (reader != null)
                            {
                                reader.Close();
                            }
                            FireLogMsg("OLA Parser: " + ee.Message + " {parsing: " + lastRunner);

                            Thread.Sleep(100);

                            switch (m_connection.State)
                            {
                            case ConnectionState.Broken:
                            case ConnectionState.Closed:
                                m_connection.Close();
                                m_connection.Open();
                                break;
                            }
                        }
                    }
                }
                catch (Exception ee)
                {
                    FireLogMsg("OLA Parser: " + ee.Message);
                }
                finally
                {
                    if (m_connection != null)
                    {
                        m_connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("OLA Monitor thread stopped");
                }
            }
        }
Пример #2
0
        private void Run()
        {
            while (m_continue)
            {
                try
                {
                    if (m_connection.State != ConnectionState.Open)
                    {
                        if (m_connection is System.Data.H2.H2Connection)
                        {
                            (m_connection as System.Data.H2.H2Connection).Open("root", "");
                        }
                        else
                        {
                            m_connection.Open();
                        }
                    }

                    string paramOper = "?";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection)
                    {
                        paramOper = "?date";
                    }

                    /*Detect eventtype*/

                    string     scmd = "select eventForm from events where eventid = " + m_eventID;
                    IDbCommand cmd  = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    var  form    = cmd.ExecuteScalar() as string;
                    bool isRelay = form.ToLower().Contains("relay");

                    /* detect ola version*/
                    scmd            = "select versionNumber from Version";
                    cmd             = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    int version = Convert.ToInt32(cmd.ExecuteScalar());

                    string baseCommand      = "select results.modifyDate, results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, results.runnerStatus, results.entryid, results.allocatedStartTime, results.starttime, entries.allocationControl, entries.allocationEntryId from results, entries, Persons, organisations, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and results.modifyDate > " + paramOper;
                    string splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.entryid, results.allocatedStartTime, results.starttime, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, splittimes.passedCount,entries.allocationControl, entries.allocationEntryId from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, organisations, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and  splitTimes.modifyDate > " + paramOper;

                    RelayEventCache relayEventCache = null;


                    if (isRelay)
                    {
                        relayEventCache = new RelayEventCache {
                            Configuration = new EventConfiguration()
                        };
                        relayEventCache.OnLogMessage    += FireLogMsg;
                        relayEventCache.OnResultChanged += FireOnResult;

                        /*Detect changeover-types for all classes/legs*/
                        cmd.CommandText =
                            "select ec.shortName, rc.relayLeg, rc.allocationMethod from raceclasses rc, eventClasses ec where ec.eventclassId = rc.eventClassId and rc.eventRaceId=" +
                            m_eventRaceId;

                        using (var classReader = cmd.ExecuteReader())
                        {
                            while (classReader.Read())
                            {
                                relayEventCache.Configuration.AddClassLeg(classReader["shortName"].ToString(),
                                                                          Convert.ToInt32(classReader["relayLeg"]),
                                                                          String.Compare(classReader["allocationMethod"].ToString(), "relayLastRunner", StringComparison.OrdinalIgnoreCase) == 0
                                        ? SummaryMethod.LastRunnerOnPreviousLeg
                                        : SummaryMethod.FirstRunnerOnPreviousLeg);
                            }
                            classReader.Close();
                        }


                        baseCommand      = "select results.modifyDate,results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName, raceclasses.relayleg, results.runnerStatus, results.resultId as entryId, results.finishTime, results.allocatedStartTime, results.starttime from results, entries, Persons, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and  results.modifyDate > " + paramOper + " order by relayLeg";
                        splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.resultId as entryId, results.allocatedStartTime, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName,raceclasses.relayleg, splittimes.passedCount,results.allocatedStartTime, results.starttime from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and splitTimes.modifyDate > " + paramOper;
                    }

                    if (m_recreateRadioControls)
                    {
                        ReadRadioControls();
                    }

                    cmd.CommandText = baseCommand;
                    IDbCommand cmdSplits = m_connection.CreateCommand();
                    cmdSplits.CommandText = splitbaseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        param.DbType = DbType.String;
                        param.Value  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        param.DbType = DbType.DateTime;
                        param.Value  = DateTime.Now;
                    }


                    IDbDataParameter splitparam = cmdSplits.CreateParameter();
                    splitparam.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        splitparam.DbType = DbType.String;
                        splitparam.Value  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        splitparam.DbType = DbType.DateTime;
                        splitparam.Value  = DateTime.Now;
                    }

                    DateTime lastDateTime      = DateTime.Now.AddMonths(-120);
                    DateTime lastSplitDateTime = DateTime.Now.AddMonths(-120);
                    param.Value      = lastDateTime;
                    splitparam.Value = lastSplitDateTime;

                    cmd.Parameters.Add(param);
                    cmdSplits.Parameters.Add(splitparam);

                    FireLogMsg("OLA Monitor thread started");
                    IDataReader reader      = null;
                    var         runnerPairs = new Dictionary <int, RunnerPair>();
                    while (m_continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/
                            if (cmd is MySql.Data.MySqlClient.MySqlCommand || m_connection is System.Data.H2.H2Connection)
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value       = lastDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                            }
                            else
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value       = lastDateTime;
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime;
                            }


                            cmd.Prepare();
                            reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                int    time = 0, runnerID = 0, iStartTime = 0;
                                string famName = "", fName = "", club = "", classN = "", status = "";

                                try
                                {
                                    string   sModDate = Convert.ToString(reader[0]);
                                    DateTime modDate  = ParseDateTime(sModDate);
                                    lastDateTime = (modDate > lastDateTime ? modDate : lastDateTime);
                                    runnerID     = Convert.ToInt32(reader["entryid"].ToString());

                                    time = -9;
                                    if (reader["totaltime"] != null && reader["totaltime"] != DBNull.Value)
                                    {
                                        time = Convert.ToInt32(reader["totalTime"].ToString());
                                    }

                                    famName = (reader["lastname"] as string);
                                    fName   = (reader["firstname"] as string);

                                    lastRunner = (string.IsNullOrEmpty(fName) ? "" : (fName + " ")) + famName;

                                    club   = (reader["clubname"] as string);
                                    classN = (reader["shortname"] as string);
                                    status = reader["runnerStatus"] as string; // reader.GetString(7);

                                    DateTime startTime = DateTime.MinValue;

                                    if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        string tTime = reader["allocatedStartTime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        string tTime = reader["starttime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }


                                    iStartTime = 0;
                                    if (startTime > DateTime.MinValue)
                                    {
                                        iStartTime = (int)(startTime.TimeOfDay.TotalSeconds * 100);
                                    }
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }


                                /*
                                 *  time is seconds * 100
                                 *
                                 * valid status is
                                 *  notStarted
                                 *  finishedTimeOk
                                 *  finishedPunchOk
                                 *  disqualified
                                 *  finished
                                 *  movedUp
                                 *  walkOver
                                 *  started
                                 *  passed
                                 *  notValid
                                 *  notActivated
                                 *  notParticipating
                                 */
                                //EMMAClient.RunnerStatus rstatus = EMMAClient.RunnerStatus.Passed;
                                int rstatus = 0;
                                switch (status)
                                {
                                case "started":
                                    rstatus = 9;
                                    break;

                                case "notActivated":
                                    rstatus = 10;
                                    //rstatus = EMMAClient.RunnerStatus.NotStartedYet;
                                    break;

                                case "notStarted":
                                    rstatus = 1;
                                    //rstatus = EMMAClient.RunnerStatus.NotStarted;
                                    break;

                                case "disqualified":
                                    rstatus = 4;
                                    break;

                                case "notValid":
                                    rstatus = 3;
                                    //rstatus = EMMAClient.RunnerStatus.MissingPunch;
                                    break;

                                case "notParticipating":
                                    rstatus = 999;
                                    break;

                                case "walkOver":
                                    rstatus = 11;
                                    //rstatus = EMMAClient.RunnerStatus.WalkOver;
                                    break;

                                case "movedUp":
                                    rstatus = 12;
                                    break;
                                }
                                if (rstatus != 999)
                                {
                                    if (isRelay)
                                    {
                                        relayEventCache.SetTeamLegResult(runnerID, classN, club, fName + " " + famName, Convert.ToInt32(reader["relayLeg"]),
                                                                         iStartTime, time, rstatus);
                                    }
                                    else
                                    {
                                        var res = new Result {
                                            ID         = runnerID,
                                            RunnerName = fName + " " + famName,
                                            RunnerClub = club,
                                            Class      = classN,
                                            StartTime  = iStartTime,
                                            Time       = time,
                                            Status     = rstatus
                                        };

                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, runnerID, res);
                                    }
                                }
                            }
                            reader.Close();

                            reader = cmdSplits.ExecuteReader();
                            while (reader.Read())
                            {
                                try
                                {
                                    string   smod = Convert.ToString(reader[0]);
                                    DateTime mod;
                                    mod = ParseDateTime(smod);

                                    lastSplitDateTime = (mod > lastSplitDateTime ? mod : lastSplitDateTime);

                                    string   tTime = Convert.ToString(reader[1]);
                                    DateTime pTime;
                                    pTime = ParseDateTime(tTime);
                                    int      sCont   = reader.GetInt32(2);
                                    int      entryid = Convert.ToInt32(reader["entryid"].ToString());
                                    DateTime startTime;

                                    //if (isRelay && reader["firstStartTime"] != null && reader["firstStartTime"] != DBNull.Value)
                                    //{
                                    //    tTime = reader["firstStartTime"].ToString();
                                    //    startTime = ParseDateTime(tTime);
                                    //}
                                    //else
                                    if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        tTime     = reader["allocatedStartTime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    else if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        tTime     = reader["starttime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    else
                                    {
                                        continue;
                                    }
                                    int passedCount = Convert.ToInt32(reader["passedCount"].ToString());

                                    TimeSpan rTid = pTime - startTime;

                                    double time  = rTid.TotalMilliseconds / 10;
                                    var    times = new List <ResultStruct>();
                                    var    t     = new ResultStruct {
                                        ControlCode = sCont + 1000 * passedCount,
                                        ControlNo   = 0,
                                        Time        = (int)time
                                    };
                                    times.Add(t);

                                    var    sfamName = reader["lastname"] as string;
                                    var    sfName   = reader["firstname"] as string;
                                    string name     = (string.IsNullOrEmpty(sfName) ? "" : (sfName + " ")) + sfamName;

                                    var club   = reader["clubname"] as string;
                                    var classn = reader["shortname"] as string;

                                    if (isRelay)
                                    {
                                        //classn = classn + "-" + Convert.ToString(reader["relayLeg"]);

                                        relayEventCache.SetTeamLegSplitResult(entryid, classn, club, name, Convert.ToInt32(reader["relayLeg"]), (int)startTime.TimeOfDay.TotalSeconds * 100, sCont, (int)time, passedCount);
                                    }
                                    else
                                    {
                                        var res = new Result
                                        {
                                            ID         = entryid,
                                            RunnerName = name,
                                            RunnerClub = club,
                                            Class      = classn,
                                            StartTime  = 0,
                                            Time       = -2,
                                            Status     = 0,
                                            SplitTimes = times
                                        };
                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, entryid, res);
                                    }
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }
                            }
                            reader.Close();

                            Thread.Sleep(1000);
                        }
                        catch (Exception ee)
                        {
                            if (reader != null)
                            {
                                reader.Close();
                            }
                            FireLogMsg("OLA Parser: " + ee.Message + " {parsing: " + lastRunner);

                            Thread.Sleep(100);

                            switch (m_connection.State)
                            {
                            case ConnectionState.Broken:
                            case ConnectionState.Closed:
                                m_connection.Close();
                                m_connection.Open();
                                break;
                            }
                        }
                    }
                }
                catch (Exception ee)
                {
                    FireLogMsg("OLA Parser: " + ee.Message);
                }
                finally
                {
                    if (m_connection != null)
                    {
                        m_connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("OLA Monitor thread stopped");
                }
            }
        }
Пример #3
0
        private void Run()
        {
            while (m_continue)
            {
                try
                {
                    if (m_connection.State != ConnectionState.Open)
                    {
                        if (m_connection is System.Data.H2.H2Connection)
                        {
                            (m_connection as System.Data.H2.H2Connection).Open("root", "");
                        }
                        else
                        {
                            m_connection.Open();
                        }
                    }

                    string paramOper = "?";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection)
                    {
                        paramOper = "?date";
                    }

                    /*Detect eventtype*/

                    string scmd = "select eventForm from events where eventid = " + m_eventID;
                    IDbCommand cmd = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    var form = cmd.ExecuteScalar() as string;
                    bool isRelay = form.ToLower().Contains("relay");

                    /* detect ola version*/
                    scmd = "select versionNumber from Version";
                    cmd = m_connection.CreateCommand();
                    cmd.CommandText = scmd;

                    int version = Convert.ToInt32(cmd.ExecuteScalar());

                    string baseCommand = "select results.modifyDate, results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, results.runnerStatus, results.entryid, results.allocatedStartTime, results.starttime, entries.allocationControl, entries.allocationEntryId from results, entries, Persons, organisations, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and results.modifyDate > " + paramOper;
                    string splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.entryid, results.allocatedStartTime, results.starttime, persons.familyname as lastname, persons.firstname as firstname, organisations.shortname as clubname, eventclasses.shortName, splittimes.passedCount,entries.allocationControl, entries.allocationEntryId from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, organisations, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and entries.competitorid = persons.personid and persons.defaultorganisationid = organisations.organisationid and raceClasses.raceClassStatus <> 'notUsed' and  splitTimes.modifyDate > " + paramOper;

                    RelayEventCache relayEventCache = null;

                    if (isRelay)
                    {
                        relayEventCache = new RelayEventCache{
                            Configuration = new EventConfiguration()
                        };
                        relayEventCache.OnLogMessage += FireLogMsg;
                        relayEventCache.OnResultChanged += FireOnResult;

                        /*Detect changeover-types for all classes/legs*/
                        cmd.CommandText =
                            "select ec.shortName, rc.relayLeg, rc.allocationMethod from raceclasses rc, eventClasses ec where ec.eventclassId = rc.eventClassId and rc.eventRaceId=" +
                            m_eventRaceId;

                        using (var classReader = cmd.ExecuteReader())
                        {
                            while (classReader.Read())
                            {
                                relayEventCache.Configuration.AddClassLeg(classReader["shortName"].ToString(),
                                    Convert.ToInt32(classReader["relayLeg"]),
                                    String.Compare(classReader["allocationMethod"].ToString(), "relayLastRunner", StringComparison.OrdinalIgnoreCase) == 0
                                        ? SummaryMethod.LastRunnerOnPreviousLeg
                                        : SummaryMethod.FirstRunnerOnPreviousLeg);

                            }
                            classReader.Close();
                        }

                        baseCommand = "select results.modifyDate,results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName, raceclasses.relayleg, results.runnerStatus, results.resultId as entryId, results.finishTime, results.allocatedStartTime, results.starttime from results, entries, Persons, raceclasses,eventclasses where raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and  results.modifyDate > " + paramOper + " order by relayLeg";
                        splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.resultId as entryId, results.allocatedStartTime, persons.familyname as lastname, persons.firstname as firstname, entries.teamName as clubname, eventclasses.shortName,raceclasses.relayleg, splittimes.passedCount,results.allocatedStartTime, results.starttime from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, entries where splittimes.resultraceindividualnumber = results.resultid and SplitTimes.splitTimeControlID = SplitTimeControls.splitTimeControlID and SplitTimeControls.timingControl = Controls.controlid and Controls.eventRaceId = " + m_eventRaceId + " and raceclasses.eventClassID = eventClasses.eventClassID and results.raceClassID = raceclasses.raceclassid and raceClasses.eventRaceId = " + m_eventRaceId + " and eventclasses.eventid = " + m_eventID + " and results.entryid = entries.entryid and results.relaypersonid = persons.personid and raceClasses.raceClassStatus <> 'notUsed' and splitTimes.modifyDate > " + paramOper;
                    }

                    if (m_recreateRadioControls)
                    {
                        ReadRadioControls();
                    }

                    cmd.CommandText = baseCommand;
                    IDbCommand cmdSplits = m_connection.CreateCommand();
                    cmdSplits.CommandText = splitbaseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        param.DbType = DbType.String;
                        param.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        param.DbType = DbType.DateTime;
                        param.Value = DateTime.Now;
                    }

                    IDbDataParameter splitparam = cmdSplits.CreateParameter();
                    splitparam.ParameterName = "date";
                    if (m_connection is MySql.Data.MySqlClient.MySqlConnection || m_connection is System.Data.H2.H2Connection)
                    {
                        splitparam.DbType = DbType.String;
                        splitparam.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    else
                    {
                        splitparam.DbType = DbType.DateTime;
                        splitparam.Value = DateTime.Now;
                    }

                    DateTime lastDateTime = DateTime.Now.AddMonths(-120);
                    DateTime lastSplitDateTime = DateTime.Now.AddMonths(-120);
                    param.Value = lastDateTime;
                    splitparam.Value = lastSplitDateTime;

                    cmd.Parameters.Add(param);
                    cmdSplits.Parameters.Add(splitparam);

                    FireLogMsg("OLA Monitor thread started");
                    IDataReader reader = null;
                    var runnerPairs = new Dictionary<int, RunnerPair>();
                    while (m_continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/
                            if (cmd is MySql.Data.MySqlClient.MySqlCommand || m_connection is System.Data.H2.H2Connection)
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value = lastDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                            }
                            else
                            {
                                (cmd.Parameters["date"] as IDbDataParameter).Value = lastDateTime;
                                (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime;
                            }

                            cmd.Prepare();
                            reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                int time = 0, runnerID = 0, iStartTime = 0;
                                string famName = "", fName = "", club = "", classN = "", status = "";

                                try
                                {
                                    string sModDate = Convert.ToString(reader[0]);
                                    DateTime modDate = ParseDateTime(sModDate);
                                    lastDateTime = (modDate > lastDateTime ? modDate : lastDateTime);
                                    runnerID = Convert.ToInt32(reader["entryid"].ToString());

                                    time = -9;
                                    if (reader["totaltime"] != null && reader["totaltime"] != DBNull.Value)
                                        time = Convert.ToInt32(reader["totalTime"].ToString());

                                    famName = (reader["lastname"] as string);
                                    fName = (reader["firstname"] as string);

                                    lastRunner = (string.IsNullOrEmpty(fName) ? "" : (fName + " ")) + famName;

                                    club = (reader["clubname"] as string);
                                    classN = (reader["shortname"] as string);
                                    status = reader["runnerStatus"] as string; // reader.GetString(7);

                                    DateTime startTime = DateTime.MinValue;

                                    if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        string tTime = reader["allocatedStartTime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        string tTime = reader["starttime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }

                                    iStartTime = 0;
                                    if (startTime > DateTime.MinValue)
                                    {
                                        iStartTime = (int)(startTime.TimeOfDay.TotalSeconds * 100);
                                    }

                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }

                                /*
                                    time is seconds * 100
                                 *
                                 * valid status is
                                    notStarted
                                    finishedTimeOk
                                    finishedPunchOk
                                    disqualified
                                    finished
                                    movedUp
                                    walkOver
                                    started
                                    passed
                                    notValid
                                    notActivated
                                    notParticipating
                                 */
                                //EMMAClient.RunnerStatus rstatus = EMMAClient.RunnerStatus.Passed;
                                int rstatus = 0;
                                switch (status)
                                {
                                    case "started":
                                        rstatus = 9;
                                        break;
                                    case "notActivated":
                                        rstatus = 10;
                                        //rstatus = EMMAClient.RunnerStatus.NotStartedYet;
                                        break;
                                    case "notStarted":
                                        rstatus = 1;
                                        //rstatus = EMMAClient.RunnerStatus.NotStarted;
                                        break;
                                    case "disqualified":
                                        rstatus = 4;
                                        break;
                                    case "notValid":
                                        rstatus = 3;
                                        //rstatus = EMMAClient.RunnerStatus.MissingPunch;
                                        break;
                                    case "notParticipating":
                                        rstatus = 999;
                                        break;
                                    case "walkOver":
                                        rstatus = 11;
                                        //rstatus = EMMAClient.RunnerStatus.WalkOver;
                                        break;
                                    case "movedUp":
                                        rstatus = 12;
                                        break;
                                }
                                if (rstatus != 999)
                                {

                                    if (isRelay)
                                    {
                                        relayEventCache.SetTeamLegResult(runnerID, classN, club, fName + " " + famName, Convert.ToInt32(reader["relayLeg"]),
                                            iStartTime, time, rstatus);
                                    }
                                    else
                                    {

                                        var res = new Result{
                                            ID = runnerID,
                                            RunnerName = fName + " " + famName,
                                            RunnerClub = club,
                                            Class = classN,
                                            StartTime = iStartTime,
                                            Time = time,
                                            Status = rstatus

                                        };

                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, runnerID, res);
                                    }
                                }
                            }
                            reader.Close();

                            reader = cmdSplits.ExecuteReader();
                            while (reader.Read())
                            {
                                try
                                {
                                    string smod = Convert.ToString(reader[0]);
                                    DateTime mod;
                                    mod = ParseDateTime(smod);

                                    lastSplitDateTime = (mod > lastSplitDateTime ? mod : lastSplitDateTime);

                                    string tTime = Convert.ToString(reader[1]);
                                    DateTime pTime;
                                    pTime = ParseDateTime(tTime);
                                    int sCont = reader.GetInt32(2);
                                    int entryid = Convert.ToInt32(reader["entryid"].ToString());
                                    DateTime startTime;

                                    //if (isRelay && reader["firstStartTime"] != null && reader["firstStartTime"] != DBNull.Value)
                                    //{
                                    //    tTime = reader["firstStartTime"].ToString();
                                    //    startTime = ParseDateTime(tTime);
                                    //}
                                    //else
                                    if (reader["allocatedStartTime"] != null && reader["allocatedStartTime"] != DBNull.Value)
                                    {
                                        tTime = reader["allocatedStartTime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    else if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        tTime = reader["starttime"].ToString();
                                        startTime = ParseDateTime(tTime);
                                    }
                                    else
                                    {
                                        continue;
                                    }
                                    int passedCount = Convert.ToInt32(reader["passedCount"].ToString());

                                    TimeSpan rTid = pTime - startTime;

                                    double time = rTid.TotalMilliseconds / 10;
                                    var times = new List<ResultStruct>();
                                    var t = new ResultStruct{
                                        ControlCode = sCont + 1000*passedCount,
                                        ControlNo = 0,
                                        Time = (int) time
                                    };
                                    times.Add(t);

                                    var sfamName = reader["lastname"] as string;
                                    var sfName = reader["firstname"] as string;
                                    string name = (string.IsNullOrEmpty(sfName) ? "" : (sfName + " ")) + sfamName;

                                    var club = reader["clubname"] as string;
                                    var classn = reader["shortname"] as string;

                                    if (isRelay)
                                    {
                                        //classn = classn + "-" + Convert.ToString(reader["relayLeg"]);

                                        relayEventCache.SetTeamLegSplitResult(entryid, classn, club, name, Convert.ToInt32(reader["relayLeg"]), (int)startTime.TimeOfDay.TotalSeconds * 100, sCont, (int)time, passedCount);
                                    }
                                    else
                                    {
                                        var res = new Result
                                        {
                                            ID = entryid,
                                            RunnerName = name,
                                            RunnerClub = club,
                                            Class = classn,
                                            StartTime = 0,
                                            Time = -2,
                                            Status = 0,
                                            SplitTimes = times
                                        };
                                        CheckAndCreatePairRunner(isRelay, reader, runnerPairs, entryid, res);
                                    }
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }
                            }
                            reader.Close();

                            Thread.Sleep(1000);
                        }
                        catch (Exception ee)
                        {
                            if (reader != null)
                                reader.Close();
                            FireLogMsg("OLA Parser: " + ee.Message + " {parsing: " + lastRunner);

                            Thread.Sleep(100);

                            switch (m_connection.State)
                            {
                                case ConnectionState.Broken:
                                case ConnectionState.Closed:
                                    m_connection.Close();
                                    m_connection.Open();
                                    break;
                            }
                        }
                    }
                }
                catch (Exception ee)
                {
                    FireLogMsg("OLA Parser: " +ee.Message);
                }
                finally
                {
                    if (m_connection != null)
                    {
                        m_connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("OLA Monitor thread stopped");

                }
            }
        }