Example #1
0
        /// <summary>
        /// Zoeken naar locatie
        /// </summary>
        /// <param name="archiveDir">Map Den Haag Archief</param>
        /// <param name="vri">kruispuntnummer </param>
        /// <param name="tSearch">tijdstip waarnaar gezocht wordt</param>
        /// <param name="mode">indien de tijdreferentie niet exact gevonden wordt, wordt de eerste tijdreferentie voor of na gezocht</param>
        /// <returns></returns>
        public static TimeRefLocation FindTimeRefLocation(string archiveDir, string vri, DateTime tSearch, findMode mode)
        {
            TimeRefLocation result = new TimeRefLocation();

            TimeRefFindResult trlFindRes = FindTimeRefs(archiveDir, vri, tSearch);

            if (mode == findMode.before)
            {
                if (trlFindRes.TrlBefore.Valid)
                {
                    //tijdreferentie gevonden op of voor de gewenste tijd
                    result = trlFindRes.TrlBefore;
                }
                else if (trlFindRes.TrlAfter.Valid)
                {
                    //alleen na de gewenste tijd een tijdreferentie gevonden
                    result = trlFindRes.TrlAfter;
                }
                else
                {
                    //helemaal geen tijdreferenties gevonden: dan als beginpunt het gewenste tijdstip gebruiken
                    result.Valid  = true;
                    result.DtFile = tSearch;
                    //begin.DtTimeRefVLog leeg laten: deze is niet beschikbaar
                }
            }
            else//find == after
            {
                if (trlFindRes.TrlAfter.Valid)
                {
                    //tijdreferentie gevonden op of na de gewenste tijd
                    result = trlFindRes.TrlAfter;
                }
                else if (trlFindRes.TrlBefore.Valid)
                {
                    //alleen voor de gewenste tijd een tijdreferentie gevonden
                    result = trlFindRes.TrlBefore;
                }
                else
                {
                    //helemaal geen tijdreferenties gevonden: dan als eindpunt het gewenste tijdstip gebruiken
                    result.Valid  = true;
                    result.DtFile = tSearch;
                    //end.DtTimeRefVLog leeg laten: deze is niet beschikbaar
                }
            }

            return(result);
        }
Example #2
0
        /// <summary>
        /// Zoekt naar de tijdreferentieberichten in het Den Haag archief.
        /// </summary>
        /// <param name="archiveDir">Map Den Haag Archief</param>
        /// <param name="vri">Kruispuntnummer</param>
        /// <param name="tSearch">Te zoeken tijdstip</param>
        /// <param name="maxOffsetHours">Maximaal aantal uren dat vooruit of terug in de tijd mag worden gezocht</param>
        /// <returns>Twee gevonden tijdreferenties: één voor op op het gewenste moment, één na of op het gewenste moment</returns>
        public static TimeRefFindResult FindTimeRefs(string archiveDir, string vri, DateTime tSearch, int maxOffsetHours = 26)
        {
            stateTimeRefs _state = stateTimeRefs.nothingFound;

            //zoekt naar eerste V-Log tijdreferentie die op of net voor 'moment' ligt
            TimeRefFindResult result = new TimeRefFindResult();

            TimeRefLocation trlBefore = new TimeRefLocation();
            TimeRefLocation trlAfter  = new TimeRefLocation();

            bool negativeOffsetSearched = false; //actief als er van 0 tot offset -max is doorzocht en geen tijdrefs zijn aangetroffen.
            bool ready = false;
            bool searchPreviousFile = false;
            bool searchNextFile     = false;

            int offsetFile = 0; //welk uurbestand bekeken moet worden

            //het eerste te doorzoeken bestand komt overeen met waar de data verwacht wordt
            DateTime fileBase = new DateTime(tSearch.Year, tSearch.Month, tSearch.Day, tSearch.Hour, 0, 0); //bestanden op hele uren gebaseerd

            while (!ready)
            {
                //bestand bepalen
                DateTime dtFile = fileBase.AddHours(offsetFile);

                //tijdreferenties inlezen
                DateTime[] timerefs = FindAllTimeRefs(archiveDir, vri, dtFile);

                if (timerefs.Length == 0)
                {
                    //geen tijdreferenties gevonden in bestand of geen bestand
                    if (_state == stateTimeRefs.nothingFound)
                    {
                        if (!negativeOffsetSearched)
                        {
                            searchPreviousFile = true;
                        }
                        else
                        {
                            searchNextFile = true;
                        }
                    }
                    else if (_state == stateTimeRefs.tAfterFound)
                    {
                        searchPreviousFile = true;
                    }
                    else if (_state == stateTimeRefs.tBeforeFound)
                    {
                        searchNextFile = true;
                    }
                    else if (_state == stateTimeRefs.tBothFound)
                    {
                        throw new Exception("FindTimeRefs() error 1: in een ongeldige state beland");
                    }
                }
                for (int i = 0; i < timerefs.Length && !ready && !searchPreviousFile && !searchNextFile; i++)
                {
                    DateTime t = timerefs[i];

                    if (_state == stateTimeRefs.nothingFound)
                    {
                        if (t < tSearch)
                        {
                            _state = stateTimeRefs.tBeforeFound;

                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            if (i == (timerefs.Length - 1))
                            {
                                //laatste tijdref, dus in volgende file zoeken
                                searchNextFile = true;
                            }
                            //else volgende tijdreferenties bekijken in bestand
                        }
                        else if (t > tSearch)
                        {
                            _state = stateTimeRefs.tAfterFound;

                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            searchPreviousFile = true; //direct vorige bestand doorzoeken
                        }
                        else //t==tSearch
                        {
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }
                    }
                    else if (_state == stateTimeRefs.tBeforeFound)
                    {
                        if (t < tSearch)
                        {
                            //tBefore overschrijven
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            if (i == (timerefs.Length - 1))
                            {
                                //laatste tijdref, dus in volgende file zoeken
                                searchNextFile = true;
                            }
                            //else volgende tijdreferenties bekijken in bestand
                        }
                        else if (t > tSearch)
                        {
                            //tAfter gevonden, dus klaar
                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }
                        else //t==tSearch
                        {
                            //t is gezochte waarde
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }
                    }
                    else if (_state == stateTimeRefs.tAfterFound)
                    {
                        //hier komt hij alleen als hij terug in de tijd aan het zoeken is
                        if (t < tSearch)
                        {
                            //tBefore nu ook gevonden: verder zoeken binnen bestand naar t die dichter bij tSearch ligt
                            _state                  = stateTimeRefs.tBothFound;
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            if (i == (timerefs.Length - 1))
                            {
                                //laatste tijdref, dus geen tijdrefs die dichter bij tSearch liggen
                                ready = true;
                            }
                        }
                        else if (t > tSearch)
                        {
                            //t gevonden die dichter bij tSearch ligt dan tAfter: tAfter overschrijven
                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            searchPreviousFile = true;
                        }
                        else //t==tSearch
                        {
                            //t is gezochte waarde
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }
                    }
                    else if (_state == stateTimeRefs.tBothFound)
                    {
                        if (t < tSearch)
                        {
                            //t gevonden die dichter bij tSearch ligt dan tBefore: tBefore overschrijven
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;
                        }
                        else if (t > tSearch)
                        {
                            //t gevonden direct na tSearch: overschrijven en klaar
                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }
                        else //t==tSearch
                        {
                            //t is gezochte waarde
                            trlBefore.Valid         = true;
                            trlBefore.DtTimeRefVLog = t;
                            trlBefore.DtFile        = dtFile;

                            trlAfter.Valid         = true;
                            trlAfter.DtTimeRefVLog = t;
                            trlAfter.DtFile        = dtFile;

                            ready = true;
                        }

                        if (i == (timerefs.Length - 1))
                        {
                            //laatste tijdref, dus geen tijdrefs die dichter bij tSearch liggen
                            ready = true;
                        }
                    }
                }

                if (searchPreviousFile)
                {
                    searchPreviousFile = false;

                    if (negativeOffsetSearched)
                    {
                        //alle voorgaande files zijn al doorzocht
                        ready = true;
                    }
                    else
                    {
                        offsetFile--;
                        if (offsetFile < -maxOffsetHours)
                        {
                            if (_state == stateTimeRefs.tAfterFound)
                            {
                                ready = true;                                      //geen eerdere tijdrefs gevonden: klaar
                            }
                            else
                            {
                                //indien nog geen tijdrefs gevonden: doorzoeken in de positieve offset
                                negativeOffsetSearched = true;
                                offsetFile             = 1;
                            }
                        }
                    }
                }
                else if (searchNextFile)
                {
                    searchNextFile = false;

                    if (offsetFile < 0)
                    {
                        offsetFile = 0;                 //negatieve offsets zijn altijd al doorzocht
                    }
                    offsetFile++;
                    if (offsetFile > maxOffsetHours)
                    {
                        //alle bestanden, zowel voor als na het tijdstip zijn doorzocht, dus eindigd het hier
                        ready = true;
                    }
                }
                else if (!ready)
                {
                    throw new Exception("FindTimeRefs() error 2: in een ongeldige state beland");
                    //ready = true;
                }
            }

            if (ready)
            {
                result.TrlBefore = trlBefore;
                result.TrlAfter  = trlAfter;
            }

            return(result);
        }