294 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
|             }
 | |
|         }
 | |
| 	}
 | |
| } |