574 lines
22 KiB
C#
574 lines
22 KiB
C#
// ========================================================================
|
|
// Copyright 2006 - Volian Enterprises, Inc. All rights reserved.
|
|
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
// ------------------------------------------------------------------------
|
|
// $Workfile: $ $Revision: $
|
|
// $Author: $ $Date: $
|
|
//
|
|
// $History: $
|
|
// ========================================================================
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.Data;
|
|
using System.Data.OleDb;
|
|
using System.Collections.Specialized;
|
|
using System.Collections.Generic;
|
|
using System.Xml;
|
|
using System.IO;
|
|
using System.Text;
|
|
using VEPROMS.CSLA.Library;
|
|
|
|
namespace DataLoader
|
|
{
|
|
public partial class Loader
|
|
{
|
|
#region Log4Net
|
|
public static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
//public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
#endregion
|
|
public static int HandleCount
|
|
{
|
|
get { return System.Diagnostics.Process.GetCurrentProcess().HandleCount; }
|
|
}
|
|
private bool RunWithDB2K = false;
|
|
private Item MigrateProcedure(OleDbConnection cn, DataRow dr, Item FromItem, string pth, DocVersion docver, bool convertProcedures, FormatInfo activeFormat)
|
|
{
|
|
dicOldStepSequence = new Dictionary<object, string>();
|
|
Stack<int> SubSectLevels = new Stack<int>(); // levels of subsections
|
|
ProcFileName = dr["Entry"].ToString();
|
|
ProcNumber = dr["Number"].ToString();
|
|
frmMain.Status = "Processing Procedure " + ProcNumber + " - " + ProcFileName;
|
|
GC.Collect();
|
|
frmMain.AddInfo("Processing Procedure {0} {1}", ProcNumber, GC.GetTotalMemory(true));
|
|
//frmMain.MyInfo = CSLACache.UsageNotFinalized;
|
|
|
|
|
|
DateTime dts = GetDTS(dr["Date"].ToString(), dr["Time"].ToString());
|
|
string userid = dr["initials"].ToString().Trim();
|
|
if (userid == null || userid == "") userid = "Migration";
|
|
|
|
ConfigInfo ci = null;
|
|
string tstr = dr["Proccode"].ToString();
|
|
if (tstr != null && tstr != "")
|
|
{
|
|
ci = new ConfigInfo(null);
|
|
ci.AddItem("Procedure", "ProcCode", tstr);
|
|
}
|
|
//load revdate
|
|
string tstr2 = dts.ToString("MM/dd/yyyy");
|
|
if (tstr2 != null && tstr2 != "")
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Procedure", "RevDate", tstr2);
|
|
}
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("History", "ProcName", ProcFileName.ToUpper());
|
|
|
|
// Load in format data, i.e. default number of columns:
|
|
string tstr1 = dr["Format"].ToString();
|
|
if (tstr1 != null && tstr1 != "")
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Format", "Columns", tstr1);
|
|
}
|
|
// try to load in fix file data:
|
|
FileInfo fi = new FileInfo(pth + @"\" + ProcFileName + @".fix");
|
|
if (fi.Exists)
|
|
{
|
|
FixItems fixItems = new FixItems(fi);
|
|
if (fixItems.Count > 0)
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
if (fixItems[0].Rev != null && fixItems[0].Rev != "") ci.AddItem("Procedure", "Rev", fixItems[0].Rev);
|
|
if (fixItems[0].RevDate != null && fixItems[0].RevDate != "") ci.AddItem("Procedure", "RevDate", fixItems[0].RevDate);
|
|
if (fixItems[0].ReviewDate != null && fixItems[0].ReviewDate != "") ci.AddItem("Procedure", "ReviewDate", fixItems[0].ReviewDate);
|
|
}
|
|
}
|
|
fi = new FileInfo(pth + @"\" + ProcFileName + @".apl");
|
|
if (fi.Exists)
|
|
{
|
|
MyProcAPL = GetApple(fi.FullName);
|
|
}
|
|
// check that there is a "Series" column, i.e. the 10th column, some datasets
|
|
// may not have it, for example vetuec\master.sl1
|
|
if (dr.ItemArray.Length > 10)
|
|
{
|
|
tstr = dr["Series"].ToString();
|
|
if (tstr != null && tstr != "")
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Procedure", "Series", tstr);
|
|
}
|
|
}
|
|
if (docver.DocVersionConfig.Unit_Count > 1)
|
|
{
|
|
for (int i = 1; i <= docver.DocVersionConfig.Unit_Count; i++)
|
|
{
|
|
ci.AddSlaveNode(i);
|
|
docver.DocVersionConfig.SelectedSlave = i;
|
|
string un = ".SL" + docver.DocVersionConfig.Old_Index;
|
|
|
|
string mupth = pth.Replace(".prc", un);
|
|
fi = new FileInfo(mupth + @"\" + ProcFileName + @".fix");
|
|
if (fi.Exists)
|
|
{
|
|
FixItems fixItems = new FixItems(fi);
|
|
if (fixItems.Count > 0)
|
|
{
|
|
if (fixItems[0].Rev != null && fixItems[0].Rev != "")
|
|
ci.AddSlaveItem(i, "Rev", fixItems[0].Rev);
|
|
else
|
|
ci.AddSlaveItem(i, "Rev", "");
|
|
if (fixItems[0].RevDate != null && fixItems[0].RevDate != "")
|
|
ci.AddSlaveItem(i, "RevDate", fixItems[0].RevDate);
|
|
else
|
|
ci.AddSlaveItem(i, "RevDate", "");
|
|
if (fixItems[0].ReviewDate != null && fixItems[0].ReviewDate != "")
|
|
ci.AddSlaveItem(i, "ReviewDate", fixItems[0].ReviewDate);
|
|
else
|
|
ci.AddSlaveItem(i, "ReviewDate", "");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ci.AddSlaveItem(i, "Rev", "");
|
|
ci.AddSlaveItem(i, "RevDate", "");
|
|
ci.AddSlaveItem(i, "ReviewDate", "");
|
|
}
|
|
}
|
|
}
|
|
DataSet ds = new DataSet();
|
|
DataTable dt = null;
|
|
|
|
// check that file exists, i.e. if proc file doesn't exist but has entry in set
|
|
// file, flag error, but continue.
|
|
string fname = pth + "\\" + dr["entry"] + ".dbf";
|
|
if (File.Exists(fname))
|
|
{
|
|
// if the dbt is bad, fix it.
|
|
DbtOk(dr["entry"].ToString(), pth);
|
|
// See if there is PSI and if so, add it to the xml.
|
|
OleDbDataAdapter dapsi = new OleDbDataAdapter("select * from [" + dr["entry"] + "] where [STEP] is null", cn);
|
|
int handleBefore = HandleCount;
|
|
TryToLoadDataSet(ds, fname, dapsi);
|
|
int handleAfter = HandleCount;
|
|
if (!RunWithDB2K && handleAfter - handleBefore > 10)
|
|
{
|
|
string msg = "It appears that handles are being created and not cleared.";
|
|
if (dB2KInstalled())
|
|
{
|
|
msg += "\r\n\r\nThis is most likely because dB2K is installed." +
|
|
"\r\n\r\nUninstall dB2K and run again.";
|
|
if (MessageBox.Show(msg + "\r\n\r\nDo you want to continue?", "Run with dB2K",
|
|
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
|
RunWithDB2K = true;
|
|
}
|
|
else
|
|
{
|
|
msg += "\r\n\r\nCall Volian for support.";
|
|
}
|
|
if (!RunWithDB2K) throw new Exception(msg);
|
|
}
|
|
dt = ds.Tables[0];
|
|
|
|
if (dt.Rows.Count > 0)
|
|
{
|
|
DataRow drpsi = dt.Rows[0];
|
|
string psistr = drpsi["TEXTM"].ToString();
|
|
if (psistr != null && psistr != "")
|
|
{
|
|
StringReader strrd = new StringReader(psistr);
|
|
|
|
string sLine;
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
while ((sLine = strrd.ReadLine()) != null)
|
|
{
|
|
int indx = sLine.IndexOf(' ');
|
|
string nm = null;
|
|
string vl = null;
|
|
if (indx < 0)
|
|
nm = sLine;
|
|
else
|
|
{
|
|
nm = sLine.Substring(0, indx);
|
|
string tmpPsi = sLine.Substring(indx + 1, sLine.Length - indx - 1);
|
|
if (tmpPsi.Length > 0) tmpPsi=TextConvert.ConvertText(tmpPsi);
|
|
vl = tmpPsi;
|
|
}
|
|
ci.AddItem("PSI", nm, vl == null ? null : vl);
|
|
}
|
|
}
|
|
}
|
|
dapsi.Dispose();
|
|
}
|
|
else // log an error
|
|
{
|
|
log.ErrorFormat("Missing DBF: {0}", fname);
|
|
}
|
|
|
|
// Note, for now the data from the format field will be saved. Later, xpath, ??
|
|
EditSectId = 0;
|
|
|
|
// See if no caret convert...
|
|
//FormatInfo docverFormat = docver.MyDocVersionInfo.ActiveFormat;
|
|
bool do_cvt = activeFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta;//docverFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta;
|
|
// pass in a 0 on MakeContent for type of procedure, i.e. procedure = 0 (on type field)
|
|
|
|
// can we save itm.ItemID in a dictionary of outside trans? ex: otrans("vehlp\procs\0POP05-EO00",itm.ItemID)?
|
|
Content cont = null;
|
|
Item itm = null;
|
|
string dicNumber = dr["Number"].ToString();
|
|
string number = TextConvert.ConvertText(dr["Number"].ToString());
|
|
frmMain.UpdateLabels(1, 0, 0);
|
|
//Console.WriteLine("number {0}", number);
|
|
//Console.WriteLine("Item Key {0} List {1}", Item.CacheCountPrimaryKey, Item.CacheCountList);
|
|
//Console.WriteLine("ItemInfo Key {0} List {1}", ItemInfo.CacheCountPrimaryKey, ItemInfo.CacheCountList);
|
|
DocVersionInfo dvi = DocVersionInfo.Get(docver.VersionID);
|
|
dvi.ResetProcedures(); // need this to clear out Procedures so that they are retrieved (resolves a caching problem)
|
|
foreach (ItemInfo ii in dvi.Procedures)
|
|
{
|
|
if (ii.MyContent.Number == number)
|
|
{
|
|
//Console.WriteLine(number);
|
|
itm = ii.Get();
|
|
cont = ii.MyContent.Get();
|
|
break;
|
|
}
|
|
}
|
|
if (!convertProcedures || (docver.VersionType != (int)VEPROMS.CSLA.Library.VersionTypeEnum.WorkingDraft && docver.VersionType != (int)VEPROMS.CSLA.Library.VersionTypeEnum.Approved))
|
|
{
|
|
// if this procedure already exists for this docversion, just use it.
|
|
if (itm == null && cont == null)
|
|
{
|
|
cont = Content.New(number, TextConvert.ConvertText(dr["Title"].ToString(), do_cvt), 0, null, ci == null ? null : ci.ToString(), dts, userid);
|
|
itm = Item.MakeItem(FromItem, cont, dts, userid);
|
|
}
|
|
}
|
|
if (convertProcedures /* && number == "001\\u8209?007"/* && number == "0POP05-EO-EC00"*/)
|
|
{
|
|
OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + dr["entry"] + "] where sequence like ' %' and [STEP] is not null", cn);
|
|
try
|
|
{
|
|
dicTrans_ItemDone[dicNumber] = itm; // will be null if only doing procs & no sections, etc.
|
|
LoadSection(ds, da, dr["entry"].ToString());
|
|
da.SelectCommand.CommandText = "select * from [" + dr["entry"] + "] where step not like ' ' and sequence not like ' %'";
|
|
da.Fill(ds, "Steps");
|
|
dt = ds.Tables["Steps"];
|
|
dt.CaseSensitive = true;
|
|
ds.Tables["Steps"].CaseSensitive = true;
|
|
dt.Columns.Add("CStep", System.Type.GetType("System.String"));
|
|
dt.Columns.Add("CSequence", System.Type.GetType("System.String"));
|
|
// set the cstep & csequence - couldn't do it in the add because it needed a sql function
|
|
foreach (DataRow drw in ds.Tables["Steps"].Rows)
|
|
{
|
|
drw["CStep"] = TextConvert.ConvertSeq(drw["Step"].ToString());
|
|
drw["CSequence"] = TextConvert.ConvertSeq(drw["Sequence"].ToString());
|
|
}
|
|
dt.Columns.Add("StepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CStep,2,1),'System.Char'),'System.Int32')-48");
|
|
dt.Columns.Add("Level", System.Type.GetType("System.Int32"), "Len(CSequence)");
|
|
dt.Columns.Add("SubStepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,Len(CSequence),1),'System.Char'),'System.Int32')-48");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
|
|
log.Error(ex.StackTrace);
|
|
frmMain.AddError(ex, "MigrateProcedure - {0}", ProcFileName);
|
|
}
|
|
da.Dispose();
|
|
// dicSecCount is dictionary to track number of subsections for the parent at a level
|
|
// dicSecID is the parent at that level
|
|
Dictionary<int, int> dicSecCount = new Dictionary<int, int>();
|
|
Dictionary<int, Item> dicSecParentItem = new Dictionary<int, Item>();
|
|
frmMain.pbSectMaximum = ds.Tables["Sections"].Rows.Count;
|
|
frmMain.pbSectValue = 0;
|
|
|
|
DataTable dtsect = ds.Tables["Sections"];
|
|
dtsect.CaseSensitive = true;
|
|
DataView dv = new DataView(dtsect, "", "locb", DataViewRowState.CurrentRows);
|
|
Item SectItm = null;
|
|
int level = 0;
|
|
bool addpart = true;
|
|
Item parentitem = itm;
|
|
//if (ProcNumber == "001-002")
|
|
// Console.WriteLine("proc 001-002");
|
|
foreach (DataRowView drw in dv)
|
|
{
|
|
//if (ProcNumber == "016-001") //"017-001") //"082-002AB")
|
|
// Console.WriteLine("016-001"); //("017-001"); //"082-002AB");
|
|
|
|
// If there is a '~' in step[1] and the sequence number is blank, the this record
|
|
// is a multiline section title. Skip it from processing the section. This record
|
|
// will get read in the section code to get the section title.
|
|
string sequence = drw["CSequence"].ToString().PadRight(10);
|
|
string step = drw["CStep"].ToString();
|
|
if (step[1]=='~' && sequence[1]==' ') break;
|
|
bool hasSubSects = (sequence[5] != ' ' && sequence[5] != '0');
|
|
SectItm = MigrateSection(parentitem, ProcNumber, cn, drw, ds.Tables["Steps"], SectItm, hasSubSects, pth, docver, activeFormat, addpart ? cont : null);
|
|
addpart = false;
|
|
// if no children, add first child (cont)
|
|
//if (addpart)
|
|
//{
|
|
// // ContentsParts.Add can use 'fromtype', item - fromtype here = 2, section
|
|
// cont.ContentParts.Add(2, SectItm);
|
|
// if (cont.MyZContent.OldStepSequence == null || cont.MyZContent.OldStepSequence == "") cont.MyZContent.OldStepSequence = ProcNumber;
|
|
// if (!cont.IsSavable) ErrorRpt.ErrorReport(cont);
|
|
// cont.Save();
|
|
// addpart = false;
|
|
//}
|
|
//FrType = 0;
|
|
dicSecParentItem[level] = SectItm;
|
|
if (level > 0)
|
|
{
|
|
if ((dicSecCount[level]) == 1)
|
|
// shift up a level, i.e. give me the parent for the previous level
|
|
SectItm = dicSecParentItem[--level];
|
|
else
|
|
dicSecCount[level]--; // decrements number of sections to process
|
|
}
|
|
// get number of subsections for this section
|
|
int subSecs = drw["Sequence"].ToString().PadRight(12, ' ')[5] - 48;
|
|
if (subSecs > 0)
|
|
{
|
|
dicSecCount[++level] = subSecs;
|
|
cont = SectItm.MyContent;
|
|
parentitem = SectItm;
|
|
addpart = true;
|
|
SectItm = null; // no previous sibling for the first child node.
|
|
}
|
|
}
|
|
dv.Dispose();
|
|
//foreach (Item secItm in dicSecParentItem.Values)
|
|
// secItm.Dispose();
|
|
// need section start
|
|
if (EditSectId != 0)
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Procedure", "SectionStart", string.Format("{0}", EditSectId));
|
|
itm.MyContent.Config = (ci == null) ? null : ci.ToString();
|
|
if (!itm.IsSavable) ErrorRpt.ErrorReport(itm);
|
|
itm.Save();
|
|
}
|
|
}
|
|
ds.Dispose();
|
|
|
|
// if there are any floating foldouts & associated steps, set config on steps for foldout association.
|
|
// the free the lists for the next procedure:
|
|
if (FoldoutStpSeq != null && FoldoutStpSeq.Count>0)
|
|
{
|
|
string cmd = "SELECT * FROM [tran] WHERE [FROMNUMBER]='" + ProcNumber.Replace("'", "''") + "' AND [TYPE] ='R'";
|
|
OleDbDataAdapter da = new OleDbDataAdapter(cmd, cn);
|
|
// get transition records for this step.
|
|
ds = new DataSet();
|
|
try
|
|
{
|
|
da.Fill(ds);
|
|
DataTable dtt = ds.Tables[0];
|
|
dtt.CaseSensitive = true;
|
|
Dictionary<int, string> stpFoldSeq = new Dictionary<int,string>();
|
|
foreach (DataRow drt in dtt.Rows)
|
|
{
|
|
// get from/to seq, subtract off '0' to get stepnumber.
|
|
// The 'oldto' field stores which foldout section these steps go
|
|
// to. However, if reset, the 'oldto' may not contain a reference
|
|
// to a foldout, i.e. may contain 'junk' data. Only add the
|
|
// reference to the dictionary if it's a foldout.
|
|
int fromStep = drt["FROMSEQUEN"].ToString()[1] - '0';
|
|
int toStep = drt["TOSEQUENCE"].ToString()[1] - '0';
|
|
string foldSeq = drt["OLDTO"].ToString().Substring(0, 2);
|
|
if (foldSeq[1] == 'F')
|
|
{
|
|
for (int istp = fromStep; istp <= toStep; istp++)
|
|
stpFoldSeq.Add(istp, foldSeq);
|
|
}
|
|
}
|
|
ds.Dispose();
|
|
da.Dispose();
|
|
// now read in the HLS's and set their config to the appropriate foldout:
|
|
int cnt = 1;
|
|
foreach (int hlsItemId in FloatingFoldoutHLS)
|
|
{
|
|
using (Item itmF = Item.Get(hlsItemId))
|
|
{
|
|
// be sure that the dictionaries contain the key.
|
|
// Some data may be 'corrupt' and not have the appropriate linkages
|
|
// to floating foldouts.
|
|
if (stpFoldSeq.ContainsKey(cnt))
|
|
{
|
|
string fldstr = stpFoldSeq[cnt];
|
|
if (FoldoutStpSeq.ContainsKey(fldstr))
|
|
{
|
|
int fldItemId = FoldoutStpSeq[fldstr];
|
|
ConfigInfo ciFold = new ConfigInfo(itmF.MyContent.Config);
|
|
ciFold.AddItem("Step", "FloatingFoldout", fldItemId.ToString());
|
|
itmF.MyContent.Config = ciFold.ToString();
|
|
itmF.Save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmMain.AddError(ex, "Error resolving Floating Foldout Data '{0}'", ProcNumber);
|
|
log.Error("Error resolving Floating Foldout Data");
|
|
log.ErrorFormat("from number = {0}", ProcNumber);
|
|
log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
|
|
ds.Dispose();
|
|
da.Dispose();
|
|
}
|
|
}
|
|
if (FoldoutStpSeq!=null) FoldoutStpSeq.Clear();
|
|
if (FloatingFoldoutHLS!=null) FloatingFoldoutHLS.Clear();
|
|
//Console.WriteLine("End MigrateProcedure number {0}", number);
|
|
//Console.WriteLine("End MigrateProcedure Item Key {0} List {1}", Item.CacheCountPrimaryKey, Item.CacheCountList);
|
|
//Console.WriteLine("End MigrateProcedure ItemInfo Key {0} List {1}", ItemInfo.CacheCountPrimaryKey, ItemInfo.CacheCountList);
|
|
return itm;
|
|
}
|
|
|
|
private static void TryToLoadDataSet(DataSet ds, string fname, OleDbDataAdapter dapsi)
|
|
{
|
|
try
|
|
{
|
|
dapsi.Fill(ds);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
FileInfo fi;
|
|
switch (ex.Message)
|
|
{
|
|
case "Index file not found.":// then delete inf file
|
|
fi = new FileInfo(fname.ToLower().Replace(".dbf",".inf"));
|
|
fi.Delete();
|
|
TryToLoadDataSet(ds, fname, dapsi); // Try again
|
|
break;
|
|
case "External table is not in the expected format.": // then pad dbt file with 128 zeros.
|
|
fi = new FileInfo(fname.ToLower().Replace(".dbf", ".dbt"));
|
|
FileStream fs = fi.OpenWrite();
|
|
fs.Position = fs.Length;
|
|
byte[] buf = new byte[128];
|
|
for (int i = 0; i < 128; i++) buf[i] = 0;
|
|
fs.Write(buf, 0, 128);
|
|
fs.Close();
|
|
TryToLoadDataSet(ds, fname, dapsi); // Try again
|
|
break;
|
|
default: // Unrecognized error
|
|
Console.WriteLine(ex.Message);
|
|
//Application.Exit();
|
|
throw new Exception("Error in MigrateProcedure: " + fname, ex);
|
|
}
|
|
}
|
|
}
|
|
private bool dB2KInstalled()
|
|
{
|
|
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"software\dBase\dB2K");
|
|
bool retval = key != null;
|
|
if(key != null)key.Close();
|
|
return retval;
|
|
}
|
|
|
|
// check for duplicate SET file data - jsj 2/11/10
|
|
private bool OKtoProcessDBF(DataRow dr, string pth)
|
|
{
|
|
string pfn = dr["Entry"].ToString();
|
|
string pn = dr["Number"].ToString();
|
|
FileInfo fi = new FileInfo(pth + "\\" + pfn + ".dbf");
|
|
if (!fi.Exists)
|
|
{
|
|
_MyLog.WarnFormat("Data file does not exist {0}", fi.FullName);
|
|
frmMain.AddError("Data file does not exist {0}", fi.FullName);
|
|
return false;
|
|
}
|
|
if (!dicSetfileEntries.ContainsValue(pfn) && !dicSetfileEntries.ContainsKey(pn))
|
|
{
|
|
dicSetfileEntries.Add(pn, pfn);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
private Item MigrateProcedures(OleDbConnection cn, string pth, DocVersion docver, bool convertProcedures, FormatInfo activeFormat)
|
|
{
|
|
|
|
Item FirstItm = null;
|
|
// Loop through Set File for each Procedure
|
|
try
|
|
{
|
|
OleDbDataAdapter da = new OleDbDataAdapter("Select * from [set] where entry is not null", cn);
|
|
DataSet ds = new DataSet();
|
|
da.Fill(ds);
|
|
Item FrItm = null;
|
|
frmMain.pbProcMaximum = ds.Tables[0].Rows.Count;
|
|
frmMain.UpdateLabels(0, 0, 0);
|
|
dicSetfileEntries = new Dictionary<string, string>(); // used to check for duplicate SET file info - jsj 2/11/10
|
|
int i = 0;
|
|
frmMain.ShowSections = convertProcedures;
|
|
foreach (DataRow dr in ds.Tables[0].Rows)
|
|
{
|
|
if (++i > frmMain.SkipProcedures)
|
|
{
|
|
if (OKtoProcessDBF(dr, pth)) // look for duplicate SET file info - jsj 2/11/10
|
|
{
|
|
List<int> cacheContentInfo = ContentInfo.CacheList;
|
|
List<int> cacheItemInfo = ItemInfo.CacheList;
|
|
List<int> cacheEntryInfo = EntryInfo.CacheList;
|
|
List<int> cachePdfInfo = PdfInfo.CacheList;
|
|
List<int> cacheDocVersionInfo = DocVersionInfo.CacheList;
|
|
List<int> cachePartInfo = PartInfo.CacheList;
|
|
frmMain.pbStepValue = 0;//Reset Step Count
|
|
FrItm = MigrateProcedure(cn, dr, FrItm, pth, docver, convertProcedures, activeFormat);
|
|
if (FirstItm == null) FirstItm = FrItm;
|
|
//frmMain.MyInfo = string.Format("Before Restore {0}", GC.GetTotalMemory(true));
|
|
ContentInfo.RestoreCacheList(cacheContentInfo);
|
|
PartInfo.RestoreCacheList(cachePartInfo);
|
|
ItemInfo.RestoreCacheList(cacheItemInfo);
|
|
EntryInfo.RestoreCacheList(cacheEntryInfo);
|
|
PdfInfo.RestoreCacheList(cachePdfInfo);
|
|
DocVersionInfo.RestoreCacheList(cacheDocVersionInfo);
|
|
//frmMain.MyInfo = string.Format("After Restore {0}", GC.GetTotalMemory(true));
|
|
}
|
|
}
|
|
//GC.Collect();
|
|
}
|
|
ds.Dispose();
|
|
da.Dispose();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_MyLog.ErrorFormat("MigrateProcedures - {0} - {1}\r\n\r\n{2}", pth,ex.Message, ex.InnerException);
|
|
//throw new Exception("Error in MigrateProcedures: " + pth, ex);
|
|
}
|
|
frmMain.MyInfo = CSLACache.UsageAll;
|
|
frmMain.AddInfo(Content.MyStack);
|
|
frmMain.AddInfo(ContentInfo.MyStack);
|
|
frmMain.AddInfo(DocVersionInfo.MyStack);
|
|
return FirstItm;
|
|
}
|
|
private void DbtOk(string fname, string pth)
|
|
{
|
|
string dbtname = pth + "\\" + fname + ".dbt";
|
|
if (File.Exists(dbtname))
|
|
{
|
|
// check if dbt is at least 512, if not append 508 bytes. This is to fix
|
|
// a problem where dbts were created with only 4 bytes in the 16-bit code.
|
|
// if only 4 bytes, ado.net gives an "External table not in expected format"
|
|
// error
|
|
FileInfo fi = new FileInfo(dbtname);
|
|
if (fi.Length < 512)
|
|
{
|
|
FileStream fs = new FileStream(dbtname, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
|
|
BinaryWriter bw = new BinaryWriter(fs);
|
|
bw.Seek(0, SeekOrigin.End);
|
|
byte[] wrBytes = new byte[512 - fi.Length];
|
|
for (int i = 0; i < 512 - fi.Length; i++) wrBytes[i] = 0;
|
|
wrBytes[4] = 0x02;
|
|
bw.Write(wrBytes);
|
|
bw.Close();
|
|
}
|
|
fi = null;
|
|
}
|
|
}
|
|
}
|
|
}
|