/// <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); }
/// <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); }