// ======================================================================== // 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.Collections.Generic; using System.Collections.Specialized; using System.Text; using System.IO; using System.Xml.Serialization; using System.Xml; using System.Xml.XPath; using System.Text.RegularExpressions; using System.Data; using System.Data.SqlClient; using Csla; using Csla.Data; namespace VEPROMS.CSLA.Library { public partial class ROFst { [NonSerialized] private ROFSTLookup _ROFSTLookup; public ROFSTLookup ROFSTLookup { get { if (_ROFSTLookup == null) { _ROFSTLookup = new ROFSTLookup(this); } return _ROFSTLookup; } } } public delegate List ROFstInfoROTableUpdateEvent(object sender, ROFstInfoROTableUpdateEventArgs args); public partial class ROFstInfo { #region Log4Net private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endregion #region PropertiesAndData private DocVersion _docVer; public DocVersion docVer { get { if (_docVer == null) { if (ROFstAssociations.Count == 0) return null; _docVer = DocVersion.Get(this.ROFstAssociations[0].MyDocVersion.VersionID); } return _docVer; } set { _docVer = value; } } [NonSerialized] private ROFSTLookup _ROFSTLookup; public ROFSTLookup ROFSTLookup { get { if (_ROFSTLookup == null) { _ROFSTLookup = new ROFSTLookup(this); } return _ROFSTLookup; } } #endregion #region AppSupport //public static ROImageInfo Get(RODbInfo rodbinfo, string filename) //{ // if (rodbinfo.RODbROImageCount != 0) // { // foreach (ROImageInfo ri in rodbinfo.RODbROImages) // { // if (ri.FileName == filename) return ri; // } // } // return null; //} public string GetDefaultROPrefix() { if (docVer != null) return docVer.DocVersionConfig.RODefaults_setpointprefix; else return "SP1"; // Not Sure about this... } public string GetDefaultGraphicsPrefix() { if (docVer != null) return docVer.DocVersionConfig.RODefaults_graphicsprefix; else return "IG1"; // Not Sure about this... } #region Add New Ro Fst /// /// Adds an ro.fst into a sql database. /// /// /// ROFst: Returns the created rofst object public static ROFst AddRoFst(RODbInfo rdi, DocVersion docver) { string rofstfilepath = rdi.FolderPath + @"\ro.fst"; DirectoryInfo di = new DirectoryInfo(rdi.FolderPath); // check if this rofst has been loaded, i.e. dts on file versus dts in db... // if so, just make association with docversion. ROFst rofst = ROFst.GetByRODbID_DTS(rdi.RODbID, di.LastWriteTime); if (rofst != null) { docver.DocVersionAssociations.Add(rofst); docver.Save(); return rofst; } // Next read in the rofst & make the rofst record. FileStream fsIn = new FileStream(rofstfilepath, FileMode.Open, FileAccess.Read, FileShare.Read); // Create an instance of StreamReader that can read characters from the FileStream. BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); fsIn.Close(); using (RODb rd = RODb.Get(rdi.RODbID)) { rofst = ROFst.MakeROFst(rd, ab, null, di.LastWriteTime, rdi.UserID); // Hook this into the current docversion by replacing the rofstid field in the doc version // association object: docver.DocVersionAssociations.Add(rofst); docver.Save(); // Now load any images in... type 8 - integrated graphics ro type for (int i = 0; i < rofst.ROFSTLookup.myHdr.myDbs.Length; i++) { // walk through the rofst 'database' searching for all nodes that are integrated graphics, type 8: if (rofst.ROFSTLookup.myHdr.myDbs[i].children != null) { using (ROFstInfo rfi = ROFstInfo.Get(rofst.ROFstID)) { rfi.MigrateRoFstGraphics(rdi, rofst.ROFSTLookup.myHdr.myDbs[i].children); } } } return rofst; } } #endregion #region Update Ro Values /// /// Updates an ro.fst into a sql database. /// /// /// ROFst: Returns the created rofst object public static ROFst UpdateRoFst(RODbInfo rdi, DocVersionAssociation dva, DocVersion docver, ROFstInfo origROFst) { DirectoryInfo di = new DirectoryInfo(rdi.FolderPath); // check if this rofst has been loaded, i.e. dts on file versus dts in db... // if so, just make association to existing with docversion. ROFst rofst = ROFst.GetByRODbID_DTS(rdi.RODbID, di.LastWriteTime); if (rofst != null) { docver.DocVersionAssociations[0].MyROFst = rofst; docver.Save(); return rofst; } // Read in the rofst & make the rofst record. string rofstfilepath = rdi.FolderPath + @"\ro.fst"; FileStream fsIn = new FileStream(rofstfilepath, FileMode.Open, FileAccess.Read, FileShare.Read); // Create an instance of StreamReader that can read characters from the FileStream. BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); fsIn.Close(); using (RODb rd = RODb.Get(rdi.RODbID)) { rofst = ROFst.MakeROFst(rd, ab, null, di.LastWriteTime, rdi.UserID); // Hook this into the current docversion by replacing the rofstid field in the doc version // association object: dva.MyROFst = rofst; docver.Save(); // Now load any images in... type 8 - integrated graphics ro type for (int i = 0; i < rofst.ROFSTLookup.myHdr.myDbs.Length; i++) { // walk through the rofst 'database' searching for all nodes that are integrated graphics, type 8: if (rofst.ROFSTLookup.myHdr.myDbs[i].children != null) { using (ROFstInfo rfi = ROFstInfo.Get(rofst.ROFstID)) { rfi.MigrateRoFstGraphics(rdi, rofst.ROFSTLookup.myHdr.myDbs[i].children); } } } // Now update the usages: compare old to new rofsts and update usages accordingly, i.e. modified // values, deleted ros, etc. UpdateROValuesText(origROFst, rofst); return rofst; } } private static void UpdateROValuesText(ROFstInfo origROFstInfo, ROFst newROFst) { ROFSTLookup origLU = new ROFSTLookup(origROFstInfo); ROFSTLookup newLU = new ROFSTLookup(newROFst); List delList = new List(); List chgList = newLU.GetValueDifferences(origLU, ref delList); foreach (string chg in chgList) { ROFSTLookup.rochild roch = newLU.GetRoChild(chg); string desc = string.Format("Change in RO Values: Old value = {0}, New value = {1}", origLU.GetRoValue(chg), roch.value); // roid's are stored in database as 16 characters long in the rousages table. They may be stored // as 12 characters in the ro.fst. string padroid = chg.Length <= 12 ? chg + "0000" : chg; using (RoUsageInfoList affected = RoUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroid, desc, "Changed")) { foreach (RoUsageInfo roUsg in affected) { using (Content content = Content.Get(roUsg.MyContent.ContentID)) { content.FixContentText(roUsg, roch, origROFstInfo); if (content.IsDirty) content.Save(); } } } using (DROUsageInfoList affected = DROUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroid, desc, "Changed")) { foreach (DROUsageInfo droUsg in affected) { //using (Document document = Document.Get(droUsg.DocID)) //{ Pdf.DeleteAll(droUsg.DocID); // Delete PDFs //if (document.DocPdf != null) //{ // document.DocPdf = null; // document.Save(); //} //} } } } foreach (string del in delList) { Console.WriteLine("Deleted ROID = {0}", del); string desc = string.Format("Deleted RO: Value = {0}", origLU.GetRoValue(del)); string padroiddel = del.Length <= 12 ? del + "0000" : del; using (RoUsageInfoList affected = RoUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroiddel, desc, "Deleted")) ; using (DROUsageInfoList Daffected = DROUsageInfoList.GetAffected(origROFstInfo.MyRODb.RODbID, padroiddel, desc, "Deleted")) ; } } private static string NewROName(string roName) { string retval = roName; int iSuffix = -1; RODbInfoList rodblist = RODbInfoList.Get(); foreach (RODbInfo rdi in rodblist) { if (rdi.ROName.StartsWith(roName)) { if (rdi.ROName == roName) iSuffix = 0; else if (Regex.IsMatch(rdi.ROName, roName + "[_][0-9]+")) { int ii = int.Parse(rdi.ROName.Substring(1 + roName.Length)); if (ii > iSuffix) iSuffix = ii; } } } if (iSuffix >= 0) retval = string.Format("{0}_{1}", roName, iSuffix + 1); return retval; } private void MigrateRoFstGraphics(RODbInfo rdi, ROFSTLookup.rochild[] rochild) { for (int i = 0; i < rochild.Length; i++) { if (rochild[i].type == 8) this.AddGraphic(rdi, rochild[i].value); if (rochild[i].children != null) this.MigrateRoFstGraphics(rdi, rochild[i].children); } } private void AddGraphic(RODbInfo rdi, string p) { if (p == null) return; string imgname = p.Substring(0, p.IndexOf('\n')); int thedot = imgname.LastIndexOf('.'); string fname = imgname; if (thedot == -1 || (thedot != (imgname.Length - 4))) { RODbConfig roDbCfg = new RODbConfig(rdi.Config); fname += string.Format(".{0}", roDbCfg.GetDefaultGraphicExtension()); } string imgfile = rdi.FolderPath + @"\" + fname; ROImage roImg = null; if (File.Exists(imgfile)) { FileInfo fi = new FileInfo(imgfile); // if the roimage record exists, don't create a new one... using (roImg = ROImage.GetByRODbID_FileName_DTS(rdi.RODbID, imgname,fi.LastWriteTime)) { if (roImg == null) { FileStream fsIn = new FileStream(imgfile, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader r = new BinaryReader(fsIn); byte[] ab = r.ReadBytes((int)fsIn.Length); r.Close(); fsIn.Close(); using (RODb rodb = RODb.Get(rdi.RODbID)) { roImg = ROImage.MakeROImage(rodb, imgname, ab, null, fi.LastWriteTime, "Migration"); } } Figure figure = Figure.GetByROFstID_ImageID(this.ROFstID, roImg.ImageID); if (figure != null) return; using (ROFst rofst = ROFst.Get(this.ROFstID)) { figure = Figure.MakeFigure(rofst, roImg, null); } } } else Console.WriteLine(string.Format("{0}", imgfile), "Cannot Find Image File"); } #endregion #endregion public bool IsSetpointDB(int id) { ROFSTLookup.rodbi[] dbs = ROFSTLookup.GetRODatabaseList(); foreach (ROFSTLookup.rodbi rodbi in dbs) { if (id == rodbi.dbiID) return (rodbi.dbiAP.StartsWith("SP")); } return false; } public event ROFstInfoROTableUpdateEvent ROTableUpdate; public List OnROTableUpdate(object sender, ROFstInfoROTableUpdateEventArgs args) { if (ROTableUpdate != null) return ROTableUpdate(sender, args); return null; } } public class ROFstInfoROTableUpdateEventArgs { private string _ROText; public string ROText { get { return _ROText; } set { _ROText = value; } } private string _OldGridXml; public string OldGridXml { get { return _OldGridXml; } set { _OldGridXml = value; } } public ROFstInfoROTableUpdateEventArgs(string rotext, string oldgridxml) { _ROText = rotext; _OldGridXml = oldgridxml; } } public partial class ROFstInfoList { [Serializable()] private class RoFstSizeCriteria { public RoFstSizeCriteria(int roDbID, int len) { _RODbID = roDbID; _Len = len; } private int _RODbID; public int RODbID { get { return _RODbID; } set { _RODbID = value; } } private int _Len; public int Len { get { return _Len; } set { _Len = value; } } } public static ROFstInfoList GetBySize(int roDbID, int len) { try { ROFstInfoList tmp = DataPortal.Fetch(new RoFstSizeCriteria(roDbID, len)); ROFstInfo.AddList(tmp); tmp.AddEvents(); return tmp; } catch (Exception ex) { throw new DbCslaException("Error on RoFstInfoList.GetBySize", ex); } } private void DataPortal_Fetch(RoFstSizeCriteria criteria) { this.RaiseListChangedEvents = false; if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ROFstInfoList.DataPortal_FetchBySize", GetHashCode()); try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) { using (SqlCommand cm = cn.CreateCommand()) { cm.CommandType = CommandType.StoredProcedure; cm.CommandText = "getRoFstBySize"; cm.Parameters.AddWithValue("@RODbID", criteria.RODbID); cm.Parameters.AddWithValue("@Len", criteria.Len); using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader())) { IsReadOnly = false; while (dr.Read()) this.Add(new ROFstInfo(dr)); IsReadOnly = true; } } } } catch (Exception ex) { if (_MyLog.IsErrorEnabled) _MyLog.Error("ROFstInfoList.DataPortal_FetchBySize", ex); throw new DbCslaException("ROFstInfoList.DataPortal_FetchBySize", ex); } this.RaiseListChangedEvents = true; } } }