// ======================================================================== // 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> _ContentMigrationErrors = new Dictionary>(); List _TransitionMigrationErrors = null; //private void AddContentMigrationError(Content fromCon,string errorMsg) //{ // if (!_ContentMigrationErrors.ContainsKey(fromCon.ContentID)) // _ContentMigrationErrors.Add(fromCon.ContentID,new List()); // _ContentMigrationErrors[fromCon.ContentID].Add(errorMsg); //} private string AddTrans(OleDbConnection cn, Content fromCon, DataRow dr, DataRow dr2, string pth) { List migrationErrors = new List(); //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(); } } } } }