// ======================================================================== // 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 { private string AddTrans(Content fromCon, DataRow dr, DataRow dr2) { //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; // 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 (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); } } // 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); tr.MyZTransition.Oldto = dr["OLDTO"].ToString(); if (!tr.IsSavable) ErrorRpt.ErrorReport(tr); tr.Save(); } catch (Exception ex) { log.Error("Error addition transition record"); log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException); } StringBuilder trtxt = new StringBuilder(); // the following is pre RTB link code, i.e. {tranid {type toid (rangeid}} trtxt.Append("\\v TRAN\\v0 (Resolved Transition Text)\\v "); trtxt.Append(tr.TranType.ToString()); trtxt.Append(" "); trtxt.Append(tr.TransitionID.ToString()); trtxt.Append(" "); trtxt.Append(tr.ToID.ToString()); if (toItem.ItemID == toItem2.ItemID) trtxt.Append("\\v0 "); else { trtxt.Append(" "); trtxt.Append(tr.RangeID.ToString()); trtxt.Append("\\v0 "); } //trtxt.Append("{"); //trtxt.Append(tr.TransitionID.ToString()); //trtxt.Append("{"); //trtxt.Append(tr.TranType.ToString()); //trtxt.Append(" "); //trtxt.Append(tr.ToID.ToString()); //if (toItem.ItemID == toItem2.ItemID) // trtxt.Append("}}"); //else //{ // trtxt.Append(" "); // trtxt.Append(tr.RangeID.ToString()); // trtxt.Append("}}"); //} return trtxt.ToString(); } private string MigrateTrans(OleDbConnection cn, string textm, string seqcvt, Content content) { 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(content, dr, dr2); } else rectxt = AddTrans(content, dr, null); 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() { log.Info("Missing Transitions from Dictionary"); foreach (string s in dicTrans_ItemIds.Keys) { log.InfoFormat("{0} - {1}", s, dicTrans_ItemIds[s]); } log.Info("Bad transitions to 'dummy' content"); foreach (ContentItem itm in TransDummyCont.ContentItems) { log.InfoFormat("ItemID = {0}", itm.ItemID); } log.Info("End of Missing Transitions"); } } }