using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Dbas.ReferenceData.Internal; using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog; using Sarand.Net.Standard.Base.Utils; namespace Sarand.Net.Standard.Dbas.ReferenceData { //======================================================================= internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr { //******************************************************************* // L a n g u a g e s //******************************************************************* // Create Language. public override SaLanguage CreateLanguage () { ClearErrorState(); return new SaLanguage_Dbas(null, 0); } private SaLanguage_Dbas CreateLanguage (Language_Db dbLanguage) { ClearErrorState(); SaLanguage_Dbas language = new SaLanguage_Dbas(new SysId(dbLanguage._Id), 0); PopulateFrom(dbLanguage, language); return language; } private SaLanguage CreateLanguage (DbDataReader dataReader) { Language_Db dbLanguage = new Language_Db(DbInfo); dbLanguage.PopulateFrom(dataReader); return CreateLanguage(dbLanguage); } //------------------------------------------------------------------- // Language exists. public override bool LanguageExistsById (SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return false; return GetLanguageCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + "=" + SysId.ToString(id)) == 1; } public override bool LanguageExistsByCode (string code) { ClearErrorState(); if (StringUtil.IsEmpty(code)) return false; return GetLanguageCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + "='" + DbQuery.FormatForCondition(code) + "'") == 1; } //------------------------------------------------------------------- // Get Language. public override SaLanguage GetLanguage (SaLanguage.Params prm) { return GetLanguage(GetLanguageQueryFilter(prm).Concat(" AND ", "(", ")")); } private SaLanguage GetLanguage (String filter) { ClearErrorState(); long count = GetLanguageCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple languages found"); return null; } SaLanguage language = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Language_Db dbLanguage = new Language_Db(DbInfo); dbLanguage.PopulateFrom(dbCommand, aliasLanguage, filter); language = CreateLanguage(dbLanguage); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return language; } public override SaLanguage GetLanguageById (SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return null; return GetLanguage("Id=" + SysId.ToString(id)); } public override SaLanguage GetLanguageByCode (string code) { ClearErrorState(); if (StringUtil.IsEmpty(code)) return null; return GetLanguage("Code='" + DbQuery.FormatForCondition(code) + "'"); } //------------------------------------------------------------------- // Validate item. public override bool IsValidLanguageData (SaLanguage.Data data, SaLanguage.ErrField errField) { ClearErrorState(); if (!base.IsValidLanguageData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert item. public override bool InsertLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidLanguage(language)) return false; if (SysId.IsValid(language.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Language_Db dbLanguage = new Language_Db(DbInfo); PopulateTo(dbLanguage, language, dbUpdateInfo); if (Language_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbLanguage._Id = SysId.ToInt(Database.GetNextId("Language", dbUpdateInfo)); } dbLanguage.ExecuteInsertCommand(dbCommand); language.Id = new SysId(dbLanguage._Id); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update item. public override bool UpdateLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidLanguage(language)) return false; if (!SysId.IsValid(language.Id)) return SetErrorState(ErrorMessage.InvalidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Language_Db dbLanguage = new Language_Db(DbInfo); dbLanguage.PopulateFrom(dbCommand, aliasLanguage, "Id=" + SysId.ToString(language.Id)); SaUpdateLogItemMonitor_Language updateLogMonitor = new SaUpdateLogItemMonitor_Language(ReferenceDataConsole, CreateLanguage(dbLanguage), dbUpdateInfo); // Update item. PopulateTo(dbLanguage, language, dbUpdateInfo); dbLanguage.ExecuteUpdateCommand(dbCommand); // Record updates. updateLogMonitor.RecordUpdatedValues(language); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete item. public override bool LanguageCanBeDeleted (SaLanguage language) { ClearErrorState(); if (!base.LanguageCanBeDeleted(language)) return false; return true; } public override bool DeleteLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!LanguageCanBeDeleted(language)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Language_Db dbLanguage = new Language_Db(DbInfo); dbLanguage.PopulateFrom(dbCommand, aliasLanguage, "Id=" + language.Id.ToString()); // Delete item. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_Language + " WHERE Id=" + SysId.ToString(language.Id) + ";"; dbCommand.ExecuteNonQuery(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo (Language_Db dbLanguage, SaLanguage language, DbUpdateInfo dbUpdateInfo) { dbLanguage._Id = language.Id.ToInt(); dbLanguage._Code = language.Code; dbLanguage._Primary = SysId.ToInt(language.LanguageIdPrimary); dbLanguage._Unicode = language.Unicode; dbLanguage._Translation = language.Translation; // Common properties. /* dbLanguage._Notes = language.Notes; dbLanguage._Status = SacsSystem.GetStatusCode(language.Status); dbLanguage._Flags = (short)language.Flags; */ if (!SysId.IsValid(language.Id)) { dbLanguage._CreateOn = DateTime.UtcNow; dbLanguage._CreateBy = dbUpdateInfo.UserId.ToInt(); dbLanguage._CreateHost = dbUpdateInfo.Host; } dbLanguage._UpdateOn = DateTime.UtcNow; dbLanguage._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbLanguage._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom (Language_Db dbLanguage, SaLanguage language) { //language.Id = new SysId(dbLanguage._Id); //language.Code = dbLanguage._Code; language.LanguageIdPrimary = new SysId(dbLanguage._Primary); language.Unicode = dbLanguage._Unicode; language.Translation = dbLanguage._Translation; // Common properties. /* language.Notes = dbLanguage._Notes; language.Status = SacsSystem.GetStatusForCode(dbLanguage._Status); */ language.SetCreateStamp(dbLanguage._CreateOn, new SysId(dbLanguage._CreateBy), dbLanguage._CreateHost); language.SetUpdateStamp(dbLanguage._UpdateOn, new SysId(dbLanguage._UpdateBy), dbLanguage._UpdateHost); language.AcceptChanges(); } //------------------------------------------------------------------- // Language column definitions. private static readonly String aliasLanguage = "aLng"; private void SetLanguageColDfn (ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.Language) alias = aliasLanguage; col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting language column definition. public override ColumnDfn GetLanguageColumnDfn (SaLanguage.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SaLanguage.Column.Pos: SetLanguageColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SaLanguage.Column.Id: SetLanguageColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.Language_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Language Properties. case SaLanguage.Column.Code: SetLanguageColDfn(columnDfn, "Code", 100, SaReferenceDataDbDfn.ColumnIdx.Language_Code); break; case SaLanguage.Column.Name: SetLanguageColDfn(columnDfn, "Name", 100, SaReferenceDataDbDfn.ColumnIdx.Language_Name); break; case SaLanguage.Column.LanguageIdPrimary: SetLanguageColDfn(columnDfn, "Primary Id", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Primary, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = 3; break; case SaLanguage.Column.Unicode: SetLanguageColDfn(columnDfn, "Unicode", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = 3; break; case SaLanguage.Column.Translation: SetLanguageColDfn(columnDfn, "Translation", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Translation, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = 3; break; // Derived properties. /* case SaLanguage.Column.MovementCount: SetLanguageColDfn(columnDfn, "Movements", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = colLanguage_MovementCount; columnDfn.ReadOnly = true; break; case SaLanguage.Column.PendingMovementCount: SetLanguageColDfn(columnDfn, "Pending", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = colLanguage_MovementCount_Pending; columnDfn.ReadOnly = true; break; case SaLanguage.Column.OnSite_Y: SetLanguageColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String); columnDfn.DataName = colLanguage_MovementCount_OnSite; columnDfn.ReadOnly = true; break; case SaLanguage.Column.OnSite_Tick: SetLanguageColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.DataName = colLanguage_MovementCount_OnSite; columnDfn.BoolFormat = ColumnBoolFormat.Tick; columnDfn.ReadOnly = true; break; */ // Common properties. /* case SaLanguage.Column.Notes: SetLanguageColDfn(columnDfn, "Notes", 240, SaReferenceDataDbDfn.ColumnIdx.Language_Notes); break; case SaLanguage.Column.Status: SetLanguageColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center); break; case SaLanguage.Column.Status_Desc: SetLanguageColDfn(columnDfn, "Status", 90, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center); break; case SaLanguage.Column.Status_Ind: SetLanguageColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; */ case SaLanguage.Column.CreateOn_Date: SetLanguageColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.Language_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SaLanguage.Column.UpdateOn_Date: SetLanguageColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.Language_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // Language query filter. public override List GetLanguageQueryFilter (SaLanguage.Params prm) { List filter = new List(); // Language Id. String includedIds = prm.IncludedIds.Concat(","); if (!includedIds.IsEmpty()) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + " IN (" + includedIds + ")"); String excludedIds = prm.ExcludedIds.Concat(","); if (!excludedIds.IsEmpty()) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + " NOT IN (" + excludedIds + ")"); // Code. if (!StringUtil.IsEmpty(prm.Code)) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " = '" + DbQuery.FormatForCondition(prm.Code) + "'"); if (!StringUtil.IsEmpty(prm.CodePartial)) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'"); // Name. if (!StringUtil.IsEmpty(prm.Name)) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage) + " = '" + DbQuery.FormatForCondition(prm.Name) + "'"); if (!StringUtil.IsEmpty(prm.NamePartial)) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage) + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'"); // Lang Primary Id. if (SysId.IsValid(prm.LanguageIdPrimary)) filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasCurrency) + " = " + SysId.ToString(prm.LanguageIdPrimary,"0")); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } // Language sort columns. public List GetLanguageSortColumns (SaLanguage.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Language columns in case of conflict. String sortCol = String.Empty; if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.Language) { sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasLanguage); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnNames.RemoveBlanks(); if (sortColumnNames.IsEmpty()) { // Default sort columns: sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Language count. private long GetLanguageCount (String filter) { ClearErrorState(); return Database.GetRowCount(ReferenceDataConsole.TableName_Language + " As " + aliasLanguage, filter); } public override long GetLanguageCount (SaLanguage.Params prm) { ClearErrorState(); return GetLanguageCount(GetLanguageQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Language list. public override List GetLanguageList (SaLanguage.Params prm) { ClearErrorState(); List languages = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(ReferenceDataConsole.TableName_Language, aliasLanguage); Language_Db dbLanguage = new Language_Db(DbInfo); qry.Columns.AddRange(dbLanguage.ExistingColumnNames); qry.Filters.AddRange(GetLanguageQueryFilter(prm)); qry.OrderBy.AddRange(GetLanguageSortColumns(prm)); // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) languages.Add(CreateLanguage(dbDataReader)); } } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return languages; } //------------------------------------------------------------------- // Language query execution. public override DbResultSet ExecuteLanguageQuery (List columns, SaLanguage.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(ReferenceDataConsole.TableName_Language, aliasLanguage); // Language Propertiees - add columns as defined in query list. if (columns.HasId((int)SaLanguage.Column.Id)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.Code)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.Name)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.LanguageIdPrimary)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.Unicode)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.Translation)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Translation, aliasLanguage)); //Common Properties. /* if (columns.HasId((int)SaLanguage.Column.Notes)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Notes, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.Status) || columns.HasId((int)SaLanguage.Column.Status_Desc) || columns.HasId((int)SaLanguage.Column.Status_Ind)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Status, aliasLanguage)); */ if (columns.HasId((int)SaLanguage.Column.CreateOn_Date)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_CreateOn, aliasLanguage)); if (columns.HasId((int)SaLanguage.Column.UpdateOn_Date)) query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_UpdateOn, aliasLanguage)); //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetLanguageQueryFilter(prm)); if (prm.IncludedIds.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetLanguageSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery()); } //------------------------------------------------------------------- } //======================================================================= }