207 lines
6.5 KiB
C#
207 lines
6.5 KiB
C#
// Foreign Key Processing
|
|
public delegate void ProcessFK(IForeignKey fk,string alias);
|
|
public string ParentName(IForeignKey fk)
|
|
{
|
|
if(fk == null)return "Parent";
|
|
string sKey = fk.ForeignColumns[0].Name;
|
|
if(sKey.StartsWith("Prev") || sKey.StartsWith("Prv"))return "Previous";
|
|
if(sKey.StartsWith("Next") || sKey.StartsWith("Nxt"))return "Next";
|
|
return "Parent";
|
|
}
|
|
public string ChildName(IForeignKey fk)
|
|
{
|
|
string sKey = fk.ForeignColumns[0].Name;
|
|
if(sKey.StartsWith("Prev") || sKey.StartsWith("Prv"))return "Next";
|
|
if(sKey.StartsWith("Next") || sKey.StartsWith("Nxt"))return "Previous";
|
|
return "Child";
|
|
}
|
|
public string ChildrenName(IForeignKey fk)
|
|
{
|
|
string sKey = fk.ForeignColumns[0].Name;
|
|
if(sKey.StartsWith("Prev") || sKey.StartsWith("Prv"))return "Next";
|
|
if(sKey.StartsWith("Next") || sKey.StartsWith("Nxt"))return "Previous";
|
|
return "Children";
|
|
}
|
|
public string GetAlias(Hashtable hTbl,ITable tbl)
|
|
{
|
|
string sAlias = tbl.Alias;
|
|
if(!hTbl.Contains(sAlias))
|
|
{
|
|
hTbl[sAlias]=0;
|
|
return "";
|
|
}
|
|
// WriteLine("-- Hashtable count = {0}, TableName = [{1}]",hTbl.Count,tbl.Name);
|
|
int iAlias = 1+ (int)hTbl[sAlias];
|
|
hTbl[sAlias]=iAlias;
|
|
// return "_" + iAlias.ToString();
|
|
return "_" + "ABCDEFGHIJKLMNOP".Substring(iAlias,1);
|
|
}
|
|
public string GetAlias(IForeignKey fk)
|
|
{
|
|
if(fk.PrimaryTable.Name == fk.ForeignTable.Name)return "";
|
|
// First I need to check to see if there are more than one Foreign Keys pointing to the same Primary Table
|
|
int count=0;
|
|
foreach(IForeignKey fk1 in fk.ForeignTable.ForeignKeys)
|
|
{
|
|
if(fk1.PrimaryTable.Name == fk.PrimaryTable.Name) count++;
|
|
}
|
|
if(count > 1)
|
|
return FormatColumns("_{prop}",fk.ForeignColumns,"","");
|
|
return "";
|
|
}
|
|
public void ProcessFKAlias(ITable tbl,ProcessFK pfk)
|
|
{
|
|
Hashtable dicByNames = new Hashtable();
|
|
foreach(ForeignKey fk in tbl.ForeignKeys)
|
|
{
|
|
if(fk.ForeignTable == tbl)
|
|
{
|
|
pfk(fk,GetAlias(dicByNames,fk.PrimaryTable));
|
|
}
|
|
}
|
|
}
|
|
private bool IsPrimaryKey(IForeignKey fk)
|
|
{
|
|
// bool retval=true;
|
|
// foreach(IColumn c in fk.ForeignColumns)retval &= c.IsInPrimaryKey;
|
|
return SameList(fk.ForeignTable.PrimaryKeys,fk.ForeignColumns);
|
|
// return retval;
|
|
// return IsPrimaryKey(fk.ForeignColumns);
|
|
}
|
|
private bool IsPrimaryKey1(IForeignKey fk)
|
|
{
|
|
// bool retval=true;
|
|
// foreach(IColumn c in fk.ForeignColumns)retval &= c.IsInPrimaryKey;
|
|
return SameList(fk.PrimaryTable.PrimaryKeys,fk.PrimaryColumns);
|
|
// return retval;
|
|
// return IsPrimaryKey(fk.ForeignColumns);
|
|
}
|
|
private string ColumnList(IColumns cols)
|
|
{
|
|
string retval="";
|
|
string sep = "";
|
|
foreach(IColumn col in cols)
|
|
{
|
|
retval += sep + col.Name;
|
|
sep = ", ";
|
|
}
|
|
return retval;
|
|
}
|
|
private bool IsPrimaryKey(IColumns cols)
|
|
{
|
|
ITable tbl = cols[0].Table;
|
|
int match = tbl.PrimaryKeys.Count;
|
|
foreach(IColumn col in cols)
|
|
{
|
|
if(col.Table.Name != tbl.Name)
|
|
{
|
|
// WriteLine("Table Mismatch - {0},{1}",col.Table.Name,tbl.Name);
|
|
return false; // If it points to multiple tables, it is not a primary key
|
|
}
|
|
if(col.IsInPrimaryKey)match --;
|
|
else
|
|
{
|
|
// WriteLine("Not In Primary Key {0} in {1} ({2})",col.Name, tbl.Name, ColumnList(tbl.PrimaryKeys));
|
|
return false;
|
|
}
|
|
}
|
|
// WriteLine("Match = {0}",match);
|
|
return match==0;
|
|
}
|
|
private bool IsPrimaryKey(IColumns cols1,IColumns cols2)
|
|
{
|
|
ITable tbl = cols1[0].Table;
|
|
int match = tbl.PrimaryKeys.Count;
|
|
foreach(IColumn col in cols1)
|
|
{
|
|
if(col.Table.Name != tbl.Name)
|
|
{
|
|
// WriteLine("Table Mismatch - {0},{1}",col.Table.Name,tbl.Name);
|
|
return false; // If it points to multiple tables, it is not a primary key
|
|
}
|
|
if(col.IsInPrimaryKey)match --;
|
|
else
|
|
{
|
|
// WriteLine("Not In Primary Key {0} in {1} ({2})",col.Name, tbl.Name, ColumnList(tbl.PrimaryKeys));
|
|
return false;
|
|
}
|
|
}
|
|
// WriteLine("Match = {0}",match);
|
|
foreach(IColumn col in cols2)
|
|
{
|
|
if(col.Table.Name != tbl.Name)
|
|
{
|
|
// WriteLine("Table Mismatch - {0},{1}",col.Table.Name,tbl.Name);
|
|
return false; // If it points to multiple tables, it is not a primary key
|
|
}
|
|
if(col.IsInPrimaryKey)match --;
|
|
else
|
|
{
|
|
// WriteLine("Not In Primary Key {0} in {1} ({2})",col.Name, tbl.Name, ColumnList(tbl.PrimaryKeys));
|
|
return false;
|
|
}
|
|
}
|
|
// WriteLine("Match = {0}",match);
|
|
return match==0;
|
|
}
|
|
private bool ManyToMany(ITable tbl,IForeignKey fk,IForeignKey pk)
|
|
{
|
|
if(tbl != fk.PrimaryTable)return false;// It should be the Primary Table
|
|
if(tbl == pk.PrimaryTable)return false;// It should not loop back to the Primary Table
|
|
if(fk.PrimaryTable == fk.ForeignTable)return false;// Ignore Parent/Child relationships
|
|
if(pk.PrimaryTable == pk.ForeignTable)return false;// Ignore Parent/Child relationships
|
|
// Now for the detail check - the primary columns in each foreign key should be the primary key in the primary table
|
|
// WriteLine("Checking Primary Keys - {0}",tbl.Name);
|
|
if(!IsPrimaryKey(fk.PrimaryColumns))return false;
|
|
if(!IsPrimaryKey(pk.PrimaryColumns))return false;
|
|
// And the foreign columns from both foreign keys should be the primary key in the foreigntable
|
|
// WriteLine("Checking Foreign Keys - {0}",tbl.Name);
|
|
if(!IsPrimaryKey(fk.ForeignColumns,pk.ForeignColumns))return false;
|
|
return true;
|
|
}
|
|
private bool OneToOne(ITable tbl)
|
|
{
|
|
// Check to see if the Primary Key is also the Foreign Part of a Foreign Key
|
|
foreach(IColumn col in tbl.PrimaryKeys)
|
|
{
|
|
if(IsPrimaryKey(col))
|
|
{
|
|
foreach(IForeignKey fk in col.ForeignKeys)
|
|
{
|
|
//WriteLine("{0} {1} {2} {3} {4}",fk.Name,fk.PrimaryTable.Name,fk.ForeignTable.Name,
|
|
//fk.ForeignTable.Name == tbl.Name, fk.PrimaryTable.Name != tbl.Name);
|
|
if(fk.ForeignTable.Name == tbl.Name && fk.PrimaryTable.Name != tbl.Name )
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
private bool AnyNotOneToOne(ITable tbl)
|
|
{
|
|
bool retval = true;
|
|
foreach(IForeignKey fk in tbl.ForeignKeys)
|
|
{
|
|
if(fk.ForeignTable == tbl)
|
|
{
|
|
if(!OneToOne(fk))return true;
|
|
//WriteLine("{0} {1} {2} {3} {4}",fk.Name,fk.PrimaryTable.Name,fk.ForeignTable.Name,
|
|
// fk.ForeignTable.Name == tbl.Name, fk.PrimaryTable.Name != tbl.Name);
|
|
retval = false;
|
|
}
|
|
}
|
|
return retval;
|
|
}
|
|
private bool OneToOne(IForeignKey fk1)
|
|
{
|
|
ITable tbl=fk1.ForeignTable; // Check to see if the Primary Key is also the Foreign Part of a Foreign Key
|
|
// WriteLine("{0} {1} {2} {3} {4}",fk1.Name,fk1.PrimaryTable.Name,fk1.ForeignTable.Name,
|
|
// fk1.ForeignTable.Name == tbl.Name, fk1.PrimaryTable.Name != tbl.Name);
|
|
foreach(IColumn col in fk1.ForeignColumns)
|
|
{
|
|
// WriteLine("Column {0} Primary {1}",col.Name,IsPrimaryKey(col));
|
|
if(!IsPrimaryKey(col))return false;
|
|
}
|
|
return true;
|
|
}
|