// ======================================================================== // 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 private Item MigrateProcedure(OleDbConnection cn, DataRow dr, Item FromItem, string pth, DocVersion docver, bool convertProcedures) { dicOldStepSequence = new Dictionary(); Stack SubSectLevels = new Stack(); // levels of subsections ProcFileName = dr["Entry"].ToString(); ProcNumber = dr["Number"].ToString(); 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); } // 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); } } 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 = frmMain.tbSourceText +"\\"+ dr["entry"] + ".dbf"; 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); try { dapsi.Fill(ds); } catch (Exception ex) { Console.WriteLine(ex.Message); Application.Exit(); } 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); vl = sLine.Substring(indx + 1, sLine.Length - indx - 1); } 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 = 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 number = TextConvert.ConvertText(dr["Number"].ToString()); frmMain.UpdateLabels(1, 0, 0); if (!convertProcedures || docver.VersionType != (int)VEPROMS.CSLA.Library.VersionTypeEnum.WorkingDraft) { 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); } else { DocVersionInfo dvi = DocVersionInfo.Get(docver.VersionID); foreach(ItemInfo ii in dvi.Procedures){ if (ii.MyContent.Number == number) { Console.WriteLine(number); itm = ii.Get(); cont = ii.MyContent.Get(); } } } if (convertProcedures /*&& number == "0POP05\\u8209?EO\\u8209?ES32"*/) //0POP05\u8209?EO\u8209?ES32 { OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + dr["entry"] + "] where sequence like ' %'", cn); try { LoadSection(ds, da, dr["entry"].ToString()); da.SelectCommand.CommandText = "select * from [" + dr["entry"] + "] where step not like ' ' and step 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); } da.Dispose(); // dicSecCount is dictionary to track number of subsections for the parent at a level // dicSecID is the parent at that level Dictionary dicSecCount = new Dictionary(); Dictionary dicSecParentItem = new Dictionary(); 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; foreach (DataRowView drw in dv) { SectItm = MigrateSection(parentitem, ProcNumber, cn, drw, ds.Tables["Steps"], SectItm, dicSecCount.Count > 0 ? true : false, pth, docver); // 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. } } // 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(); return itm; } private Item MigrateProcedures(OleDbConnection cn, string pth, DocVersion docver, bool convertProcedures) { Item FirstItm = null; // Loop through Set File for each Procedure int whereami = 0; 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); foreach (DataRow dr in ds.Tables[0].Rows) { FrItm = MigrateProcedure(cn, dr, FrItm, pth, docver, convertProcedures); if (FirstItm == null) FirstItm = FrItm; } da.Dispose(); } catch (Exception ex) { Console.WriteLine("End of MigrateProcedures - ex = {0}", ex.Message); _MyLog.ErrorFormat("MigrateProcedures - {0} - {1}\r\n\r\n{2}", pth,ex.Message, ex.InnerException); } return FirstItm; } private void DbtOk(string fname, string pth) { //string dbtname = frmMain.tbSourceText + "\\" + fname + ".dbt"; 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; } } } }