Files
BusinessMgr-2019/SaBusMgrStandardBase/Base/Consoles/SbmInstanceSchemaConsole.cs
T

200 lines
9.6 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.CodeTypes;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
{
//=======================================================================
/// <summary>
/// Determine the correct length to use for text columns in the current database.
/// <br/>- Primarily determined by the relevant database definition.
/// <br/>- For selected columns, use the db schema length instead.
/// <br/>- Allows for certain column lengths to be adjusted in the database.
/// </summary>
public class SbmInstanceSchemaConsole
{
//-------------------------------------------------------------------
private readonly ISacsDatabase db;
//-------------------------------------------------------------------
// Construction.
public SbmInstanceSchemaConsole(ISacsDatabase db)
{
this.db = db;
}
//-------------------------------------------------------------------
// BusMgr Column lengths - taking into account current database schema for selected columns.
public ulong GetColTextLen(SbmDbDfn.ColumnIdx column)
{
// Intercept columns that may have different lengths on the database.
if (db != null && BusMgrColumnLengths.ContainsKey(column))
{
if (BusMgrColumnLengths[column] == 0)
BusMgrColumnLengths[column] = GetDbColTextLen(column);
if (BusMgrColumnLengths[column] > 0)
return BusMgrColumnLengths[column];
}
return SbmDbDfn.GetColTextLen(column);
}
// BusMgr columns that may differ in length on the db.
private readonly Dictionary<SbmDbDfn.ColumnIdx, ulong> BusMgrColumnLengths = new Dictionary<SbmDbDfn.ColumnIdx, ulong>()
{
{ SbmDbDfn.ColumnIdx.Address_Name, 0},
{ SbmDbDfn.ColumnIdx.Commodity_Code, 0},
{ SbmDbDfn.ColumnIdx.Commodity_DrawingNo, 0},
{ SbmDbDfn.ColumnIdx.Commodity_DescBrief, 0},
{ SbmDbDfn.ColumnIdx.Commodity_Notes, 0},
{ SbmDbDfn.ColumnIdx.CommoditySupplier_ProductCode, 0},
{ SbmDbDfn.ColumnIdx.PortfolioItem_Code, 0},
{ SbmDbDfn.ColumnIdx.Transaction_Notes, 0},
{ SbmDbDfn.ColumnIdx.Requirement_ProductCode, 0},
{ SbmDbDfn.ColumnIdx.Requirement_Notes, 0},
{ SbmDbDfn.ColumnIdx.Constituent_Notes, 0},
};
public ulong GetDbColTextLen(SbmDbDfn.ColumnIdx column)
{
// Get the column's length from the currently open database:
if (SbmDbDfn.GetColDataType(column) != DbColumnDataType.VarChar) return 0;
DbDfnTable dfnTable = db.GetTableDfn(SbmDbDfn.GetTableName(SbmDbDfn.GetTableForColumn(column), false));
String columnName = SbmDbDfn.GetColumnName(column, false);
ulong columnLength = (ulong)(dfnTable.Columns.Find(col => col.Name.EqualsCI(columnName))?.Size ?? 0);
return (SbmDbDfn.MaxTextLen > 1 ? Math.Min(SbmDbDfn.MaxTextLen, columnLength) : columnLength);
}
//-------------------------------------------------------------------
// Security Column lengths - taking into account current database schema for selected columns.
public ulong GetColTextLen(SaSecurityDbDfn.ColumnIdx column)
{
// Intercept columns that may have different lengths on the database.
if (db != null && SecurityColumnLengths.ContainsKey(column))
{
if (SecurityColumnLengths[column] == 0)
SecurityColumnLengths[column] = GetDbColTextLen(column);
if (SecurityColumnLengths[column] > 0)
return SecurityColumnLengths[column];
}
return SaSecurityDbDfn.GetColTextLen(column);
}
// Security columns that may differ in length on the db.
private readonly Dictionary<SaSecurityDbDfn.ColumnIdx, ulong> SecurityColumnLengths = new Dictionary<SaSecurityDbDfn.ColumnIdx, ulong>()
{
{ SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, 0},
{ SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, 0},
{ SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress, 0}
};
public ulong GetDbColTextLen(SaSecurityDbDfn.ColumnIdx column)
{
// Get the column's length from the currently open database:
if (SaSecurityDbDfn.GetColDataType(column) != DbColumnDataType.VarChar) return 0;
DbDfnTable dfnTable = db.GetTableDfn(SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.GetTableForColumn(column), false));
String columnName = SaSecurityDbDfn.GetColumnName(column, false);
ulong columnLength = (ulong)(dfnTable.Columns.Find(col => col.Name.EqualsCI(columnName))?.Size ?? 0);
return (SaSecurityDbDfn.MaxTextLen > 1 ? Math.Min(SaSecurityDbDfn.MaxTextLen, columnLength) : columnLength);
}
//-------------------------------------------------------------------
// CodeType Column lengths - taking into account current database schema for selected columns.
public ulong GetColTextLen(SaCodeTypeDbDfn.ColumnIdx column)
{
// Intercept columns that may have different lengths on the database.
if (db != null && CodeTypeColumnLengths.ContainsKey(column))
{
if (CodeTypeColumnLengths[column] == 0)
CodeTypeColumnLengths[column] = GetDbColTextLen(column);
if (CodeTypeColumnLengths[column] > 0)
return CodeTypeColumnLengths[column];
}
return SaCodeTypeDbDfn.GetColTextLen(column);
}
// CodeType columns that may differ in length on the db.
private readonly Dictionary<SaCodeTypeDbDfn.ColumnIdx, ulong> CodeTypeColumnLengths = new Dictionary<SaCodeTypeDbDfn.ColumnIdx, ulong>()
{
{ SaCodeTypeDbDfn.ColumnIdx.SaCodeType_Code, 0},
{ SaCodeTypeDbDfn.ColumnIdx.SaCode_Code, 0},
{ SaCodeTypeDbDfn.ColumnIdx.SaCode_Data, 0},
{ SaCodeTypeDbDfn.ColumnIdx.SaCode_Description, 0}
};
public ulong GetDbColTextLen(SaCodeTypeDbDfn.ColumnIdx column)
{
// Get the column's length from the currently open database:
if (SaCodeTypeDbDfn.GetColDataType(column) != DbColumnDataType.VarChar) return 0;
DbDfnTable dfnTable = db.GetTableDfn(SaCodeTypeDbDfn.GetTableName(SaCodeTypeDbDfn.GetTableForColumn(column), false));
String columnName = SaCodeTypeDbDfn.GetColumnName(column, false);
ulong columnLength = (ulong)(dfnTable.Columns.Find(col => col.Name.EqualsCI(columnName))?.Size ?? 0);
return (SaCodeTypeDbDfn.MaxTextLen > 1 ? Math.Min(SaCodeTypeDbDfn.MaxTextLen, columnLength) : columnLength);
}
//-------------------------------------------------------------------
// ItemOption Column lengths - taking into account current database schema for selected columns.
public ulong GetColTextLen(SaItemOptionDbDfn.ColumnIdx column)
{
// Intercept columns that may have different lengths on the database.
if (db != null && ItemOptionColumnLengths.ContainsKey(column))
{
if (ItemOptionColumnLengths[column] == 0)
ItemOptionColumnLengths[column] = GetDbColTextLen(column);
if (ItemOptionColumnLengths[column] > 0)
return ItemOptionColumnLengths[column];
}
return SaItemOptionDbDfn.GetColTextLen(column);
}
// ItemOption columns that may differ in length on the db.
private readonly Dictionary<SaItemOptionDbDfn.ColumnIdx, ulong> ItemOptionColumnLengths = new Dictionary<SaItemOptionDbDfn.ColumnIdx, ulong>()
{
{ SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, 0},
{ SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, 0},
{ SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value, 0},
{ SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes, 0}
};
public ulong GetDbColTextLen(SaItemOptionDbDfn.ColumnIdx column)
{
// Get the column's length from the currently open database:
if (SaItemOptionDbDfn.GetColDataType(column) != DbColumnDataType.VarChar) return 0;
DbDfnTable dfnTable = db.GetTableDfn(SaItemOptionDbDfn.GetTableName(SaItemOptionDbDfn.GetTableForColumn(column), false));
String columnName = SaItemOptionDbDfn.GetColumnName(column, false);
ulong columnLength = (ulong)(dfnTable.Columns.Find(col => col.Name.EqualsCI(columnName))?.Size ?? 0);
return (SaItemOptionDbDfn.MaxTextLen > 1 ? Math.Min(SaItemOptionDbDfn.MaxTextLen, columnLength) : columnLength);
}
//-------------------------------------------------------------------
// Interface Column lengths - taking into account current database schema for selected columns.
public ulong GetColTextLen(SaInterfaceDbDfn.ColumnIdx column)
{
// Intercept columns that may have different lengths on the database.
if (db != null && InterfaceColumnLengths.ContainsKey(column))
{
if (InterfaceColumnLengths[column] == 0)
InterfaceColumnLengths[column] = GetDbColTextLen(column);
if (InterfaceColumnLengths[column] > 0)
return InterfaceColumnLengths[column];
}
return SaInterfaceDbDfn.GetColTextLen(column);
}
// Interface columns that may differ in length on the db.
private readonly Dictionary<SaInterfaceDbDfn.ColumnIdx, ulong> InterfaceColumnLengths = new Dictionary<SaInterfaceDbDfn.ColumnIdx, ulong>()
{
{ SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, 0},
{ SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, 0},
};
public ulong GetDbColTextLen(SaInterfaceDbDfn.ColumnIdx column)
{
// Get the column's length from the currently open database:
if (SaInterfaceDbDfn.GetColDataType(column) != DbColumnDataType.VarChar) return 0;
DbDfnTable dfnTable = db.GetTableDfn(SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.GetTableForColumn(column), false));
String columnName = SaInterfaceDbDfn.GetColumnName(column, false);
ulong columnLength = (ulong)(dfnTable.Columns.Find(col => col.Name.EqualsCI(columnName))?.Size ?? 0);
return (SaInterfaceDbDfn.MaxTextLen > 1 ? Math.Min(SaInterfaceDbDfn.MaxTextLen, columnLength) : columnLength);
}
//-------------------------------------------------------------------
}
//=======================================================================
}