SourceCode/PROMS/MyGeneration/csla_21/ForeignKeyProcessing.cs
2007-12-06 15:47:49 +00:00

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;
}