Beispiel #1
0
        private void run()
        {
            OleDbCommand cmd = new OleDbCommand();

            cmd.Connection = m_Connection;

            while (m_Continue)
            {
                try
                {
                    if (m_Connection.State != System.Data.ConnectionState.Open)
                    {
                        m_Connection.Open();
                    }

                    string paramOper = "?";

                    /*Detect eventtype*/
                    bool isRelay = IsThisEventRelay(cmd);

                    string baseCommand;
                    string splitbaseCommand;

                    if (isRelay)
                    {
                        baseCommand = "SELECT n.timechanged, n.id, n.ename as lastname,r.teamno,n.races as restart,n.name as firstname , n.lisens,n.startno,c.class as classname, n.ecard,n.status,n.times, n.place, n.info as shootresult, n.rank as relayteamno, n.seed, n.starttime, n.totaltime, n.pnr, n.intime, (intime-starttime) as mtime,  t.name as teamname  " +
                                      "FROM Name n, Class c, Team t, Relay r  " +
                                      "WHERE n.class=c.code and t.code=n.team AND n.timechanged>? AND n.rank=r.lgstartno  " +
                                      "ORDER BY (intime-starttime) ASC, startno";

                        splitbaseCommand = "SELECT m.timechanged, n.id, n.ename as lastname,n.races as restart,r.teamno, n.name as firstname , n.lisens,n.startno,c.class as classname, n.ecard,n.status,m.strtid,n.rank as relayteamno, n.seed,n.starttime, m.iplace, m.stasjon, m.mintime, (m.mintime-starttime) as mtime, t.name as teamname " +
                                           "FROM Name n, Class c, Team t, Mellom m, Relay r " +
                                           "WHERE n.id=m.id and n.class=c.code and t.code=n.team AND mchanged>? AND n.rank=r.lgstartno " +
                                           "ORDER BY (mintime-starttime) ASC, startno";
                    }
                    else
                    {
                        baseCommand = "SELECT timechanged, n.id, n.ename as lastname,n.name as firstname , n.lisens,n.startno,c.class as classname, n.ecard,n.status,n.times, n.place, n.info as shootresult, n.rank, n.seed, n.starttime, n.totaltime, n.pnr, n.intime, (intime-starttime) as mtime,  t.name as teamname  " +
                                      "FROM Name n, Class c, Team t  " +
                                      "WHERE n.class=c.code and t.code=n.team AND timechanged>?  " +
                                      "ORDER BY (intime-starttime) ASC, startno";

                        splitbaseCommand = "SELECT m.timechanged, n.id, n.ename as lastname,n.name as firstname , n.lisens,n.startno,c.class as classname, n.ecard,n.status,m.strtid,n.rank, n.seed,n.starttime, m.iplace, m.stasjon, m.mintime, (m.mintime-starttime) as mtime, t.name as teamname " +
                                           "FROM Name n, Class c, Team t, Mellom m " +
                                           "WHERE n.id=m.id and n.class=c.code and t.code=n.team AND mchanged>? " +
                                           "ORDER BY (mintime-starttime) ASC, startno";
                    }


                    cmd.CommandText = baseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "date";
                    param.Value         = 0.0;
                    param.DbType        = DbType.Double;

                    IDbCommand cmdSplits = m_Connection.CreateCommand();
                    cmdSplits.CommandText = splitbaseCommand;
                    IDbDataParameter paramSplit = cmd.CreateParameter();
                    paramSplit.ParameterName = "date";
                    paramSplit.Value         = 0.0;
                    paramSplit.DbType        = DbType.Double;


/*                    IDbDataParameter splitparam = cmdSplits.CreateParameter();
 *                  splitparam.ParameterName = "date";
 *                      splitparam.Value = DateTime.Now;
 */

                    cmd.Parameters.Add(param);

                    cmdSplits.Parameters.Add(paramSplit);


                    double lastDateTime      = 0.0;
                    double lastSplitDateTime = 0.0;
                    FireLogMsg("Etiming Monitor thread started");
                    IDataReader reader = null;
                    while (m_Continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/
                            (cmd.Parameters["date"] as IDbDataParameter).Value = lastDateTime;
                            // (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime;


                            string command = cmd.CommandText;
                            cmd.Prepare();
                            reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                Double modDate = 0.0, time = 0.0;
                                int    runnerID = 0, iStartTime = 0, iTime = 0;
                                string famName = "", fName = "", club = "", classN = "", status = "", extra1 = "", extra2 = "";
                                try
                                {
                                    if (reader[0] != null && reader[0] != DBNull.Value)
                                    {
                                        modDate = Convert.ToDouble(reader[0]);
                                        if (modDate > lastDateTime)
                                        {
                                            lastDateTime = modDate;
                                        }
                                    }

                                    runnerID = Convert.ToInt32(reader["id"].ToString());

                                    time = -9;
                                    if (reader["mtime"] != null && reader["mtime"] != DBNull.Value) //  mtime = intime - starttime   - directly in the SQL
                                    {
                                        time = Convert.ToDouble(reader["mtime"].ToString());
                                    }

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

                                    club   = (reader["teamname"] as string);
                                    classN = (reader["classname"] as string);
                                    status = reader["status"] as string;

                                    double startTime = 0.0;

                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        startTime = Convert.ToDouble(reader["starttime"]);
                                    }

                                    if (isRelay)
                                    {
                                        if (reader["teamno"] != null && reader["teamno"] != DBNull.Value)
                                        {
                                            int teamno = Convert.ToInt16(reader["teamno"]);
                                            if (teamno > 1)
                                            {
                                                club = club + " " + teamno;
                                            }
                                        }

                                        classN = classN + "-" + Convert.ToString(reader["seed"]);

                                        if (reader["relayteamno"] != null && reader["relayteamno"] != DBNull.Value)
                                        {
                                            extra2 = "" + Convert.ToInt16(reader["relayteamno"]);
                                        }

                                        if (reader["restart"] != null && reader["restart"] != DBNull.Value)
                                        {
                                            extra1 = "" + Convert.ToInt16(reader["restart"]);
                                        }


                                        /*
                                         * if (reader["intime"] != DBNull.Value)
                                         * {
                                         *  double ft = Convert.ToDouble(reader["intime"].ToString());
                                         * }
                                         *
                                         * How to handle leg 4...?
                                         */
                                    }
                                    iStartTime = Convert.ToInt32(((startTime % 1) * 60 * 60 * 24 + 0.1) * 100);  // iStartTime = seconds*100
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }

                                iTime = Convert.ToInt32(((time % 1) * 60 * 60 * 24 + 0.1) * 100);  // iTime = seconds*100


                                /*
                                 *  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 = 999;
                                switch (status)
                                {
                                case "S":     // Started
                                    rstatus = 9;
                                    break;

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

                                case "N":     // Did not start
                                    rstatus = 1;
                                    //rstatus = EMMAClient.RunnerStatus.NotStarted;
                                    break;

                                case "D":     // DSQ
                                    rstatus = 4;
                                    break;

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

                                case "A":      // OK!
                                    rstatus = 0;
                                    break;
                                }
                                if (rstatus != 999)
                                {
                                    FireOnResult(
                                        new Result()
                                    {
                                        ID         = runnerID,
                                        RunnerName = fName + " " + famName,
                                        RunnerClub = club,
                                        Class      = classN,
                                        StartTime  = iStartTime,
                                        Time       = iTime,
                                        Status     = rstatus,
                                        Extra1     = extra1,
                                        Extra2     = extra2
                                    });
                                }
                            }
                            reader.Close();


                            (cmdSplits.Parameters["date"] as IDbDataParameter).Value = lastSplitDateTime;
                            reader = cmdSplits.ExecuteReader();
                            while (reader.Read())
                            {
                                try
                                {
                                    // last modified time

                                    double modDate = Convert.ToDouble(reader[0]);
                                    lastSplitDateTime = (modDate > lastSplitDateTime ? modDate : lastSplitDateTime);

                                    double startTime = 0.0, mInTime = 0.0, mTime = 0.0;
                                    int    iStartTime = 0, iMTime = 0;

                                    if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                    {
                                        startTime = Convert.ToDouble(reader["starttime"]);
                                    }

                                    iStartTime = Convert.ToInt32(((startTime % 1) * 60 * 60 * 24 + 0.1) * 100);  // iStartTime = seconds*100

                                    if (reader["mintime"] != null && reader["mintime"] != DBNull.Value)
                                    {
                                        mInTime = Convert.ToDouble(reader["mintime"]);
                                    }
                                    if (reader["mtime"] != null && reader["mtime"] != DBNull.Value)
                                    {
                                        mTime  = Convert.ToDouble(reader["mtime"]);
                                        iMTime = Convert.ToInt32(((mTime % 1) * 60 * 60 * 24 + 0.1) * 100);  //  seconds*100
                                    }
                                    int code = Convert.ToInt32(reader["iplace"]);

                                    List <ResultStruct> times = new List <ResultStruct>();
                                    ResultStruct        t     = new ResultStruct();
                                    t.ControlCode = 1 * 1000 + code;  // 1 =) passingcount
                                    t.ControlNo   = 0;
                                    t.Time        = iMTime;
                                    times.Add(t);


                                    int    runnerID = 0;
                                    string famName = "", fName = "", club = "", classN = "", status = "", extra1 = "", extra2 = "";

                                    runnerID = Convert.ToInt32(reader["id"].ToString());

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

                                    club   = (reader["teamname"] as string);
                                    classN = (reader["classname"] as string);

                                    if (isRelay)
                                    {
                                        classN = classN + "-" + Convert.ToString(reader["seed"]);

                                        extra1 = reader["restart"] as string;
                                        extra2 = reader["relayteamno"] as string;

                                        if (reader["teamno"] != null && reader["teamno"] != DBNull.Value)
                                        {
                                            int teamno = Convert.ToInt16(reader["teamno"]);
                                            if (teamno > 1)
                                            {
                                                club = club + " " + teamno;
                                            }
                                        }
                                    }

                                    FireOnResult(new Result()
                                    {
                                        ID         = runnerID,
                                        RunnerName = fName + " " + famName,
                                        RunnerClub = club,
                                        Class      = classN,
                                        StartTime  = 0,
                                        Time       = -2,
                                        Status     = 0,
                                        SplitTimes = times,
                                        Extra1     = extra1,
                                        Extra2     = extra2
                                    });
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }
                            }
                            reader.Close();

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

                            System.Threading.Thread.Sleep(100);

                            switch (m_Connection.State)
                            {
                            case ConnectionState.Broken:
                            case ConnectionState.Closed:
                                m_Connection.Close();
                                m_Connection.Open();
                                break;
                            }
                        }
                    }
                }
                catch (Exception ee)
                {
                    FireLogMsg("Etiming Parser: " + ee.Message);
                }
                finally
                {
                    if (m_Connection != null)
                    {
                        m_Connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("Etiming Monitor thread stopped");
                }
            }
        }
        public void AnalyzeFile(string filename)
        {
            System.IO.StreamReader sr = null;
            try
            {
                for (int i = 0; i < 30; i++)
                {
                    try
                    {
                        sr = new System.IO.StreamReader(filename, Encoding.Default);
                        break;
                    }
                    catch (Exception ee)
                    {
                        System.Diagnostics.Debug.WriteLine(ee.Message);
                    }
                }
                if (sr == null)
                {
                    throw new ApplicationException("Could not open input file, copy error?");
                }
                string header = sr.ReadLine();

                string[] fields = header.Split(SplitChars);

                /*Detect OE format*/
                int fldID, fldSI, fldFName, fldEName, fldClub, fldClass, fldStart, fldTime, fldStatus, fldFirstPost, fldText1, fldText2, fldText3, fldFinish, fldLeg;
                int fldTotalTime;
                OxTools.DetectOxCSVFormat(OxTools.SourceProgram.OE, fields, out fldID, out fldSI, out fldFName, out fldEName, out fldClub, out fldClass, out fldStart, out fldTime, out fldStatus, out fldFirstPost, out fldLeg, out fldFinish, out fldText1, out fldText2, out fldText3, out fldTotalTime);

                if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1 ||
                    fldStart == -1 || fldTime == -1 ||
                    fldStart == -1 || fldFirstPost == -1)
                {
                    throw new System.IO.IOException("Not OE-formatted file!");
                }

                fldText1 = Array.IndexOf(fields, "Text1");
                fldText2 = Array.IndexOf(fields, "Text2");
                fldText3 = Array.IndexOf(fields, "Text3");



                if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1 ||
                    fldStart == -1 || fldTime == -1)
                {
                    throw new System.IO.IOException("Not OE-formatted file!");
                }

                string tmp;
                while ((tmp = sr.ReadLine()) != null)
                {
                    string[] parts = tmp.Split(SplitChars);

                    /* check so that the line is not incomplete*/

                    int id;
                    if (!int.TryParse(parts[fldID], NumberStyles.Any, CultureInfo.InvariantCulture, out id))
                    {
                        FireLogMsg("Error: Could not use \"" + parts[fldID] + "\" as ID for runner " + parts[fldFName] + " " + parts[fldEName] +
                                   " - Skipping!, value taken from field: " + fields[fldID]);
                        continue;
                    }
                    string name  = parts[fldFName].Trim('\"') + " " + parts[fldEName].Trim('\"');
                    string club  = parts[fldClub].Trim('\"');
                    string Class = parts[fldClass].Trim('\"');
                    int    start = strTimeToInt(parts[fldStart]);
                    int    time  = strTimeToInt(parts[fldTime]);


                    int status = 0;
                    try
                    {
                        status = Convert.ToInt32(parts[fldStatus]);
                    }
                    catch (Exception ee)
                    {
                        FireLogMsg("Could not use status " + parts[fldStatus] + " for runner " + name + ", assuming status 0");
                    }

                    List <ResultStruct> splittimes = new List <ResultStruct>();
                    /*parse splittimes*/
                    List <int> codes = new List <int>();
                    if (fldFirstPost >= 0)
                    {
                        for (int i = fldFirstPost; i < parts.Length - 4; i++)
                        {
                            if (parts[i + 1].Length == 0 ||
                                parts[i + 2].Length == 0)
                            {
                                i += 3;
                                continue;
                            }
                            ResultStruct s = new ResultStruct();
                            try
                            {
                                //s.ControlNo = Convert.ToInt32(parts[i]);
                                i++;
                                s.ControlCode = Convert.ToInt32(parts[i]);

                                if (s.ControlCode == 999)
                                {
                                    i++;
                                    if (time == -1 && status == 0)
                                    {
                                        time = strTimeToInt(parts[i]);
                                    }

                                    i++;
                                }
                                else
                                {
                                    s.ControlCode += 1000;
                                    while (codes.Contains(s.ControlCode))
                                    {
                                        s.ControlCode += 1000;
                                    }
                                    codes.Add(s.ControlCode);

                                    i++;
                                    s.Time = strTimeToInt(parts[i]);
                                    i++;

                                    if (s.Time > 0)
                                    {
                                        s.Place = 0;
                                        try
                                        {
                                            s.Place = Convert.ToInt32(parts[i]);
                                        }
                                        catch
                                        { }

                                        splittimes.Add(s);
                                    }
                                }
                            }
                            catch
                            {
                            }
                        }
                    }
                    FireOnResult(new Result()
                    {
                        ID         = id,
                        RunnerName = name,
                        RunnerClub = club,
                        Class      = Class,
                        StartTime  = start,
                        Time       = time,
                        Status     = status,
                        SplitTimes = splittimes
                    });
                }
            }
            catch (Exception ee)
            {
                FireLogMsg("ERROR in OEPArser: " + ee.Message);
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                }
            }
        }
Beispiel #3
0
        private void Run()
        {
            while (m_continue)
            {
                try
                {
                    if (m_connection.State != ConnectionState.Open)
                    {
                        m_connection.Open();
                    }
                    IDbCommand cmd = m_connection.CreateCommand();
                    cmd.CommandText = "select zerotime from oevent";
                    int    zeroTime  = Convert.ToInt32(cmd.ExecuteScalar());
                    string paramOper = "?counter";

                    string baseCommand =
                        "select r.id,r.bib, r.name,c.name as clubname,r.starttime, r.Status, cl.name as classname, r.FinishTime,r.counter, r.removed from orunner r, oclub c, oclass cl where r.class = cl.id and c.ID = r.club and r.counter > " + paramOper + " order by r.counter";

                    string splitbaseCommand = "select p.counter, p.time, p.type,r.id,r.bib, r.name,c.name as clubname,r.starttime, r.Status, cl.name as classname from opunch p, orunner r, oclub c, oclass cl where p.CardNo = r.CardNo AND r.class = cl.id and c.ID = r.club and p.counter > " + paramOper + " order by p.counter";

                    if (m_isRelay)
                    {
                        baseCommand =
                            "select r.id,r.bib, r.name,r.starttime, r.Status, cl.name as classname, r.FinishTime,r.counter, r.removed from orunner r, oclass cl where r.class = cl.id and r.counter > " + paramOper + " order by r.counter";
                        splitbaseCommand = "select p.counter, p.time, p.type,r.id,r.bib, r.name,r.starttime, r.Status, cl.name as classname from opunch p, orunner r, oclass cl where p.CardNo = r.CardNo AND r.class = cl.id  and p.counter > " + paramOper + " order by p.counter";
                    }
                    string teamCommand = "select id, name, runners, (select legmethod from oclass oc where oc.id = class) as legmethod, counter from oTeam where counter > " + paramOper + " order by counter";

                    if (m_recreateRadioControls)
                    {
                        ReadRadioControls();
                    }

                    cmd.CommandText = baseCommand;
                    IDbCommand cmdSplits     = m_connection.CreateCommand();
                    IDbCommand cmdSplitTimes = m_connection.CreateCommand();
                    IDbCommand cmdTeams      = null;
                    if (m_isRelay)
                    {
                        cmdTeams             = m_connection.CreateCommand();
                        cmdTeams.CommandText = teamCommand;
                    }
                    cmdSplits.CommandText = splitbaseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "counter";

                    param.DbType = DbType.Int32;
                    param.Value  = -1;



                    IDbDataParameter splitparam = cmdSplits.CreateParameter();
                    splitparam.ParameterName = "counter";

                    splitparam.DbType = DbType.Int32;
                    splitparam.Value  = -1;

                    if (m_isRelay)
                    {
                        IDbDataParameter teamparam = cmdTeams.CreateParameter();
                        teamparam.ParameterName = "counter";

                        teamparam.DbType = DbType.Int32;
                        teamparam.Value  = -1;
                        cmdTeams.Parameters.Add(teamparam);
                    }


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


                    int lastCounter      = -1;
                    int lastTeamCounter  = -1;
                    int lastSplitCounter = -1;

                    FireLogMsg("MeOS Monitor thread started");
                    IDataReader              reader          = null;
                    Dictionary <int, int>    teamStarttimes  = null;
                    Dictionary <int, int>    runnerToTeamMap = null;
                    Dictionary <int, string> teamNames       = null;
                    Dictionary <int, int>    runnerLeg       = null;
                    Dictionary <int, int[]>  teamStatus      = null;
                    if (m_isRelay)
                    {
                        teamStarttimes  = new Dictionary <int, int>();
                        runnerToTeamMap = new Dictionary <int, int>();
                        runnerLeg       = new Dictionary <int, int>();
                        teamNames       = new Dictionary <int, string>();
                        teamStatus      = new Dictionary <int, int[]>();
                    }
                    while (m_continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/

                            (cmd.Parameters["counter"] as IDbDataParameter).Value = lastCounter;

                            (cmdSplits.Parameters["counter"] as IDbDataParameter).Value = lastSplitCounter;
                            cmd.Prepare();

                            if (m_isRelay)
                            {
                                (cmdTeams.Parameters["counter"] as IDbDataParameter).Value = lastTeamCounter;
                                reader = cmdTeams.ExecuteReader();
                                while (reader.Read())
                                {
                                    string name    = reader["name"] as string;
                                    int    counter = Convert.ToInt32(reader["counter"]);
                                    if (counter > lastTeamCounter)
                                    {
                                        lastTeamCounter = counter;
                                    }

                                    int id = Convert.ToInt32(reader["iD"]);
                                    if (!teamNames.ContainsKey(id))
                                    {
                                        teamNames.Add(id, name);
                                    }
                                    else
                                    {
                                        teamNames[id] = name;
                                    }

                                    string[] legSetup      = (reader["legmethod"] as string).Split('*');
                                    string[] leg1Parts     = legSetup[0].Split(':');
                                    int      leg1StartTime = (Convert.ToInt32(leg1Parts[2]) + zeroTime) * 100;


                                    if (!teamStarttimes.ContainsKey(id))
                                    {
                                        teamStarttimes.Add(id, leg1StartTime);
                                    }
                                    else
                                    {
                                        teamStarttimes[id] = leg1StartTime;
                                    }

                                    string   runners  = reader["runners"] as string;
                                    string[] arunners = runners.Split(';');
                                    for (int i = 0; i < arunners.Length; i++)
                                    {
                                        var arunn = arunners[i];
                                        if (string.IsNullOrEmpty(arunn))
                                        {
                                            continue;
                                        }
                                        int idRunner = Convert.ToInt32(arunn);
                                        if (!runnerToTeamMap.ContainsKey(idRunner))
                                        {
                                            runnerToTeamMap.Add(idRunner, id);
                                        }
                                        else
                                        {
                                            runnerToTeamMap[idRunner] = id;
                                        }

                                        if (!runnerLeg.ContainsKey(idRunner))
                                        {
                                            runnerLeg.Add(idRunner, i + 1);
                                        }
                                        else
                                        {
                                            runnerLeg[idRunner] = i + 1;
                                        }
                                    }
                                }

                                reader.Close();
                            }

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

                                try
                                {
                                    int counter = Convert.ToInt32(reader["counter"]);
                                    lastCounter = counter > lastCounter ? counter : lastCounter;
                                    runnerID    = Convert.ToInt32(reader["id"]);

                                    int teamId = runnerToTeamMap[runnerID];

                                    time       = -9;
                                    iStartTime = m_isRelay ? teamStarttimes[teamId] : -1;
                                    if (m_isRelay)
                                    {
                                        if (reader["finishtime"] != null && reader["finishtime"] != DBNull.Value && Convert.ToInt32(reader["finishtime"]) > 0)
                                        {
                                            time = (Convert.ToInt32(reader["finishtime"]) + zeroTime) * 100 - iStartTime;
                                        }
                                    }

                                    runnerName = reader["name"] as string;

                                    lastRunner = runnerName;

                                    club   = m_isRelay ? teamNames[teamId] : (reader["clubname"] as string);
                                    classN = (reader["classname"] as string);
                                    if (m_isRelay)
                                    {
                                        classN += "-" + runnerLeg[runnerID];
                                    }
                                    status = Convert.ToInt32(reader["status"]);
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }


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

                                case 1:     //OK
                                    rstatus = 0;
                                    break;

                                case 20:
                                case 2:     //Ej start
                                    rstatus = 1;
                                    break;

                                case 3:     //Felst.
                                    rstatus = 3;
                                    break;

                                case 4:     //Utgått.
                                    rstatus = 3;
                                    break;

                                case 5:     //Dsq.
                                    rstatus = 4;
                                    break;

                                case 6:     //Maxtid.
                                    rstatus = 4;
                                    break;

                                case 99:
                                case 7:     //Deltar ej.
                                    rstatus = 999;
                                    break;

                                default:
                                    rstatus = 3;
                                    Debug.WriteLine("Unknwon status: " + status);
                                    break;
                                }

                                if (m_isRelay)
                                {
                                    int teamId = runnerToTeamMap[runnerID];
                                    if (!teamStatus.ContainsKey(teamId))
                                    {
                                        teamStatus.Add(teamId, new int[4]);
                                        teamStatus[teamId][runnerLeg[runnerID] - 1] = rstatus;
                                    }
                                    else
                                    {
                                        if (teamStatus[teamId].Any(x => x > 0))
                                        {
                                            rstatus = teamStatus[teamId].First(x => x > 0);
                                        }


                                        teamStatus[teamId][runnerLeg[runnerID] - 1] = rstatus;
                                    }
                                }



                                if (rstatus != 999)
                                {
                                    var res = new Result
                                    {
                                        ID         = runnerID,
                                        RunnerName = runnerName,
                                        RunnerClub = club,
                                        Class      = classN,
                                        StartTime  = iStartTime,
                                        Time       = time,
                                        Status     = rstatus
                                    };

                                    FireOnResult(res);
                                }
                            }
                            reader.Close();

                            reader = cmdSplits.ExecuteReader();
                            while (reader.Read())
                            {
                                try
                                {
                                    int counter = Convert.ToInt32(reader["counter"]);
                                    lastSplitCounter = (counter > lastSplitCounter ? counter : lastSplitCounter);

                                    int runnerID = Convert.ToInt32(reader["id"]);

                                    int time       = Convert.ToInt32(reader["time"]);
                                    int iStartTime = 0;
                                    if (m_isRelay)
                                    {
                                        int teamId = runnerToTeamMap[runnerID];
                                        iStartTime = teamStarttimes[teamId];
                                    }
                                    else
                                    {
                                        if (reader["starttime"] != null && reader["starttime"] != DBNull.Value)
                                        {
                                            iStartTime = Convert.ToInt32(reader["starttime"]) * 100 + zeroTime * 100;
                                            //time = (Convert.ToInt32(reader["finishtime"]) - Convert.ToInt32(reader["starttime"])) * 100;
                                        }
                                        else
                                        {
                                            continue;
                                        }
                                    }
                                    time = (time * 100 + zeroTime * 100) - iStartTime;
                                    string runnerName = reader["name"] as string;

                                    lastRunner = runnerName;

                                    string club   = m_isRelay ? "" : (reader["clubname"] as string);
                                    string classN = (reader["classname"] as string);
                                    if (m_isRelay)
                                    {
                                        int teamId = runnerToTeamMap[runnerID];
                                        club    = teamNames[teamId];
                                        classN += "-" + runnerLeg[runnerID];
                                    }

                                    int sCont = Convert.ToInt32(reader["Type"]);


                                    int passedCount = 1; //Convert.ToInt32(reader["passedCount"].ToString());

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

                                    var res = new Result
                                    {
                                        ID         = runnerID,
                                        RunnerName = runnerName,
                                        RunnerClub = club,
                                        Class      = classN,
                                        StartTime  = iStartTime,
                                        Time       = -2,
                                        Status     = 0,
                                        SplitTimes = times
                                    };
                                    FireOnResult(res);
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }
                            }

                            reader.Close();

                            Thread.Sleep(1000);
                        }
                        catch (Exception ee)
                        {
                            if (reader != null)
                            {
                                reader.Close();
                            }
                            FireLogMsg("MeoS 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("MeOs Parser: " + ee.Message);
                }
                finally
                {
                    if (m_connection != null)
                    {
                        m_connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("OLA Monitor thread stopped");
                }
            }
        }
Beispiel #4
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");
                }
            }
        }
Beispiel #5
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");
                }
            }
        }
Beispiel #6
0
        public void AnalyzeFile(string filename)
        {
            System.IO.StreamReader sr =null;
            try
            {
                for (int i = 0; i < 30; i++)
                {
                    try
                    {
                        sr = new System.IO.StreamReader(filename, Encoding.Default);
                        break;
                    }
                    catch (Exception ee)
                    {
                        System.Diagnostics.Debug.WriteLine(ee.Message);
                    }
                }
                if (sr == null)
                    throw new ApplicationException("Could not open input file, copy error?");
                string header = sr.ReadLine();

                string[] fields = header.Split(SplitChars);

                /*Detect OE format*/
                int fldID, fldSI, fldFName, fldEName, fldClub, fldClass, fldStart, fldTime, fldStatus, fldFirstPost, fldText1, fldText2, fldText3, fldFinish, fldLeg;
                int fldTotalTime;
                OxTools.DetectOxCSVFormat(OxTools.SourceProgram.OE, fields, out fldID, out fldSI, out fldFName, out fldEName, out fldClub, out fldClass, out fldStart, out fldTime, out fldStatus, out fldFirstPost, out fldLeg, out fldFinish, out fldText1, out fldText2, out fldText3, out fldTotalTime);

                if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1
               || fldStart == -1 || fldTime == -1
               || fldStart == -1 || fldFirstPost == -1)
                {
                    throw new System.IO.IOException("Not OE-formatted file!");
                }

                fldText1 = Array.IndexOf(fields, "Text1");
                fldText2 = Array.IndexOf(fields, "Text2");
                fldText3 = Array.IndexOf(fields, "Text3");

                if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1
                    || fldStart == -1 || fldTime == -1)
                    throw new System.IO.IOException("Not OE-formatted file!");

                string tmp;
                while ((tmp = sr.ReadLine()) != null)
                {
                    string[] parts = tmp.Split(SplitChars);

                    /* check so that the line is not incomplete*/

                    int id;
                    if (!int.TryParse(parts[fldID], NumberStyles.Any, CultureInfo.InvariantCulture,out id))
                    {
                        FireLogMsg("Error: Could not use \"" + parts[fldID] + "\" as ID for runner " + parts[fldFName] + " " + parts[fldEName] +
                                           " - Skipping!, value taken from field: " + fields[fldID]);
                        continue;
                    }
                    string name = parts[fldFName].Trim('\"') + " " + parts[fldEName].Trim('\"');
                    string club = parts[fldClub].Trim('\"');
                    string Class = parts[fldClass].Trim('\"');
                    int start = strTimeToInt(parts[fldStart]);
                    int time = strTimeToInt(parts[fldTime]);

                    int status = 0;
                    try
                    {
                        status = Convert.ToInt32(parts[fldStatus]);
                    }
                    catch (Exception ee)
                    {
                        FireLogMsg("Could not use status " + parts[fldStatus] + " for runner " + name + ", assuming status 0");
                    }

                    List<ResultStruct> splittimes = new List<ResultStruct>();
                    /*parse splittimes*/
                    List<int> codes = new List<int>();
                    if (fldFirstPost >= 0)
                    {
                        for (int i = fldFirstPost; i < parts.Length - 4; i++)
                        {
                            if (parts[i + 1].Length == 0
                                || parts[i + 2].Length == 0)
                            {
                                i += 3;
                                continue;
                            }
                            ResultStruct s = new ResultStruct();
                            try
                            {
                                //s.ControlNo = Convert.ToInt32(parts[i]);
                                i++;
                                s.ControlCode = Convert.ToInt32(parts[i]);

                                if (s.ControlCode == 999)
                                {
                                    i++;
                                    if (time == -1 && status == 0)
                                        time = strTimeToInt(parts[i]);

                                    i++;
                                }
                                else
                                {
                                    s.ControlCode += 1000;
                                    while (codes.Contains(s.ControlCode))
                                    {
                                        s.ControlCode += 1000;
                                    }
                                    codes.Add(s.ControlCode);

                                    i++;
                                    s.Time = strTimeToInt(parts[i]);
                                    i++;

                                    if (s.Time > 0)
                                    {
                                        s.Place = 0;
                                        try
                                        {
                                            s.Place = Convert.ToInt32(parts[i]);
                                        }
                                        catch
                                        { }

                                        splittimes.Add(s);
                                    }
                                }
                            }
                            catch
                            {
                            }

                        }
                    }
                    FireOnResult(new Result()
                    {
                        ID = id,
                        RunnerName = name,
                        RunnerClub = club,
                        Class = Class,
                        StartTime = start,
                        Time = time,
                        Status = status,
                        SplitTimes = splittimes
                    });
                }
            }
            catch (Exception ee)
            {
                FireLogMsg("ERROR in OEPArser: " + ee.Message);
            }
            finally
            {
                if (sr != null)
                    sr.Close();
            }
        }
Beispiel #7
0
        public void AnalyzeFile(string filename)
        {
            System.IO.StreamReader sr = null;
            try
            {
                for (int i = 0; i < 30; i++)
                {
                    try
                    {
                        sr = new System.IO.StreamReader(filename, Encoding.Default);
                        break;
                    }
                    catch (Exception ee)
                    {
                        System.Diagnostics.Debug.WriteLine(ee.Message);
                        System.Threading.Thread.Sleep(1000);
                    }
                }
                if (sr == null)
                {
                    throw new ApplicationException("Could not open input file, copy error?");
                }
                string header = sr.ReadLine();

                string[] fields        = header.Split(SplitChars);
                bool     isOs2010Files = fields[0].StartsWith("OS");

                /*Detect OS format*/
                int fldID;
                int fldSI;
                int fldFName;
                int fldEName;
                int fldClub;
                int fldClass;
                int fldStart;
                int fldTime;
                int fldStatus;
                int fldFirstPost;
                int fldLeg;
                int fldFinish;
                int fldTxt1, fldTxt2, fldTxt3;
                int fldTotalTime;
                OXTools.DetectOXCSVFormat(OXTools.SourceProgram.OS, fields, out fldID, out fldSI, out fldFName, out fldEName, out fldClub, out fldClass, out fldStart, out fldTime, out fldStatus, out fldFirstPost, out fldLeg, out fldFinish, out fldTxt1, out fldTxt2, out fldTxt3, out fldTotalTime);

                if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1 ||
                    fldStart == -1 || fldTime == -1 ||
                    fldStart == -1 || fldFirstPost == -1 || fldLeg == -1)
                {
                    throw new System.IO.IOException("Not OS-formatted file!");
                }

                string tmp;
                Dictionary <string, int> teamStartTimes = new Dictionary <string, int>();
                Dictionary <string, int> teamStatuses   = new Dictionary <string, int>();
                while ((tmp = sr.ReadLine()) != null)
                {
                    string[] parts = tmp.Split(SplitChars);

                    /* check so that the line is not incomplete*/
                    int id = Convert.ToInt32(parts[fldLeg]) * 1000000 + Convert.ToInt32(parts[fldID]);
                    int si = 0;
                    try
                    {
                        si = Convert.ToInt32(parts[fldSI]);
                    }
                    catch (Exception ee)
                    { }
                    string name  = parts[fldFName].Trim('\"') + " " + parts[fldEName].Trim('\"');
                    string club  = parts[fldClub].Trim('\"');
                    string Class = parts[fldClass].Trim('\"') + "-" + parts[fldLeg].Trim('\"');
                    int    leg   = Convert.ToInt32(parts[fldLeg].Trim('\"'));
                    int    start = strTimeToInt(parts[fldStart]);
                    int    time  = strTimeToInt(parts[fldTime]);

                    int status = 9;
                    try
                    {
                        status = Convert.ToInt32(parts[fldStatus]);
                        if (status == 0 && time < 0)
                        {
                            status = 9;
                        }
                    }
                    catch
                    {
                    }

                    int totalTime   = -1;
                    int totalStatus = status;

                    if (isOs2010Files)
                    {
                        if (fldTotalTime != -1)
                        {
                            //OK We have a totaltimefield..
                            //If totaltime set, use it as time (and status is status)
                            //Else, check if runner on course (status == 0 and FinishTime is empty => Status = 9)
                            //Else, something is not right, set status if <> 0, else set mp

                            if (!string.IsNullOrEmpty(parts[fldTotalTime]))
                            {
                                totalTime = strTimeToInt(parts[fldTotalTime]);
                            }
                            else if (status == 9)
                            {
                                //Runner still on course
                            }
                            else
                            {
                                totalStatus = status != 0 ? status : 3;
                                totalTime   = -3;
                            }
                        }
                        else
                        {
                            string key = parts[fldClass].Trim('\"') + ";" + club;
                            if (!teamStartTimes.ContainsKey(key))
                            {
                                teamStartTimes.Add(key, start);
                            }
                            else if (teamStartTimes[key] > start)
                            {
                                teamStartTimes[key] = start;
                            }

                            if (teamStatuses.ContainsKey(key))
                            {
                                int earlierStatus = teamStatuses[key];
                                if (status == 0 && earlierStatus != 0)
                                {
                                    totalStatus = earlierStatus;
                                }
                            }
                            else if (status != 0)
                            {
                                teamStatuses.Add(key, status);
                            }

                            if (time >= 0)
                            {
                                totalTime = strTimeToInt(parts[fldFinish]) - teamStartTimes[key];
                            }
                        }
                    }



                    List <ResultStruct> splittimes = new List <ResultStruct>();
                    /*parse splittimes*/
                    List <int> codes = new List <int>();
                    for (int i = fldFirstPost; i < parts.Length - 4; i++)
                    {
                        if (parts[i + 1].Length == 0 ||
                            parts[i + 2].Length == 0)
                        {
                            i += 3;
                            continue;
                        }
                        ResultStruct s = new ResultStruct();
                        try
                        {
                            i++;
                            s.ControlCode = Convert.ToInt32(parts[i]);

                            if (s.ControlCode == 999 && status == 0)
                            {
                                i++;
                                if (time == -1)
                                {
                                    time = strTimeToInt(parts[i]);
                                }
                                i++;
                            }
                            else
                            {
                                s.ControlCode += 1000;
                                while (codes.Contains(s.ControlCode))
                                {
                                    s.ControlCode += 1000;
                                }
                                codes.Add(s.ControlCode);
                                i++;
                                s.Time = strTimeToInt(parts[i]);
                                i++;
                                s.Place = 0;
                                try
                                {
                                    s.Place = Convert.ToInt32(parts[i]);
                                }
                                catch
                                { }

                                splittimes.Add(s);
                            }
                        }
                        catch
                        {
                        }
                    }
                    FireOnResult(new RelayResult()
                    {
                        ID            = id,
                        LegNumber     = leg,
                        RunnerName    = name,
                        RunnerClub    = club,
                        Class         = Class,
                        StartTime     = start,
                        Time          = time,
                        Status        = status,
                        SplitTimes    = splittimes,
                        OverallTime   = totalTime,
                        OverallStatus = totalStatus
                    });
                }
            }
            catch (Exception ee)
            {
                FireLogMsg("ERROR in OSParser: " + ee.Message);
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                }
            }
        }
Beispiel #8
0
        private void ParseOSResultFilt(string[] fields, StreamReader sr, bool isOs2010Files)
        {
            /*Detect OS format*/
            int fldID;
            int fldSI;
            int fldFName;
            int fldEName;
            int fldClub;
            int fldClass;
            int fldStart;
            int fldTime;
            int fldStatus;
            int fldFirstPost;
            int fldLeg;
            int fldFinish;
            int fldTxt1, fldTxt2, fldTxt3;
            int fldTotalTime;
            OxTools.DetectOxCSVFormat(OxTools.SourceProgram.OS, fields, out fldID, out fldSI, out fldFName, out fldEName, out fldClub, out fldClass, out fldStart,
                out fldTime, out fldStatus, out fldFirstPost, out fldLeg, out fldFinish, out fldTxt1, out fldTxt2, out fldTxt3, out fldTotalTime);

            if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1
                || fldStart == -1 || fldTime == -1
                || fldStart == -1 || fldFirstPost == -1 || fldLeg == -1)
            {
                throw new IOException("Not OS-formatted file!");
            }

            string tmp;
            var teamStartTimes = new Dictionary<string, int>();
            var teamStatuses = new Dictionary<string, int>();
            while ((tmp = sr.ReadLine()) != null)
            {
                string[] parts = tmp.Split(SplitChars);

                /* check so that the line is not incomplete*/
                int id = CreateID(Convert.ToInt32(parts[fldLeg]), Convert.ToInt32(parts[fldID]));

                string name = parts[fldFName].Trim('\"') + " " + parts[fldEName].Trim('\"');
                string club = parts[fldClub].Trim('\"');
                string Class = parts[fldClass].Trim('\"') + "-" + parts[fldLeg].Trim('\"');
                int leg = Convert.ToInt32(parts[fldLeg].Trim('\"'));
                int start = strTimeToInt(parts[fldStart]);
                int time = strTimeToInt(parts[fldTime]);

                int status = 9;
                try
                {
                    status = Convert.ToInt32(parts[fldStatus]);
                    if (status == 0 && time < 0)
                    {
                        status = 9;
                    }
                }
                catch
                {
                }

                int totalTime = -1;
                int totalStatus = status;

                if (isOs2010Files)
                {
                    if (fldTotalTime != -1)
                    {
                        //OK We have a totaltimefield..
                        //If totaltime set, use it as time (and status is status)
                        //Else, check if runner on course (status == 0 and FinishTime is empty => Status = 9)
                        //Else, something is not right, set status if <> 0, else set mp

                        if (!string.IsNullOrEmpty(parts[fldTotalTime]))
                        {
                            totalTime = strTimeToInt(parts[fldTotalTime]);
                        }
                        else if (status == 9)
                        {
                            //Runner still on course
                        }
                        else
                        {
                            totalStatus = status != 0 ? status : 3;
                            totalTime = -3;
                        }
                    }
                    else
                    {
                        string key = parts[fldClass].Trim('\"') + ";" + club;
                        if (!teamStartTimes.ContainsKey(key))
                        {
                            teamStartTimes.Add(key, start);
                        }
                        else if (teamStartTimes[key] > start)
                        {
                            teamStartTimes[key] = start;
                        }

                        if (teamStatuses.ContainsKey(key))
                        {
                            int earlierStatus = teamStatuses[key];
                            if (status == 0 && earlierStatus != 0)
                            {
                                totalStatus = earlierStatus;
                            }
                        }
                        else if (status != 0)
                        {
                            teamStatuses.Add(key, status);
                        }

                        if (time >= 0)
                        {
                            totalTime = strTimeToInt(parts[fldFinish]) - teamStartTimes[key];
                        }
                    }
                }

                var splittimes = new List<ResultStruct>();
                /*parse splittimes*/
                var codes = new List<int>();
                for (int i = fldFirstPost; i < parts.Length - 4; i++)
                {
                    if (parts[i + 1].Length == 0
                        || parts[i + 2].Length == 0)
                    {
                        i += 3;
                        continue;
                    }
                    var s = new ResultStruct();
                    try
                    {
                        i++;
                        s.ControlCode = Convert.ToInt32(parts[i]);

                        if (s.ControlCode == 999 && (status == 0 || status == 9))
                        {
                            i++;
                            if (totalTime == -1 || totalTime== -9)
                            {
                                totalTime = strTimeToInt(parts[i]);
                            }
                            i++;
                        }
                        else
                        {
                            s.ControlCode += 1000;
                            while (codes.Contains(s.ControlCode))
                            {
                                s.ControlCode += 1000;
                            }
                            codes.Add(s.ControlCode);
                            i++;
                            s.Time = strTimeToInt(parts[i]);
                            i++;
                            s.Place = 0;
                            try
                            {
                                s.Place = Convert.ToInt32(parts[i]);
                            }
                            catch
                            {
                            }

                            splittimes.Add(s);
                        }
                    }
                    catch
                    {
                    }
                }
                FireOnResult(new RelayResult{
                    ID = id,
                    LegNumber = leg,
                    RunnerName = name,
                    RunnerClub = club,
                    Class = Class,
                    StartTime = start,
                    Time = time,
                    Status = status,
                    SplitTimes = splittimes,
                    OverallTime = totalTime,
                    OverallStatus = totalStatus
                });
            }
        }
Beispiel #9
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");

                }
            }
        }
Beispiel #10
0
        private void Run()
        {
            while (m_continue)
            {
                try
                {
                    if (m_connection.State != ConnectionState.Open)
                    {
                        m_connection.Open();
                    }

                    SQLiteCommand cmd = m_connection.CreateCommand();
                    // Get time to start from
                    cmd.CommandText = "SELECT startreadfromtime FROM settings WHERE setting_id=1";
                    SQLiteDataReader reader = cmd.ExecuteReader();
                    reader.Read();
                    DateTime lastDateTime = (DateTime)reader["startreadfromtime"]; // reader.GetDateTime(reader.GetOrdinal("startreadfromtime"));
                    reader.Close();

                    string paramOper   = "@date";
                    string baseCommand = "SELECT etappresults.changed, etappresults.idrunners, etappnr, totaltid, totalstatus, predictionstarttime, name, club, class FROM etappresults, runners WHERE etappresults.idrunners = runners.idrunners AND etappresults.changed > " + paramOper;

                    ReadRadioControls();

                    cmd.CommandText = baseCommand;
                    IDbDataParameter param = cmd.CreateParameter();
                    param.ParameterName = "date";
                    param.DbType        = DbType.String;
                    //param.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    //param.DbType = DbType.DateTime;
                    //param.Value = DateTime.Now;

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

                    cmd.Parameters.Add(param);

                    FireLogMsg("Total Monitor thread started");
                    //SQLiteDataReader reader = null;
                    var runnerPairs = new Dictionary <int, RunnerPair>();
                    while (m_continue)
                    {
                        string lastRunner = "";
                        try
                        {
                            /*Kontrollera om nya klasser*/
                            /*Kontrollera om nya resultat*/
                            (cmd.Parameters["date"] as IDbDataParameter).Value = lastDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
                            //(cmd.Parameters["date"] as IDbDataParameter).Value = lastDateTime;

                            cmd.Prepare();
                            reader = cmd.ExecuteReader();
                            while (reader.Read())
                            {
                                int    time = 0, runnerID = 0, iStartTime = 0, status = -1, etappnr = 0;
                                string name = "", club = "", classN = "";

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

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

                                    name = (reader["name"] as string);

                                    club       = (reader["club"] as string);
                                    classN     = (reader["class"] as string);
                                    status     = Convert.ToInt32(reader["totalstatus"]);
                                    etappnr    = Convert.ToInt32(reader["etappnr"]);
                                    iStartTime = Convert.ToInt32(reader["predictionstarttime"]);
                                }
                                catch (Exception ee)
                                {
                                    FireLogMsg(ee.Message);
                                }


                                /*
                                 *  time is seconds * 100
                                 */

                                if (status != 999)
                                {
                                    if (etappnr == m_nrStages)
                                    {
                                        var res = new Result
                                        {
                                            ID         = runnerID,
                                            RunnerName = name,
                                            RunnerClub = club,
                                            Class      = classN,
                                            StartTime  = iStartTime,
                                            Time       = time,
                                            Status     = status
                                        };

                                        FireOnResult(res);
                                    }
                                    else
                                    {
                                        var times = new List <ResultStruct>();
                                        var t     = new ResultStruct
                                        {
                                            ControlCode = etappnr + 1000,
                                            ControlNo   = etappnr,
                                            Time        = (int)time
                                        };
                                        if (time > 0 && status == 0)
                                        {
                                            times.Add(t);     // Lägg bara till mellantider om status är ok
                                        }
                                        int settotaltime = 0; // Add status already now

                                        if (status == 0)
                                        {
                                            status = 9;              // If status is OK then we set it to "Started" as status for last day is not known.
                                        }
                                        var res = new Result
                                        {
                                            ID         = runnerID,
                                            RunnerName = name,
                                            RunnerClub = club,
                                            Class      = classN,
                                            StartTime  = iStartTime,
                                            Time       = settotaltime,
                                            Status     = status,
                                            SplitTimes = times
                                        };


                                        FireOnResult(res);
                                    }
                                }
                            }
                            reader.Close();


                            Thread.Sleep(1000);
                        }
                        catch (Exception ee)
                        {
                            if (reader != null)
                            {
                                reader.Close();
                            }
                            FireLogMsg("Total 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;
                            }
                        }
                    }

                    // Save datetime to avoid reading same data again
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@startreadfromtime", lastDateTime);
                    cmd.CommandText = "UPDATE settings SET startreadfromtime=@startreadfromtime WHERE setting_id=1";
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ee)
                {
                    FireLogMsg("Total Parser: " + ee.Message);
                }
                finally
                {
                    if (m_connection != null)
                    {
                        m_connection.Close();
                    }
                    FireLogMsg("Disconnected");
                    FireLogMsg("Total Monitor thread stopped");
                }
            }
        }
Beispiel #11
0
        private void run()
        {
            while (m_Continue)
            {
                try
                {
                    if (m_Connection.State != System.Data.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;

                    string form    = cmd.ExecuteScalar() as string;
                    bool   isRelay = false;

                    if (form.ToLower().Contains("relay"))
                    {
                        isRelay = true;
                    }

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

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

                    bool isOla5 = version >= 500;


                    string baseCommand      = "select results.modifyDate, results.totalTime, results.position, persons.familyname as lastname, persons.firstname as firstname, clubs.name as clubname, eventclasses.shortName, results.runnerStatus, results.entryid, results.allocatedStartTime, results.starttime from results, entries, Persons, Clubs, 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.clubid = clubs.clubid and results.runnerStatus != 'notActivated'  and results.modifyDate > " + paramOper;
                    string splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.entryid, results.allocatedStartTime, persons.familyname as lastname, persons.firstname as firstname, clubs.name as clubname, eventclasses.shortName, splittimes.passedCount from splittimes, results, SplitTimeControls, Controls, eventClasses, raceClasses, Persons, Clubs, 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.clubid = clubs.clubid and splitTimes.modifyDate > " + paramOper;
                    if (isOla5)
                    {
                        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;
                        splitbaseCommand = "select splittimes.modifyDate, splittimes.passedTime, Controls.ID, results.entryid, results.allocatedStartTime, results.starttime, persons.familyname as lastname, persons.firstname as firstname, organisations.name 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;
                    }

                    if (isRelay)
                    {
                        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, (select firststarttime from raceclasses rc where rc.eventClassId = eventclasses.EventClassID and rc.relayleg=1 and rc.eventRaceId = " + m_EventRaceId + ") as firststarttime 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;
                        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, (select firststarttime from raceclasses rc where rc.eventClassId = eventclasses.EventClassID and rc.relayleg=1 and rc.eventRaceId = " + m_EventRaceId + ") as firststarttime  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;
                    }

                    cmd.CommandText = baseCommand;                       //new OleDbCommand(baseCommand, m_Connection);
                    IDbCommand cmdSplits = m_Connection.CreateCommand(); // new OleDbCommand(splitbaseCommand, m_Connection);
                    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;
                    Dictionary <int, RunnerPair> 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;
                            }


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

                                try
                                {
                                    //modDate = Convert.ToDateTime(reader[0]);
                                    string sModDate = Convert.ToString(reader[0]);
                                    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);
                                    }

                                    if (isRelay)
                                    {
                                        classN = classN + "-" + Convert.ToString(reader["relayLeg"]);
                                        if (reader["finishTime"] != DBNull.Value)
                                        {
                                            DateTime ft = ParseDateTime(reader["finishTime"].ToString());

                                            if (reader["firststarttime"] != DBNull.Value)
                                            {
                                                DateTime ast = ParseDateTime(reader["firststarttime"].ToString());
                                                time = (int)(((TimeSpan)(ft - ast)).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)
                                {
                                    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;
                                    List <ResultStruct> times = new List <ResultStruct>();
                                    ResultStruct        t     = new ResultStruct();
                                    t.ControlCode = sCont + 1000 * passedCount;
                                    t.ControlNo   = 0;
                                    t.Time        = (int)time;
                                    times.Add(t);

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

                                    string club   = reader["clubname"] as string;  //.GetString(5);
                                    string classn = reader["shortname"] as string; // reader.GetString(6);

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

                                    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();

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

                            System.Threading.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");
                }
            }
        }
Beispiel #12
0
        private void ParseOSResultFilt(string[] fields, StreamReader sr, bool isOs2010Files)
        {
            /*Detect OS format*/
            int fldID;
            int fldSI;
            int fldFName;
            int fldEName;
            int fldClub;
            int fldClass;
            int fldStart;
            int fldTime;
            int fldStatus;
            int fldFirstPost;
            int fldLeg;
            int fldFinish;
            int fldTxt1, fldTxt2, fldTxt3;
            int fldTotalTime;

            OxTools.DetectOxCSVFormat(OxTools.SourceProgram.OS, fields, out fldID, out fldSI, out fldFName, out fldEName, out fldClub, out fldClass, out fldStart,
                                      out fldTime, out fldStatus, out fldFirstPost, out fldLeg, out fldFinish, out fldTxt1, out fldTxt2, out fldTxt3, out fldTotalTime);

            if (fldID == -1 || fldSI == -1 || fldFName == -1 || fldEName == -1 || fldClub == -1 || fldClass == -1 ||
                fldStart == -1 || fldTime == -1 ||
                fldStart == -1 || fldFirstPost == -1 || fldLeg == -1)
            {
                throw new IOException("Not OS-formatted file!");
            }

            string tmp;
            var    teamStartTimes = new Dictionary <string, int>();
            var    teamStatuses   = new Dictionary <string, int>();

            while ((tmp = sr.ReadLine()) != null)
            {
                string[] parts = tmp.Split(SplitChars);

                /* check so that the line is not incomplete*/
                int id = CreateID(Convert.ToInt32(parts[fldLeg]), Convert.ToInt32(parts[fldID]));

                string name  = parts[fldFName].Trim('\"') + " " + parts[fldEName].Trim('\"');
                string club  = parts[fldClub].Trim('\"');
                string Class = parts[fldClass].Trim('\"') + "-" + parts[fldLeg].Trim('\"');
                int    leg   = Convert.ToInt32(parts[fldLeg].Trim('\"'));
                int    start = strTimeToInt(parts[fldStart]);
                int    time  = strTimeToInt(parts[fldTime]);

                int status = 9;
                try
                {
                    status = Convert.ToInt32(parts[fldStatus]);
                    if (status == 0 && time < 0)
                    {
                        status = 9;
                    }
                }
                catch
                {
                }

                int totalTime   = -1;
                int totalStatus = status;

                if (isOs2010Files)
                {
                    if (fldTotalTime != -1)
                    {
                        //OK We have a totaltimefield..
                        //If totaltime set, use it as time (and status is status)
                        //Else, check if runner on course (status == 0 and FinishTime is empty => Status = 9)
                        //Else, something is not right, set status if <> 0, else set mp

                        if (!string.IsNullOrEmpty(parts[fldTotalTime]))
                        {
                            totalTime = strTimeToInt(parts[fldTotalTime]);
                        }
                        else if (status == 9)
                        {
                            //Runner still on course
                        }
                        else
                        {
                            totalStatus = status != 0 ? status : 3;
                            totalTime   = -3;
                        }
                    }
                    else
                    {
                        string key = parts[fldClass].Trim('\"') + ";" + club;
                        if (!teamStartTimes.ContainsKey(key))
                        {
                            teamStartTimes.Add(key, start);
                        }
                        else if (teamStartTimes[key] > start)
                        {
                            teamStartTimes[key] = start;
                        }

                        if (teamStatuses.ContainsKey(key))
                        {
                            int earlierStatus = teamStatuses[key];
                            if (status == 0 && earlierStatus != 0)
                            {
                                totalStatus = earlierStatus;
                            }
                        }
                        else if (status != 0)
                        {
                            teamStatuses.Add(key, status);
                        }

                        if (time >= 0)
                        {
                            totalTime = strTimeToInt(parts[fldFinish]) - teamStartTimes[key];
                        }
                    }
                }


                var splittimes = new List <ResultStruct>();
                /*parse splittimes*/
                var codes = new List <int>();
                for (int i = fldFirstPost; i < parts.Length - 4; i++)
                {
                    if (parts[i + 1].Length == 0 ||
                        parts[i + 2].Length == 0)
                    {
                        i += 3;
                        continue;
                    }
                    var s = new ResultStruct();
                    try
                    {
                        i++;
                        s.ControlCode = Convert.ToInt32(parts[i]);

                        if (s.ControlCode == 999 && (status == 0 || status == 9))
                        {
                            i++;
                            if (totalTime == -1 || totalTime == -9)
                            {
                                totalTime = strTimeToInt(parts[i]);
                            }
                            i++;
                        }
                        else
                        {
                            s.ControlCode += 1000;
                            while (codes.Contains(s.ControlCode))
                            {
                                s.ControlCode += 1000;
                            }
                            codes.Add(s.ControlCode);
                            i++;
                            s.Time = strTimeToInt(parts[i]);
                            i++;
                            s.Place = 0;
                            try
                            {
                                s.Place = Convert.ToInt32(parts[i]);
                            }
                            catch
                            {
                            }

                            splittimes.Add(s);
                        }
                    }
                    catch
                    {
                    }
                }
                FireOnResult(new RelayResult {
                    ID            = id,
                    LegNumber     = leg,
                    RunnerName    = name,
                    RunnerClub    = club,
                    Class         = Class,
                    StartTime     = start,
                    Time          = time,
                    Status        = status,
                    SplitTimes    = splittimes,
                    OverallTime   = totalTime,
                    OverallStatus = totalStatus
                });
            }
        }