300 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			300 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
 | |
| 	{
 | |
| 		Dictionary<int, List<string>> _ContentMigrationErrors = new Dictionary<int,List<string>>();
 | |
| 		List<string> _TransitionMigrationErrors = null;
 | |
| 		//private void AddContentMigrationError(Content fromCon,string errorMsg)
 | |
| 		//{
 | |
| 		//   if (!_ContentMigrationErrors.ContainsKey(fromCon.ContentID))
 | |
| 		//      _ContentMigrationErrors.Add(fromCon.ContentID,new List<string>());
 | |
| 		//   _ContentMigrationErrors[fromCon.ContentID].Add(errorMsg);
 | |
| 		//}
 | |
| 
 | |
| 		private string AddTrans(OleDbConnection cn, Content fromCon, DataRow dr, DataRow dr2, string pth)
 | |
|         {
 | |
| 			List<string> migrationErrors = new List<string>();
 | |
|             //TODO: ZTransitions tr.Oldto = dr["OLDTO"].ToString();
 | |
|             string thekey = dr["TONUMBER"].ToString() + "|" + dr["TOSEQUENCE"].ToString();
 | |
|             string dti = dr["DTI"].ToString().PadRight(18, ' ');
 | |
|             string userid = dti.Substring(13, 5).Trim();
 | |
|             int itype = 0;
 | |
|             ConfigInfo ci = null;
 | |
| 				//string otranskey = null;
 | |
|             // The transition type was stored as a character & also, when read in thru
 | |
|             // ado.net may have been converted into unicode.  So in order to get the 
 | |
|             // correct type, first, use the TextConvert to eliminate the conversion done
 | |
|             // by ado.net. Then convert to a number. The 'anding of 0x80' flags that it
 | |
|             // is a formatted transition (i.e. this was done for byron/braidwood to
 | |
|             // show the transition with a page number or not).  The 'anding of 0x7f' gets
 | |
|             // the actual number when subtracted from 0x30 (the value of the 0 character).
 | |
|             try
 | |
|             {
 | |
|                 char typech = TextConvert.ConvertSeq(dr["TYPE"].ToString())[0];
 | |
|                 int tmpitype = Convert.ToInt32(typech);
 | |
|                 if ((tmpitype & 0x80) > 0)
 | |
|                 {
 | |
|                     ci = new ConfigInfo(null);
 | |
|                     ci.AddItem("Transition", "Formatted", "True");
 | |
|                 }
 | |
|                 itype = (tmpitype&0x7F) - 0x30;
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 log.Error("Error converting transition type");
 | |
|                 log.ErrorFormat("type from database = {0}", dr["TYPE"].ToString());
 | |
|                 log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
 | |
|                 itype = -1;
 | |
|             }
 | |
|             DateTime dts = GetDTS(MakeDate(dti.Substring(0, 8).Trim()), dti.Substring(8, 5).Trim());
 | |
| 
 | |
|             // if it's in the dictionary of structure elements already migrated, just use this 
 | |
|             // structure id, or if it's in the dictionary of structure elements that have
 | |
|             // not been migrated but a record was created from this code, use it.  Otherwise
 | |
|             // create a new structure record and use its id, its data will be updated later.
 | |
|             // a structure record.
 | |
|             Item toItem = null;
 | |
| 			Item toItem2 = null;
 | |
| 			if (itype == 6) // Outside Transition
 | |
| 			{
 | |
| 				ItemInfo tmp = _OutTran.GetItem(thekey);
 | |
| 				if (tmp != null)
 | |
| 					toItem = tmp.Get();
 | |
| 				else
 | |
| 				{
 | |
| 					toItem = Item.New(null, TransDummyCont, DateTime.Now, "Migration");
 | |
| 					migrationErrors.Add("Transition Error: Missing Data - "+_OutTran.GetDescription(thekey));
 | |
| 				}
 | |
| 				toItem2 = toItem;
 | |
| 				// the 32-bit program will no longer have a special type for outside transitions - make it a
 | |
| 				// type of 0 (procedure with optional step).
 | |
| 				itype = 0;					
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if (dicTrans_ItemDone.ContainsKey(thekey))
 | |
| 				{
 | |
| 					toItem = dicTrans_ItemDone[thekey];
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					if (dicTrans_ItemIds.ContainsKey(thekey))
 | |
| 					{
 | |
| 						toItem = dicTrans_ItemIds[thekey];
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						// note that parent is null right now - it will be filled in later.
 | |
| 						//toItem = Item.MakeItem(null, fromCon, DateTime.Now, "Migration");
 | |
| 						toItem = Item.New(null, TransDummyCont, DateTime.Now, "Migration");
 | |
| 						dicTrans_ItemIds.Add(thekey, toItem);
 | |
| 						_TransitionMigrationErrors.Add(thekey);
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// if there is data in dr2, it means that it is a range transition. Get its item
 | |
| 				// data too.
 | |
| 				toItem2 = toItem;
 | |
| 				if (dr2 != null)
 | |
| 				{
 | |
| 					string thekey2 = dr2["TONUMBER"].ToString() + "|" + dr2["TOSEQUENCE"].ToString();
 | |
| 					if (dicTrans_ItemDone.ContainsKey(thekey2))
 | |
| 					{
 | |
| 						toItem2 = dicTrans_ItemDone[thekey2];
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if (dicTrans_ItemIds.ContainsKey(thekey2))
 | |
| 						{
 | |
| 							toItem2 = dicTrans_ItemIds[thekey2];
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							toItem2 = Item.MakeItem(null, TransDummyCont, DateTime.Now, "Migration");
 | |
| 							dicTrans_ItemIds.Add(thekey2, toItem2);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
|             if (userid == null || userid == "") userid = "Migration";
 | |
|             Transition tr = null;
 | |
|             try
 | |
|             {
 | |
|                 tr = Transition.New(fromCon, toItem, toItem2, itype, ci!=null?ci.ToString():null, dts, userid);
 | |
| 					 //if (otranskey != null)
 | |
| 					 //  tr.MyZTransition.Oldto = otranskey; // info to finish outside transition processing later
 | |
| 					 //else
 | |
| 						tr.MyZTransition.Oldto = dr["OLDTO"].ToString();
 | |
| 				if (!tr.IsSavable) ErrorRpt.ErrorReport(tr);
 | |
| 				tr.Save();
 | |
| 				if (migrationErrors.Count > 0)
 | |
| 					_ContentMigrationErrors.Add(fromCon.ContentID, migrationErrors);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 log.Error("Error addition transition record");
 | |
|                 log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
 | |
|             }
 | |
| 			string results = null;
 | |
| 			if (toItem.ItemID == toItem2.ItemID)
 | |
| 				results = string.Format(@"(Resolved Transition Text)\v #Link:Transition:{0} {1} {2}\v0", tr.TranType, tr.TransitionID, tr.ToID);
 | |
| 			else
 | |
| 				results = string.Format(@"(Resolved Transition Text)\v #Link:TransitionRange:{0} {1} {2} {3}\v0", tr.TranType, tr.TransitionID, tr.ToID, tr.RangeID);
 | |
| 			return results;
 | |
|         }
 | |
| 
 | |
|         private string MigrateTrans(OleDbConnection cn, string textm, string seqcvt, Content content, string pth)
 | |
| 		{
 | |
| 			  // TODO:  BYRON DATA WILL GENERATE A TRANSITION ERROR WHEN IT IS USED IN PROMS 2010
 | |
| 			StringBuilder trtxt = new StringBuilder();
 | |
| 			int instance = 0;
 | |
| 			int beg = 0;
 | |
| 			DataTable dt = null;
 | |
| 			DataSet ds = null;
 | |
| 			OleDbDataAdapter da = null;
 | |
| 
 | |
| 			char[] chrtrn = { '\x252C', '\x2566' };
 | |
| 			int tok = textm.IndexOfAny(chrtrn);
 | |
| 			if (tok > -1)
 | |
| 			{
 | |
|                 string cmd = "SELECT * FROM [tran] WHERE [FROMNUMBER]='" + ProcNumber.Replace("'", "''") + "' AND [FROMSEQUEN] ='" + seqcvt + "' ORDER BY [FROMINSTAN]";
 | |
| 				da = new OleDbDataAdapter(cmd, cn);
 | |
| 				// get transition records for this step.
 | |
| 				ds = new DataSet();
 | |
| 				try
 | |
| 				{
 | |
| 					da.Fill(ds);
 | |
| 					dt = ds.Tables[0];
 | |
| 					dt.CaseSensitive = true;
 | |
| 				}
 | |
| 				catch (Exception ex)
 | |
| 				{
 | |
| 					log.Error("Error getting transitions");
 | |
|                     log.ErrorFormat("from number = {0} oldstepsequence = {1}", ProcNumber, seqcvt);
 | |
|                     log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
 | |
| 					return textm;
 | |
| 				}
 | |
| 			}
 | |
| 			while (tok > -1)
 | |
| 			{
 | |
| 				// found a transition token, add the token and transition id into the string and
 | |
| 				// add an transition record for it.  Later there may be text added.
 | |
| 				trtxt.Append(textm.Substring(beg, tok - beg));
 | |
| 				// we have too many tokens and not enough usage records - report an error...
 | |
| 				if (instance >= dt.Rows.Count)
 | |
| 				{
 | |
|                     log.ErrorFormat("Error - ran out of transition records for step, check data ");
 | |
|                     log.ErrorFormat("from number = {0} oldstepsequence = {1}", ProcNumber, seqcvt);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					DataRow dr = dt.Rows[instance];
 | |
| 
 | |
|                     // if type is 2 or 3, this is a range transition, need to get the next
 | |
|                     // record too
 | |
|                     bool trange = false;
 | |
|                     if (dr["Type"].ToString() == "2" || dr["Type"].ToString() == "3")
 | |
|                         trange = true;
 | |
| 
 | |
|                     string rectxt = null;
 | |
|                     if (trange)
 | |
|                     {
 | |
|                         instance++;
 | |
|                         DataRow dr2 = dt.Rows[instance];
 | |
| 								rectxt = AddTrans(cn, content, dr, dr2, pth);
 | |
|                     }
 | |
|                     else
 | |
| 							  rectxt = AddTrans(cn, content, dr, null, pth);
 | |
| 					trtxt.Append(textm[tok]);
 | |
|                     trtxt.Append(rectxt);
 | |
| 				}
 | |
| 				instance++;
 | |
| 				beg = tok + 1;
 | |
| 				if (beg > textm.Length)
 | |
| 				{
 | |
| 					tok = -1;
 | |
| 					da.Dispose();
 | |
| 				}
 | |
| 				else
 | |
| 					tok = textm.IndexOfAny(chrtrn, beg);
 | |
| 			}
 | |
| 			if (beg < textm.Length - 1)
 | |
| 				trtxt.Append(textm.Substring(beg, textm.Length - beg));
 | |
| 			if (dt.Rows.Count > instance + 1)
 | |
| 			{
 | |
|                 log.ErrorFormat("Error - extra transition records for step, check data ");
 | |
|                 log.ErrorFormat("from number = {0} oldstepsequence = {1}", ProcNumber, seqcvt);
 | |
| 			}
 | |
| 			return trtxt.ToString();
 | |
| 		}
 | |
| 		private void ShowMissingTransitions()
 | |
| 		{
 | |
| 			if (dicTrans_ItemIds.Keys.Count > 0)
 | |
| 			log.Warn("Missing Transitions from Dictionary");
 | |
| 			foreach (string s in dicTrans_ItemIds.Keys)
 | |
| 			{
 | |
| 				log.WarnFormat("{0} - {1}", s, dicTrans_ItemIds[s]);
 | |
| 				//AddItemAnnotation(dicTrans_ItemIds[s]);
 | |
| 			}
 | |
| 			foreach (string s in dicTrans_MigrationErrors.Keys)
 | |
| 			{
 | |
| 				foreach (Item itm in dicTrans_MigrationErrors[s])
 | |
| 				{
 | |
| 					ItemAnnotation ia = itm.ItemAnnotations.Add(MigrationErrorType);
 | |
| 					ia.SearchText = "Transition Error: Destination Missing - " + s;
 | |
| 					ia.UserID = "Migration";
 | |
| 					itm.Save();
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if (TransDummyCont.ContentItemCount > 0)
 | |
| 				log.Warn("Bad transitions to 'dummy' content");
 | |
| 			foreach (ContentItem itm in TransDummyCont.ContentItems)
 | |
| 			{
 | |
| 				log.WarnFormat("ItemID = {0}", itm.ItemID);
 | |
| 				//AddItemAnnotation(itm.MyItem);
 | |
| 			}
 | |
| 
 | |
|             log.Info("End of Missing Transitions");
 | |
| 		}
 | |
| 
 | |
| 		private void AddItemAnnotation(Item itm)
 | |
| 		{
 | |
| 			foreach (ItemTransition_ToID tmp in itm.ItemTransitions_ToID)
 | |
| 			{
 | |
| 				foreach (ContentItem ci in tmp.MyContent.ContentItems)
 | |
| 				{
 | |
| 					ItemAnnotation ia = ci.MyItem.ItemAnnotations.Add(MigrationErrorType);
 | |
| 					ia.SearchText = "Transition Error: Missing end point";
 | |
| 					ia.UserID = "Migration";
 | |
| 					ci.MyItem.Save();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| } | 
