378 lines
14 KiB
C#
378 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Data.SqlClient;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace FindLinx
|
|
{
|
|
public partial class frmFindLinx : Form
|
|
{
|
|
public frmFindLinx()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
public string MyStatus
|
|
{
|
|
get { return tsslStatus.Text; }
|
|
set { tsslStatus.Text = value; Application.DoEvents(); }
|
|
}
|
|
private static string _SelectedDatabase = null;
|
|
public static string SelectedDatabase
|
|
{
|
|
get { return frmFindLinx._SelectedDatabase; }
|
|
set
|
|
{
|
|
frmFindLinx._SelectedDatabase = value;
|
|
_ConnectionString = _MenuConnectionString.Replace("{MENU}", SelectedDatabase);
|
|
}
|
|
}
|
|
private static string _MenuConnectionString = @"Data Source=VOLIAN-SERVER;User Id=proms2010;password=proms2010;Initial Catalog={MENU}";
|
|
private static string _ConnectionString = null;
|
|
private Dictionary<int, string> _MyContents = null;
|
|
private void chooseDBToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ChooseDatabase();
|
|
findLinxToolStripMenuItem.Enabled = true;
|
|
LoadContents();
|
|
ResetLinks();
|
|
FindLinks();
|
|
//ShowLinks(SelectedDatabase);
|
|
}
|
|
private void ChooseDatabase()
|
|
{
|
|
System.Windows.Forms.ContextMenuStrip cms = BuildDatabaseMenu();
|
|
SelectedDatabase = null;
|
|
while (SelectedDatabase == null)
|
|
{
|
|
cms.Show(new System.Drawing.Point((System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - cms.Width) / 2, (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - cms.Height) / 2));
|
|
System.Windows.Forms.Application.DoEvents();
|
|
}
|
|
}
|
|
private static System.Windows.Forms.ContextMenuStrip BuildDatabaseMenu()
|
|
{
|
|
System.Windows.Forms.ContextMenuStrip cms = new System.Windows.Forms.ContextMenuStrip();
|
|
cms.Items.Add("Choose Database");
|
|
System.Windows.Forms.ToolStripMenuItem tsmi = cms.Items[0] as System.Windows.Forms.ToolStripMenuItem;
|
|
tsmi.BackColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaption);// System.Drawing.Color.Pink;
|
|
tsmi.ForeColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaptionText);
|
|
tsmi.Font = new System.Drawing.Font(tsmi.Font, System.Drawing.FontStyle.Bold);
|
|
foreach (string name in DBNames)
|
|
cms.Items.Add(name, null, new EventHandler(Database_Click));
|
|
return cms;
|
|
}
|
|
private static List<string> _DBNames;
|
|
public static List<string> DBNames
|
|
{
|
|
get
|
|
{
|
|
if (_DBNames == null)
|
|
_DBNames = GetDatabases();
|
|
return _DBNames;
|
|
}
|
|
}
|
|
private static List<string> GetDatabases()
|
|
{
|
|
List<string> dbNames;
|
|
dbNames = new List<string>();
|
|
SelectedDatabase = "master";
|
|
SqlConnection cn = new SqlConnection(_ConnectionString);
|
|
cn.Open();
|
|
// SqlDataAdapter da = new SqlDataAdapter("select name from sysdatabases where name like 'VEP%' order by name", cn);
|
|
//SqlDataAdapter da = new SqlDataAdapter("select name, case when object_id('[' + name + ']..Items') is null then 'Not PROMS' when object_id('[' + name + ']..Revisions') is not null then 'Approval' when object_id('[' + name + ']..ContentAudits') is not null then 'Change Manager' else 'Original' end functionality from sysdatabases where name not in ('master','model','msdb','tempdb') order by name", cn);
|
|
SqlDataAdapter da = new SqlDataAdapter("select name from sysdatabases where name not in ('master','model','msdb','tempdb') and name like 'VEPROMS%' order by name", cn);
|
|
da.SelectCommand.CommandTimeout = 300; // 300 sec timeout
|
|
DataSet ds = new DataSet();
|
|
try
|
|
{
|
|
da.Fill(ds);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show(ex.GetType().Name, ex.Message);
|
|
throw (new Exception("Cannot Load Data List", ex));
|
|
}
|
|
cn.Close();
|
|
foreach (DataRow dr in ds.Tables[0].Rows)
|
|
dbNames.Add(dr["name"].ToString());
|
|
return dbNames;
|
|
}
|
|
private static void Database_Click(object sender, EventArgs e)
|
|
{
|
|
System.Windows.Forms.ToolStripMenuItem tsmi = sender as System.Windows.Forms.ToolStripMenuItem;
|
|
if (tsmi != null)
|
|
{
|
|
SelectedDatabase = tsmi.Text;
|
|
}
|
|
}
|
|
private void findLinxToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
FindLinks();
|
|
}
|
|
private Dictionary<string, int> DicPrefix;
|
|
private Dictionary<string, int> DicSuffix;
|
|
private void ResetLinks()
|
|
{
|
|
DicPrefix = new Dictionary<string, int>();
|
|
DicSuffix = new Dictionary<string, int>();
|
|
}
|
|
private void ShowLinks(string selectedDatabase)
|
|
{
|
|
tbResults.Clear();
|
|
SortedList<int, string> srtPrefixes = new SortedList<int, string>(new DegreeComparer());
|
|
foreach (string pre in DicPrefix.Keys)
|
|
{
|
|
srtPrefixes.Add(-DicPrefix[pre], pre);
|
|
}
|
|
tbResults.AppendText(string.Format("{0} Prefixes\r\n", selectedDatabase));
|
|
foreach (string pre in srtPrefixes.Values)
|
|
{
|
|
tbResults.AppendText(string.Format("{0},'{1}'\r\n", DicPrefix[pre], pre));
|
|
}
|
|
SortedList<int, string> srtSuffixes = new SortedList<int, string>(new DegreeComparer());
|
|
foreach (string suf in DicSuffix.Keys)
|
|
{
|
|
srtSuffixes.Add(-DicSuffix[suf], suf);
|
|
}
|
|
tbResults.AppendText(string.Format("\r\n{0} Suffixes\r\n", selectedDatabase));
|
|
foreach (string suf in srtSuffixes.Values)
|
|
{
|
|
tbResults.AppendText(string.Format("{0},'{1}'\r\n", DicSuffix[suf], suf));
|
|
}
|
|
}
|
|
private void FindLinks()
|
|
{
|
|
// loop through contents
|
|
foreach (int ic in _MyContents.Keys)// for each content record
|
|
{
|
|
string Text = _MyContents[ic];
|
|
// find all links
|
|
//string findLink = @"<START\](.*?)#Link:T(.*?)\[END>"; // need to only process transitions (no ros)
|
|
string findLink = @"<START\](.*?)\[END>"; // need to only process transitions (no ros)
|
|
MatchCollection ms = Regex.Matches(Text, findLink);
|
|
int ii = 0;
|
|
foreach (Match mlink in ms)// for each link
|
|
{
|
|
if (mlink.ToString().Contains("#Link:T"))
|
|
{
|
|
string key = string.Format("{0}.{1}.{2}", _SelectedDatabase, ic, ii);
|
|
if (key == "VEPROMS_BWD.16964.0") Console.WriteLine("Here");
|
|
string oldval = OldTransitionValue(mlink.ToString());
|
|
string newval = NewTransitionValue(mlink.ToString());
|
|
//if (oldval != newval && (!(oldval == "" && newval.Contains("Prerequisite {Prereq")) && !oldval.Contains("{First Step")) && !oldval.Contains("{Page Num")) tbResults.AppendText(string.Format("'{0}','{1}','{2}'\r\n", _SelectedDatabase, oldval, newval));
|
|
if (oldval != newval) tbResults.AppendText(string.Format("'{0}','{1}','{2}','{3}'\r\n", _SelectedDatabase, oldval, newval, mlink.ToString()));
|
|
ii++; // instance of transition
|
|
}
|
|
}
|
|
}
|
|
}
|
|
private string OldTransitionValue(string _TextAndLink)
|
|
{
|
|
Match m = Regex.Match(_TextAndLink, @"<START\](\\[^v \\]+)*\\v0(\\[^v \{\\]+)* (.*?)(\\[^v'? \\]+)*\\v(\\[^v \\]+)* #Link:(.*?)\[END>");
|
|
return m.Groups[3].ToString();
|
|
}
|
|
private string NewTransitionValue(string _TextAndLink)
|
|
{
|
|
Match m = Regex.Match(_TextAndLink, @"<START\](.*?)#Link:(.*?)\[END>"); // get value string including formatting.
|
|
string mtxt = m.Groups[1].ToString();
|
|
mtxt = Regex.Replace(mtxt, @"^(\\[^v \\]+)*\\v0", ""); // replace the rtf commands that occur prior to the value string
|
|
if (mtxt.StartsWith(" ")) mtxt = mtxt.Substring(1);
|
|
mtxt = Regex.Replace(mtxt, @"\\v(\\[^v \\]+)* $", ""); // replace the rtf commands that occur after to the value string
|
|
mtxt = Regex.Replace(mtxt, @"(\\ulnone|\\b0)+$", "");
|
|
return mtxt;
|
|
}
|
|
private string GetValuePrefix(string Text, Match mlink, int lastlink)
|
|
{
|
|
throw new Exception("The method or operation is not implemented.");
|
|
}
|
|
private string SuffixPattern(string suffix)
|
|
{
|
|
string firstchar = "";
|
|
suffix = suffix.Replace("\r", "{CR}");
|
|
suffix = suffix.Replace("\n", "{LF}");
|
|
if (Regex.IsMatch(suffix, @"^(\\(b0|b|ulnone|ul))+\\"))
|
|
{
|
|
firstchar = "{RTFCommand}";
|
|
suffix = Regex.Replace(suffix, @"^(\\(b0|b|ulnone|ul))+", "");
|
|
}
|
|
if (suffix == @"\v0 ")
|
|
return @"Pattern','" + firstchar + @"\v0{Space}";
|
|
if (suffix == @"\v0")
|
|
return @"Pattern','" + firstchar + @"\v0";
|
|
return _SelectedDatabase + "','" + suffix;
|
|
}
|
|
private string GetSuffix(string Text, Match mlink, int iEnd)
|
|
{
|
|
int iStart = mlink.Index + mlink.Length;
|
|
//int iEnd = (mlink.NextMatch() == null) ? Text.Length : mlink.NextMatch().Index;
|
|
string follows = Text.Substring(iStart,iEnd-iStart);
|
|
int iEndComment = follows.IndexOf("\\v0");
|
|
if (follows.Length > 3 + iEndComment)
|
|
{
|
|
if (follows.Substring(iEndComment + 3, 1) == " ")
|
|
return follows.Substring(0, iEndComment + 4);
|
|
if (follows.Substring(iEndComment + 3, 1) == "\\")
|
|
return follows.Substring(0, iEndComment + 3);
|
|
return follows.Substring(0, iEndComment + 3);
|
|
}
|
|
return follows;
|
|
}
|
|
public class DegreeComparer : IComparer<int>
|
|
{
|
|
#region IComparer<int> Members
|
|
public int Compare(int x, int y)
|
|
{
|
|
if (x < y)
|
|
return -1;
|
|
else
|
|
return 1;
|
|
}
|
|
#endregion
|
|
}
|
|
private string PrefixPattern(string prefix)
|
|
{
|
|
string firstchar = "";
|
|
if(prefix.StartsWith(" "))
|
|
{
|
|
firstchar = "{Space}";
|
|
prefix = prefix.Substring(1);
|
|
}
|
|
else if (prefix.StartsWith("\n"))
|
|
{
|
|
firstchar = "{Newline}";
|
|
prefix = prefix.Substring(1);
|
|
}
|
|
else if (prefix.StartsWith("\xa0"))
|
|
{
|
|
firstchar = "{HardSpace}";
|
|
prefix = prefix.Substring(1);
|
|
}
|
|
else if (Regex.IsMatch(prefix, @"^\\u[0-9]{1,4}\?"))
|
|
{
|
|
firstchar = "{Unicode}";
|
|
prefix=Regex.Replace(prefix, @"^\\u[0-9]{1,4}\?","");
|
|
}
|
|
else if (Regex.IsMatch(prefix, @"^\\'[0-9a-fA-F]{2}"))
|
|
{
|
|
firstchar = "{Hexcode}";
|
|
prefix = Regex.Replace(prefix, @"^\\'[0-9a-fA-F]{2}", "");
|
|
}
|
|
else if (Regex.IsMatch(prefix, @"^[:.()\[\]""*=<>]"))
|
|
{
|
|
firstchar = "{Punctuation}";
|
|
prefix = Regex.Replace(prefix, @"^[:.()\[\]""*=<>]", "");
|
|
}
|
|
else if (Regex.IsMatch(prefix, @"^\\[{}~]"))
|
|
{
|
|
firstchar = "{Special}";
|
|
prefix = Regex.Replace(prefix, @"^\\[{}~]", "");
|
|
}
|
|
else if (Regex.IsMatch(prefix, @"^\\(b0|b|ulnone|ul|line)\\"))
|
|
{
|
|
firstchar = "{RTFCommand}";
|
|
prefix = Regex.Replace(prefix, @"^\\(b0|b|ulnone|ul|line)", "");
|
|
}
|
|
if (prefix == @"\v ")
|
|
return @"Pattern','" + firstchar +@"\v ";
|
|
//if (prefix == @" \v ")
|
|
// return @"Pattern-{Space}\v ";
|
|
//if (prefix == "\xA0\\v ")
|
|
// return @"Pattern-{HardSpace}\v ";
|
|
//if (Regex.IsMatch(prefix, @"^\\u[0-9]{1,4}\?\\v $"))
|
|
// return @"Pattern-" + firstchar + @"{Unicode}\v ";
|
|
//if (Regex.IsMatch(prefix, @"^\\u[0-9]{1,4}\?.*\\v $"))
|
|
// return @"Pattern-" + firstchar + @"{Unicode}{Text}\v ";
|
|
// if (Regex.IsMatch(prefix, @"^\\[{}~]\\v $"))
|
|
// return @"Pattern-" + firstchar + @"{Special}\v ";
|
|
// if (Regex.IsMatch(prefix, @"^ ?[()""\[\]]\\v $"))
|
|
// return @"Pattern-" + firstchar + @"{Puctuation}\v ";
|
|
if (Regex.IsMatch(prefix, @"^ ?[-%A-Za-z0-9.,/()\[\]]+\\v $"))
|
|
return @"Pattern','" + firstchar + @"{Text}\v ";
|
|
//if (prefix == "\n\\v ")
|
|
// return @"Pattern-{Newline}\v ";
|
|
return SelectedDatabase + "','" + prefix;
|
|
}
|
|
private string GetPrefix(string Text, Match mlink, int lastlink)
|
|
{
|
|
string precedes = Text.Substring(lastlink, mlink.Index - lastlink);
|
|
if(mlink.Index - lastlink <= 3)
|
|
return precedes;
|
|
|
|
if (precedes.EndsWith(@"\v "))
|
|
{
|
|
//int indexSpace = Text.LastIndexOf(' ', mlink.Index - 4);
|
|
////if (indexSpace > mlink.Index) indexSpace = 0;
|
|
//int indexCR = Text.LastIndexOf('\n', mlink.Index - 4);
|
|
////if (indexCR > mlink.Index) indexCR = 0;
|
|
//if (indexCR >= 0 && indexCR > indexSpace)
|
|
// indexSpace = indexCR;
|
|
//int indexHS = Text.LastIndexOf('\xA0', mlink.Index - 4);
|
|
////if (indexHS > mlink.Index) indexHS = 0;
|
|
//if (indexHS >= 0 && indexHS > indexSpace)
|
|
// indexSpace = indexHS;
|
|
int indexSpace = Text.LastIndexOfAny(" \n\xA0:.()[]\"<>*=".ToCharArray(), mlink.Index - 4);
|
|
int indexSlash = Text.LastIndexOf('\\', mlink.Index - 4);
|
|
if (indexSlash >= 0)
|
|
{
|
|
if (indexSlash > indexSpace)
|
|
return Text.Substring(indexSlash, mlink.Index - indexSlash);
|
|
}
|
|
if (indexSpace >= 0)
|
|
{
|
|
return Text.Substring(indexSpace, mlink.Index - indexSpace);
|
|
}
|
|
}
|
|
return precedes;
|
|
}
|
|
private void LoadContents()
|
|
{
|
|
SqlConnection cn = new SqlConnection(_ConnectionString);
|
|
cn.Open();
|
|
//SqlDataAdapter da = new SqlDataAdapter("select ContentID,Text from Contents where ContentID in(select fromID from transitions union select contentid from rousages)", cn);
|
|
SqlDataAdapter da = new SqlDataAdapter("select ContentID,Text from Contents where ContentID in(select fromID from transitions)", cn);
|
|
da.SelectCommand.CommandTimeout = 300; // 300 sec timeout
|
|
DataSet ds = new DataSet();
|
|
try
|
|
{
|
|
da.Fill(ds);
|
|
_MyContents = new Dictionary<int, string>();
|
|
foreach (DataRow dr in ds.Tables[0].Rows)
|
|
{
|
|
_MyContents.Add((int)dr["ContentID"], dr["Text"].ToString());
|
|
}
|
|
//MessageBox.Show(string.Format("{0} Content Records Found", ds.Tables[0].Rows.Count), "Contents Loaded", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
throw (new Exception("Cannot Load Data List", ex));
|
|
}
|
|
cn.Close();
|
|
}
|
|
|
|
private void allDBsToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
DateTime tStart = DateTime.Now;
|
|
ResetLinks();
|
|
foreach (string dbName in DBNames)
|
|
{
|
|
SelectedDatabase = dbName;
|
|
LoadContents();
|
|
MyStatus = string.Format("{0} - {1} Contents", SelectedDatabase, _MyContents.Count);
|
|
FindLinks();
|
|
}
|
|
//ShowLinks("All Databases");
|
|
DateTime tEnd = DateTime.Now;
|
|
TimeSpan ts = TimeSpan.FromTicks(tEnd.Ticks - tStart.Ticks);
|
|
MyStatus = string.Format("{0:0.000} Seconds", ts.TotalSeconds);
|
|
}
|
|
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
}
|
|
} |