B2017-061: improve speed of repeated test of newer rofst.

This commit is contained in:
Kathy Ruffing 2017-03-22 13:25:42 +00:00
parent b6b58e30a0
commit 19be8b03b9

View File

@ -205,6 +205,14 @@ namespace VEPROMS.CSLA.Library
}
return exists;
}
// The following dictionary is used to store the state of the ro.fst check so that it is
// not made repeatedly in NewerRoFst. (B2017-050)
private static Dictionary<string, bool> NewerRoFstLookup = new Dictionary<string, bool>();
private static bool AddToRoFstLookup(string key, bool result)
{
if (!NewerRoFstLookup.ContainsKey(key)) NewerRoFstLookup.Add(key, result);
return result;
}
public bool NewerRoFst
{
get
@ -223,13 +231,17 @@ namespace VEPROMS.CSLA.Library
// if the database Ro.Fst is newer or if the files have identical DTS,
// assume that they are the same file.
if (roFstInfo.DTS >= fiRofst.LastWriteTimeUtc) return false;
// put this in a dictionary so we don't have to keep testing to see if the file version of ro.fst is newer than database version
string key = string.Format("{0}-{1}", DocVersionAssociations[0].ROFstID, fiRofst.LastWriteTimeUtc);
if (NewerRoFstLookup.ContainsKey(key)) return NewerRoFstLookup[key];
if (roFstInfo.DTS >= fiRofst.LastWriteTimeUtc) return AddToRoFstLookup(key, false);
TimeSpan ts = roFstInfo.DTS - fiRofst.LastWriteTimeUtc;
if (ts.TotalSeconds > -1F) return false;
if (ts.TotalSeconds > -1F) return AddToRoFstLookup(key, false);
// next see if the data is the same size, i.e. byte count of record and byte count
// of file. If different sizes, the date/time stamp check will hold.
if (fiRofst.Length != roFstInfo.ROLookup.Length) return fiRofst.LastWriteTimeUtc > roFstInfo.DTS;
if (fiRofst.Length != roFstInfo.ROLookup.Length) return AddToRoFstLookup(key,fiRofst.LastWriteTimeUtc > roFstInfo.DTS);
// if we can't tell by the DTS or size, compare the contents. Get all of the rodb's
// rofsts of the size of the file & compare bytes. If
@ -245,10 +257,10 @@ namespace VEPROMS.CSLA.Library
{
// compare contents by comparing each byte.
for (int i = 0; i < fiRofst.Length; i++)
if (ab[i] != irofst.ROLookup[i]) return true;
if (ab[i] != irofst.ROLookup[i]) return AddToRoFstLookup(key,true);
}
}
return false;
return AddToRoFstLookup(key,false);
}
}