B2019-035 Added better memory management to the import procedure set functionality, with focus on importing Word documents and Library documents. Also, when a library document is added via an import, the modified date/time of the library document is appended to the library document name

This commit is contained in:
John Jenko 2019-03-15 19:03:07 +00:00
parent c9c26d235a
commit c16ebcf2ed

View File

@ -709,6 +709,7 @@ namespace VEPROMS
Old2NewItem = new Dictionary<int, int>();
Old2NewContent = new Dictionary<int, int>();
Old2NewLibDoc = new Dictionary<int, int>();
GetExistingLibDocsList(); // B2019-035 better memory management
PendingTransitions = new XmlDocument();
XmlElement xe = PendingTransitions.CreateElement("transitions");
PendingTransitions.AppendChild(xe);
@ -738,6 +739,7 @@ namespace VEPROMS
Old2NewItem = new Dictionary<int, int>();
Old2NewContent = new Dictionary<int, int>();
Old2NewLibDoc = new Dictionary<int, int>();
GetExistingLibDocsList(); // B2019-035 better memory management
PendingTransitions = new XmlDocument();
XmlElement xe = PendingTransitions.CreateElement("transitions");
PendingTransitions.AppendChild(xe);
@ -777,6 +779,7 @@ namespace VEPROMS
Old2NewItem = new Dictionary<int, int>();
Old2NewContent = new Dictionary<int, int>();
Old2NewLibDoc = new Dictionary<int, int>();
GetExistingLibDocsList(); // B2019-035 better memory management
PendingTransitions = new XmlDocument();
XmlElement xe = PendingTransitions.CreateElement("transitions");
PendingTransitions.AppendChild(xe);
@ -866,6 +869,7 @@ namespace VEPROMS
DirectoryInfo[] dis = di.GetDirectories();
for (int d = 0; d < dis.Length; d++)
dis[d].Delete(true);
di.Delete();
lblImportStatus.Text = "Updating Transitions";
AddTransitions();
FixFloatingFoldouts();
@ -1705,6 +1709,7 @@ namespace VEPROMS
Old2NewItem = new Dictionary<int, int>();
Old2NewContent = new Dictionary<int, int>();
Old2NewLibDoc = new Dictionary<int, int>();
GetExistingLibDocsList(); // B2019-035 better memory management
PendingTransitions = new XmlDocument();
FileInfo fi = new FileInfo(ofd.FileName);
string dn;
@ -3336,6 +3341,7 @@ namespace VEPROMS
private Dictionary<int, int> Old2NewItem;
private Dictionary<int, int> Old2NewContent;
private Dictionary<int, int> Old2NewLibDoc;
private Dictionary<string, int> ExistingLibDocs; // B2019-035 better memory management
private XmlDocument PendingTransitions;
private RODb MyRODb = null;
@ -3921,18 +3927,20 @@ namespace VEPROMS
}
private void AddAnnotations(int itemID, XmlNode xn)
{
Item itm = Item.Get(itemID);
foreach (XmlNode nd in xn.SelectNodes("annotation"))
using (Item itm = Item.Get(itemID)) //B2019-035 better memory management
{
int typeid = int.Parse(nd.Attributes.GetNamedItem("typeid").InnerText);
string rtftext = nd.Attributes.GetNamedItem("rtftext").InnerText;
string searchtext = nd.Attributes.GetNamedItem("searchtext").InnerText;
string config = nd.Attributes.GetNamedItem("config").InnerText;
string userid = nd.Attributes.GetNamedItem("userid").InnerText;
DateTime dts = DateTime.Parse(nd.Attributes.GetNamedItem("dts").InnerText);
AnnotationType annType = AnnotationType.GetByNameOrCreate(nd.Attributes.GetNamedItem("typename").InnerText);
Annotation ann = Annotation.MakeAnnotation(itm, annType, rtftext, searchtext, config, dts, userid);
ann.Save();
foreach (XmlNode nd in xn.SelectNodes("annotation"))
{
int typeid = int.Parse(nd.Attributes.GetNamedItem("typeid").InnerText);
string rtftext = nd.Attributes.GetNamedItem("rtftext").InnerText;
string searchtext = nd.Attributes.GetNamedItem("searchtext").InnerText;
string config = nd.Attributes.GetNamedItem("config").InnerText;
string userid = nd.Attributes.GetNamedItem("userid").InnerText;
DateTime dts = DateTime.Parse(nd.Attributes.GetNamedItem("dts").InnerText);
AnnotationType annType = AnnotationType.GetByNameOrCreate(nd.Attributes.GetNamedItem("typename").InnerText);
Annotation ann = Annotation.MakeAnnotation(itm, annType, rtftext, searchtext, config, dts, userid);
ann.Save();
}
}
}
private void AddParts(XmlNode myNode, ItemInfo parentInfo)
@ -4566,7 +4574,6 @@ namespace VEPROMS
lblImportSection.Text = string.Format("{0} of {1} Sections", pbImportSection.Value.ToString(), pbImportSection.Maximum.ToString());
Application.DoEvents();
XmlNode xc = xn.SelectSingleNode("content");
Section sect;
string number = xc.Attributes.GetNamedItem("number").InnerText;
string text = xc.Attributes.GetNamedItem("text").InnerText;
int sectiontype = int.Parse(xc.Attributes.GetNamedItem("type").InnerText);
@ -4577,7 +4584,7 @@ namespace VEPROMS
CheckForFloatingFoldout(contentid, config);
string userid = xc.Attributes.GetNamedItem("userid").InnerText;
DateTime dts = DateTime.Parse(xc.Attributes.GetNamedItem("dts").InnerText);
using (sect = Section.MakeSection(parentInfo, prevInfo, number, text, sectiontype))
using (Section sect = Section.MakeSection(parentInfo, prevInfo, number, text, sectiontype)) // B2019-035 better memory management
{
sect.DTS = dts;
sect.UserID = userid;
@ -4750,9 +4757,11 @@ namespace VEPROMS
XmlNode nd = xc.SelectSingleNode("entry");
string userid = nd.Attributes.GetNamedItem("userid").InnerText;
DateTime dts = DateTime.Parse(nd.Attributes.GetNamedItem("dts").InnerText);
Document dd = AddDocument(nd.SelectSingleNode("document"));
Entry ee = Entry.MakeEntry(content, dd, dts, userid);
ee.Save();
using (Document dd = AddDocument(nd.SelectSingleNode("document"))) // B2019-035 better memory management
{
Entry ee = Entry.MakeEntry(content, dd, dts, userid);
ee.Save();
}
}
// jsj 2016Feb16 - This appears to not be used
//private void AddDocument(XmlReader xr, Dictionary<string, string> dic)
@ -4772,36 +4781,57 @@ namespace VEPROMS
// userid = dic["userid"];
// Entry ee = Entry.MakeEntry(content, dd, dts, userid);
//}
// B2019-035 This is called only once to get the existing library document info.
// when it was in the AddDocument() logic, it would use up (and not free up) memory each time
// a Word section was added during the import
private void GetExistingLibDocsList()
{
ExistingLibDocs = new Dictionary<string,int>();
using (DocumentInfoList dil = DocumentInfoList.GetLibraries(true))
{
foreach (DocumentInfo di in dil)
{
string keystr = di.LibTitle+"_"+di.DTS.ToString();
if (!ExistingLibDocs.ContainsKey(keystr))
ExistingLibDocs.Add(keystr, di.DocID);
di.Dispose();
}
}
}
private Document AddDocument(XmlNode xn)
{
Document d;
Document d=null;
int docid = int.Parse(xn.Attributes.GetNamedItem("docid").InnerText);
if (Old2NewLibDoc.ContainsKey(docid))
{
docid = Old2NewLibDoc[docid];
d = Document.Get(docid);
}
else
else // see if it is in the existing database
{
string libtitle = xn.Attributes.GetNamedItem("libtitle").InnerText;
DateTime dts = DateTime.Parse(xn.Attributes.GetNamedItem("dts").InnerText);
if (libtitle != "")
{
DocumentInfoList dil = DocumentInfoList.GetLibraries(true);
foreach (DocumentInfo di in dil)
{
if (di.LibTitle == libtitle && di.DTS == dts)
return di.Get(); // found library document in exiting database
}
// B2019-035 better memory management. Prior logic would eat up memory (and not free it).
string libkey = libtitle + "_" + dts.ToString();
if (ExistingLibDocs.ContainsKey(libkey))
d = Document.Get(ExistingLibDocs[libkey]); // found library document in existing database
}
if (d == null) // not found in existing database, create it
{
byte[] doccontent = Convert.FromBase64String(xn.Attributes.GetNamedItem("doccontent").InnerText);
string docascii = xn.Attributes.GetNamedItem("docascii").InnerText;
string config = xn.Attributes.GetNamedItem("config").InnerText;
string userid = xn.Attributes.GetNamedItem("userid").InnerText;
string fileextension = xn.Attributes.GetNamedItem("fileextension").InnerText;
if (libtitle != "") libtitle = libtitle + "_" + dts.ToString(); // if a lib document, append the date/time to the title incase there are duplicate titles
d = Document.MakeDocument(libtitle, doccontent, docascii, config, dts, userid, fileextension);
d.Save();
Old2NewLibDoc.Add(docid, d.DocID);
}
byte[] doccontent = Convert.FromBase64String(xn.Attributes.GetNamedItem("doccontent").InnerText);
string docascii = xn.Attributes.GetNamedItem("docascii").InnerText;
string config = xn.Attributes.GetNamedItem("config").InnerText;
string userid = xn.Attributes.GetNamedItem("userid").InnerText;
string fileextension = xn.Attributes.GetNamedItem("fileextension").InnerText;
d = Document.MakeDocument(libtitle, doccontent, docascii, config, dts, userid, fileextension);
d.Save();
Old2NewLibDoc.Add(docid, d.DocID);
}
return d;
}