236 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.IO;
 | |
| using System.Xml;
 | |
| using System.Text.RegularExpressions;
 | |
| using VEPROMS.CSLA.Library;
 | |
| using Config;
 | |
| 
 | |
| namespace DataLoader
 | |
| {
 | |
| 	public partial class Loader
 | |
| 	{
 | |
| 		public void MigrateROFST(string fstPath, DocVersion docver)
 | |
| 		{
 | |
| 			//if (!File.Exists(fstPath + @"\ro.fst"))
 | |
| 			//{
 | |
| 			//    log.ErrorFormat("RO FST Does not exist: {0}", fstPath);
 | |
| 			//    return;
 | |
| 			//}
 | |
| 			// get the proc.ini value for the ropath.  If it doesn't exist, use "..\"
 | |
| 			ConfigFile cfg = new ConfigFile();
 | |
| 			XmlDocument d = cfg.IniToXml(fstPath + @"\proc.ini");
 | |
| 			string roDbpath = null;
 | |
| 			string sp_prefix = null;
 | |
| 			string img_prefix = null;
 | |
| 			if (d != null)
 | |
| 			{
 | |
| 				XmlElement xml = d.DocumentElement;
 | |
| 				XmlNode rodef = xml.SelectSingleNode("//RODefaults");
 | |
| 				XmlElement ele = rodef as XmlElement;
 | |
| 				//string tmp = null;
 | |
| 				if (ele != null)
 | |
| 				{
 | |
| 					roDbpath = ele.GetAttribute("ROPATH");
 | |
| 					sp_prefix = ele.GetAttribute("Setpoint");
 | |
| 					img_prefix = ele.GetAttribute("Graphics");
 | |
| 				}
 | |
| 			}
 | |
| 			DirectoryInfo di2 = new DirectoryInfo(fstPath);
 | |
| 			roDbpath = roDbpath ?? "";
 | |
| 			if (roDbpath == "")
 | |
| 				roDbpath = @"..\ro";
 | |
| 			if (roDbpath.StartsWith(@"..\"))
 | |
| 			{
 | |
| 				while (roDbpath.StartsWith(@"..\"))
 | |
| 				{
 | |
| 					di2 = di2.Parent;
 | |
| 					roDbpath = roDbpath.Substring(3);
 | |
| 				}
 | |
| 				DirectoryInfo[] dis = di2.GetDirectories(roDbpath);
 | |
| 				if (dis.Length > 0) roDbpath = dis[0].FullName;
 | |
| 			}
 | |
| 			//if (roDbpath == null || roDbpath == "")
 | |
| 			//	roDbpath = fstPath.Substring(0, fstPath.LastIndexOf('\\')) + @"\ro";
 | |
| 
 | |
| 			// first see if this rodb has been migrated (another dataset may have migrated it)
 | |
| 				DirectoryInfo di = new DirectoryInfo(roDbpath);
 | |
| 			rodb = RODb.GetByFolderPath(di.FullName);
 | |
| 			if (rodb == null)
 | |
| 			{
 | |
| 
 | |
| 				// There may be more than 1 'ro' as the 'ROName' field (ROName is derived from the ropath).
 | |
| 				// Get new name be incrementing, if so.
 | |
| 				string newname = NewROName(di.Name);
 | |
| 				// If there is default graphic file extension data in the roapp.ini, use this as config
 | |
| 				// data for the rodb, otherwise set it to 'cstring' for now.  
 | |
| 				cfg = new ConfigFile();
 | |
| 				d = cfg.LoadRoAppIni(roDbpath);
 | |
| 				rodb = RODb.MakeRODb(di.Name, di.FullName, "cstring", d==null?null:d.InnerXml);
 | |
| 			}
 | |
| 
 | |
| 			// now see if the same ro.fst has been migrated.  To determine this check if a record
 | |
| 			// exists for the rodb and with the same dts as the file.
 | |
| 			FileInfo fi = new FileInfo(fstPath + @"\ro.fst");
 | |
| 			if (!fi.Exists)
 | |
| 				fi = new FileInfo(roDbpath + @"\ro.fst");
 | |
| 
 | |
| 			ROFst rofst = ROFst.GetByRODbID_DTS(rodb.RODbID, fi.LastWriteTimeUtc);
 | |
| 			if (rofst == null) // if not already in our database, then add it.
 | |
| 			{
 | |
| 				// Next read in the rofst & make the rofst record.
 | |
| 				FileStream fsIn = new FileStream(fi.FullName, 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);
 | |
| 				//r.Close();
 | |
| 				fsIn.Close();
 | |
| 				// get the date time stamp, need to create the record with the file's dts.
 | |
| 				rofst = ROFst.MakeROFst(rodb, ab, null, fi.LastWriteTimeUtc, "Migration");
 | |
| 			}
 | |
| 			// Next hook the rofst to the docversion using the associations table.
 | |
| 			bool appending = false;
 | |
| 			if (docver.DocVersionAssociationCount == 0)
 | |
| 			{
 | |
| 				DocVersionAssociation dva = docver.DocVersionAssociations.Add(rofst);
 | |
| 				AssociationConfig assoc_cfg = new AssociationConfig();
 | |
| 				assoc_cfg.RODefaults_graphicsprefix = img_prefix;
 | |
| 				assoc_cfg.RODefaults_setpointprefix = sp_prefix;
 | |
| 				dva.Config = assoc_cfg.ToString();
 | |
| 				docver.Save();
 | |
| 				rofst.Dispose();
 | |
| 			}
 | |
| 			else
 | |
| 				appending = true;
 | |
| 			rofstinfo = ROFstInfo.Get(rofst.ROFstID);  // refresh the info record!
 | |
| 			
 | |
| 			// Now load any images in... type  8: // Intergrated Graphics RO type
 | |
| 			ROFSTLookup mylookup = rofstinfo.GetROFSTLookup(DocVersionInfo.Get(docver.VersionID));
 | |
| 			if (!appending &&  mylookup != null)
 | |
| 			{
 | |
| 				for (int i = 0; i < mylookup.myHdr.myDbs.Length; i++)
 | |
| 				{
 | |
| 					// walk through the rofst 'database' searching for
 | |
| 					// all nodes that are integrated graphics, i.e. type 8.
 | |
| 					if (mylookup.myHdr.myDbs[i].children != null)
 | |
| 						MigrateRoFstGraphics(roDbpath, mylookup.myHdr.myDbs[i].children, rodb);
 | |
| 				}
 | |
| 			}
 | |
| 			ROImageInfo.FlagImagesZipped();
 | |
| 		}
 | |
| 
 | |
| 		private 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(string rodbpath, ROFSTLookup.rochild[] rochild, RODb rodb)
 | |
| 		{
 | |
| 			for (int i = 0; i < rochild.Length; i++)
 | |
| 			{
 | |
| 				if (rochild[i].type == 8) AddGraphic(rodbpath, rochild[i].value, rodb);
 | |
| 				if (rochild[i].children != null) MigrateRoFstGraphics(rodbpath, rochild[i].children, rodb);
 | |
| 			}
 | |
| 		}
 | |
| 		private void AddGraphic(string rodbpath, string p, RODb rodb)
 | |
| 		{
 | |
| 			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(rodb.Config);
 | |
| 				fname += string.Format(".{0}", roDbCfg.GetDefaultGraphicExtension());
 | |
| 			}
 | |
| 
 | |
| 			string imgfile = rodbpath + @"\" + fname;
 | |
| 			if (File.Exists(imgfile))
 | |
| 			{
 | |
| 				FileInfo fi = new FileInfo(imgfile);
 | |
| 				frmMain.Status = "Processing Image " + fname;
 | |
| 				// if the roimage record exists, don't create a new one...
 | |
| 				//Console.WriteLine("ROImage Key {0} List {1} ID {2}", ROImage.CacheCountPrimaryKey, ROImage.CacheCountList, ROImage.CacheCountByRODbID);
 | |
| 				//Console.WriteLine("ROImageInfo Key {0} List {1}", ROImageInfo.CacheCountPrimaryKey, ROImageInfo.CacheCountList);
 | |
| 				//Console.WriteLine("ROFst Key {0} List {1} ID {2}", ROFst.CacheCountPrimaryKey, ROFst.CacheCountList, ROFst.CacheCountByRODbID_DTS);
 | |
| 				//Console.WriteLine("ROFstInfo Key {0} List {1}", ROFstInfo.CacheCountPrimaryKey, ROFstInfo.CacheCountList);
 | |
| 				frmMain.AddInfo("Adding RO Image {0}", imgname);
 | |
| 				//using (roImg = ROImage.GetByRODbID_FileName_DTS(rodb.RODbID, imgname, fi.LastWriteTimeUtc))
 | |
| 				//{
 | |
| 				ROImage roImg = null;
 | |
| 				roImg = GetImageFromAvailable(rodb.RODbID, imgname, fi.LastWriteTimeUtc);
 | |
| 				if (roImg == null)
 | |
| 				{
 | |
| 					roImg = ROImage.GetByRODbID_FileName_DTS(rodb.RODbID, imgname, fi.LastWriteTimeUtc);
 | |
| 					if (roImg == null)
 | |
| 					{
 | |
| 						using (FileStream fsIn = new FileStream(imgfile, 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);
 | |
| 							r.Close();
 | |
| 							fsIn.Close();
 | |
| 							ConfigInfo ci = new ConfigInfo(null);
 | |
| 							ci.AddItem("Image", "Size", ab.Length.ToString());
 | |
| 							roImg = ROImage.MakeROImage(rodb, imgname, ROImageInfo.Compress(ab), ci.ToString(), fi.LastWriteTimeUtc, "Migration");
 | |
| 						}
 | |
| 					}
 | |
| 					AddToAvailable(roImg, rodb.RODbID, imgname, fi.LastWriteTimeUtc);
 | |
| 				}
 | |
| 				// see if it's already linked to the current rofst..
 | |
| 				//Figure figure = Figure.GetByROFstID_ImageID(rofstinfo.ROFstID, roImg.ImageID);
 | |
| 				using (Figure figure = Figure.GetByROFstID_ImageID(rofstinfo.ROFstID, roImg.ImageID))
 | |
| 				{
 | |
| 					if (figure != null) return;
 | |
| 					//using (ROFst rofst = rofstinfo.Get())
 | |
| 					ROFst rofst = rofstinfo.Get(); // Use the cached ROFST rather than creating and disposing
 | |
| 					//figure = Figure.MakeFigure(rofst, roImg, null);
 | |
| 					using (Figure tfig = Figure.MakeFigure(rofst, roImg, null)) ;
 | |
| 				}
 | |
| 				//roImg.Dispose();
 | |
| 			}
 | |
| 			else
 | |
| 				frmMain.AddError("Cannot Find Image File {0}", imgfile);
 | |
| 		}
 | |
| 
 | |
| 		private void AddToAvailable(ROImage roImg, int dbid, string imgname, DateTime dateTime)
 | |
| 		{
 | |
| 			string key = AvailableKey(dbid, imgname, dateTime);
 | |
| 			_AvaiableROImages.Add(key, roImg);
 | |
| 		}
 | |
| 
 | |
| 		private string AvailableKey(int dbid, string imgname, DateTime dateTime)
 | |
| 		{
 | |
| 			return string.Format("{0}|{1}|{2}", dbid, imgname, dateTime.ToString("yyyyMMdd HHmmss"));
 | |
| 		}
 | |
| 
 | |
| 		private ROImage GetImageFromAvailable(int dbid, string imgname, DateTime dateTime)
 | |
| 		{
 | |
| 			string key = AvailableKey(dbid, imgname, dateTime);
 | |
| 			if (_AvaiableROImages.ContainsKey(key)) return _AvaiableROImages[key];
 | |
| 			return null;
 | |
| 		}
 | |
| 		private Dictionary<string, ROImage> _AvaiableROImages = new Dictionary<string, ROImage>();
 | |
| 	}
 | |
| }
 | 
