SourceCode/PROMS/DataLoader/Procedures.cs.bak

294 lines
11 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
private Item MigrateProcedure(OleDbConnection cn, DataRow dr, Item FromItem, string pth, DocVersion docver, bool convertProcedures)
{
dicOldStepSequence = new Dictionary<object, string>();
Stack<int> SubSectLevels = new Stack<int>(); // 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<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;
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;
}
}
}
}