using DbAPI.Connections; using DbAPI.Errors; using DbAPI.Logging; using DTS.Common.Classes.Channels; using DTS.Common.Interface.Database; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using DTS.Common.Interface.Channels; using DTS.Common.Classes.Groups.ChannelSettings; using DTS.Common.Enums.Channels; using DTS.Common.Interface.Channels.ChannelCodes; using DTS.Common.Classes.ChannelCodes; using DTS.Common.Classes; using DTS.Common; using DTS.Common.Enums.DASFactory; namespace DbAPI.Channels { /// /// Handles channel functions /// internal class Channels : IChannels { /// /// insert a new channel code, channel code is modified with a new id if successful /// /// user submitting request /// connection being submitted on /// channel code to insert /// mapping of code type to code type integer /// new id of channel code record inserted /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelCodesInsert(IUserDbRecord user, IConnectionDetails connection, IReadOnlyDictionary lookup, IChannelCode channelCode, out int id) { id = -1; if (null == channelCode) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (string.IsNullOrEmpty(channelCode.Code) || string.IsNullOrEmpty(channelCode.Name)) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelCodesInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 255) { Value = channelCode.Code }); cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 255) { Value = channelCode.Name }); cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.Int) { Value = lookup[channelCode.CodeType] }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); var newId = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newId); _ = cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesInsert - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (DBNull.Value.Equals(newId.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesInsert - Error, null new id"); return ErrorCodes.ERROR_UNKNOWN; } id = Convert.ToInt32(newId.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesInsert - Error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// Update a channel record in the database /// /// user committing change /// connection change is committed on /// channel code being record being updated /// mapping of code type to code type integer /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelCodesUpdate(IUserDbRecord user, IConnectionDetails connection, IReadOnlyDictionary lookup, IChannelCode channelCode) { if (null == channelCode) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (string.IsNullOrEmpty(channelCode.Code) || string.IsNullOrEmpty(channelCode.Name)) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelCodesUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = channelCode.Id }); cmd.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 255) { Value = channelCode.Code }); cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 255) { Value = channelCode.Name }); cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.Int) { Value = lookup[channelCode.CodeType] }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); _ = cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesInsert - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesInsert - Error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// deletes matching channel codes /// /// user making deletes /// connection to delete on /// id of channel code /// code of matching channel codes (can be null) /// name of matching channel codes (can be null) /// code type of matching channel codes (can be null) /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelCodesDelete(IUserDbRecord user, IConnectionDetails connection, int? id, string code, string name, int? codeType) { var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelCodesDelete"); if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null != id) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = (int)id }); } else { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); } cmd.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 255) { Value = code }); cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 255) { Value = name }); if (null == codeType) { cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.Int) { Value = (int)codeType }); } var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); _ = cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesDelete - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesDelete error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// retrieves all matching channel code types (int identifier and string identifier) /// /// user making request /// connection request is being made on /// code type (use null for all) /// id (use null for all) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelCodeTypesGet(IUserDbRecord user, IConnectionDetails connection, short? id, string codeType, out Tuple[] records) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelCodeTypeGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == id) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.TinyInt) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.TinyInt) { Value = (short)id }); } cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.NVarChar, 50) { Value = codeType }); var reader = cmd.ExecuteReader(); var list = new List>(); while (reader.Read()) { var itemId = Utility.GetShort(reader, "Id"); var cType = Utility.GetString(reader, "CodeType"); list.Add(new Tuple(itemId, cType)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodeTypesGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// retrieves all matching channel codes /// /// user making request /// connection query is being made on /// id of channel code (use null for all) /// code of channel code (use null for all) /// name of channel code (use null for all) /// code type of channel code (use null for all) /// lookup of a short to a string for a channel code type /// matching records /// 0 (ERROR SUCCESS) on success, all other values are error codes public ulong ChannelCodesGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string code, string name, ChannelEnumsAndConstants.ChannelCodeType? codeType, IReadOnlyDictionary channelTypeLookup, out IChannelCode[] records ) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == channelTypeLookup) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelCodesGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == Id) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = (int)Id }); } cmd.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 255) { Value = code }); cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 255) { Value = name }); if (null == codeType) { cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.SmallInt) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@CodeType", SqlDbType.SmallInt) { Value = (short)codeType }); } var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new ChannelCode(reader, channelTypeLookup)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelCodesGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// updates the default value for a channel setting /// /// user making update /// connection update is being made on /// setting id to update /// new value for setting /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelSettingsUpdate(IUserDbRecord user, IConnectionDetails connection, int settingId, string defaultValue) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelSettingsUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = settingId }); cmd.Parameters.Add(new SqlParameter("@DefaultValue", SqlDbType.NVarChar, 255) { Value = defaultValue }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); var reader = cmd.ExecuteReader(); var o = errorNumber.Value; if (!DBNull.Value.Equals(o) && 0 != Convert.ToInt32(o)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsUpdate failed: {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsUpdate failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// retrieves all channel settings from the db for a given channel /// /// user making request /// connection request is being made on /// channel id to match (allows null) /// setting name to match (allows null/empty) /// matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong ChannelSettingsGet(IUserDbRecord user, IConnectionDetails connection, int? settingId, string settingName, out IChannelSettingRecord[] records) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, Database.Database.GetStoredProcedureVersionCached(connection, "sp_ChannelSettingsGet")); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == settingId) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = (int)settingId }); } cmd.Parameters.Add(new SqlParameter("@SettingName", SqlDbType.NVarChar, 255) { Value = settingName }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new ChannelSettingRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// removes group channel settings from the db for a given channel /// /// user requesting changes /// connection changes are being made on /// channel settings belong to /// setting which to delete (use null to delete all settings) /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GroupChannelSettingsDelete(IUserDbRecord user, IConnectionDetails connection, long channelId, int? settingId) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_GroupChannelSettingsDelete"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@ChannelId", SqlDbType.BigInt) { Value = channelId }); if (null != settingId) { cmd.Parameters.Add(new SqlParameter("@SettingId", SqlDbType.Int) { Value = (int)settingId }); } else { cmd.Parameters.Add(new SqlParameter("@SettingId", SqlDbType.Int) { Value = null }); } var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); var reader = cmd.ExecuteReader(); var o = errorNumber.Value; if (!DBNull.Value.Equals(o) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsDelete failed: {errorNumber.Value} : {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsDelete failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// Inserts a new channel setting record into db /// /// user inserting record /// connection record is being inserted on /// connection client db version /// channel setting belongs to /// record being inserted /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GroupChannelSettingsInsert(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, long channelId, IGroupChannelSettingRecord record) { SqlCommand cmd; var storedProcedureVersionToUse = 0; var ret = Database.Database.PrepareForDbAccess(user, connection, clientDbVersion, "sp_GroupChannelSettingsInsert", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@ChannelId", SqlDbType.BigInt) { Value = channelId }); cmd.Parameters.Add(new SqlParameter("@SettingId", SqlDbType.Int) { Value = record.SettingId }); cmd.Parameters.Add(new SqlParameter("@SettingValue", SqlDbType.NVarChar, 255) { Value = record.SettingValue }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); var reader = cmd.ExecuteReader(); var o = errorNumber.Value; if (!DBNull.Value.Equals(o) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsInsert failed: {errorNumber.Value} : {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsInsert failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// returns all channel settings for a given channel /// /// user making request /// calling client's database version /// connection request is being made on /// list of channels for the request /// all matching channel settings /// any errors encountered while retrieving group channel settings /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GroupChannelSettingsGet(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, List channelIdList, out IGroupChannelSettingRecord[] records, out string[] errors) { errors = new string[0]; records = new IGroupChannelSettingRecord[0]; var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, clientDbVersion, "sp_GroupChannelSettingsGet", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } cmd.CommandType = CommandType.StoredProcedure; try { var list = new List(); if (storedProcedureVersionToUse < Constants.BULK_GROUPCHANNELSETTINGS_GET_DB_VERSION) { //Call the old procedure that takes only one channel ID foreach (var channelId in channelIdList) { if (ErrorCodes.ERROR_SUCCESS != ret) { return ret; } //we can re-enter here, so clear the parameters just for simplicity cmd.Parameters.Clear(); cmd.Parameters.Add(new SqlParameter("@ChannelId", SqlDbType.Int) { Value = channelId }); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new GroupChannelSettingRecord(reader, storedProcedureVersionToUse) { ChannelId = channelId }); } //http://manuscript.dts.local/f/cases/35503/Unable-to-add-a-test-setup-with-attached-database //close the reader reader.Close(); } } else { //Call the new procedure that takes a table of channel IDs using (var table = new DataTable()) { table.Columns.Add("Item", typeof(string)); foreach (var channelId in channelIdList) { table.Rows.Add(channelId.ToString()); } var pList = new SqlParameter("@ChannelIdList", SqlDbType.Structured); pList.TypeName = "dbo.StringList"; pList.Value = table; cmd.Parameters.Add(pList); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new GroupChannelSettingRecord(reader, storedProcedureVersionToUse)); } } } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelSettingsGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } public ulong ChannelsInsert(IUserDbRecord user, IConnectionDetails connection, ref IChannelDbRecord channel) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelsInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = channel.GroupId }); cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar, 50) { Value = channel.IsoCode ?? "" }); cmd.Parameters.Add(new SqlParameter("@IsoChannelName", SqlDbType.NVarChar, 255) { Value = channel.IsoChannelName ?? "" }); cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar, 50) { Value = channel.UserCode ?? "" }); cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar, 255) { Value = channel.UserChannelName ?? "" }); object dasId = null; if (channel.DASId > 0 && channel.DASChannelIndex >= 0) { dasId = channel.DASId; } cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = dasId }); cmd.Parameters.Add(new SqlParameter("@DASChannelIndex", SqlDbType.Int) { Value = channel.DASChannelIndex }); cmd.Parameters.Add(new SqlParameter("@GroupChannelOrder", SqlDbType.Int) { Value = channel.GroupChannelOrder }); cmd.Parameters.Add(new SqlParameter("@TestSetupOrder", SqlDbType.Int) { Value = channel.TestSetupOrder }); object sensorId = null; if (channel.SensorId > 0) { sensorId = channel.SensorId; } cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@Disabled", SqlDbType.Bit) { Value = channel.Disabled }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = channel.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 255) { Value = channel.LastModifiedBy }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); var newId = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newId); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelsInsert error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } channel.Id = Convert.ToInt64(newId.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelsInsert error: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } public ulong ChannelsUpdate(IUserDbRecord user, IConnectionDetails connection, IChannelDbRecord channel) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelsUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.BigInt) { Value = channel.Id }); cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = channel.GroupId }); cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar, 50) { Value = channel.IsoCode }); cmd.Parameters.Add(new SqlParameter("@IsoChannelName", SqlDbType.NVarChar, 255) { Value = channel.IsoChannelName }); cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar, 50) { Value = channel.UserCode }); cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar, 255) { Value = channel.UserChannelName }); object dasId = null; if (channel.DASId > 0) { dasId = channel.DASId; } cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = dasId }); cmd.Parameters.Add(new SqlParameter("@DASChannelIndex", SqlDbType.Int) { Value = channel.DASChannelIndex }); cmd.Parameters.Add(new SqlParameter("@GroupChannelOrder", SqlDbType.Int) { Value = channel.GroupChannelOrder }); cmd.Parameters.Add(new SqlParameter("@TestSetupOrder", SqlDbType.Int) { Value = channel.TestSetupOrder }); object sensorId = null; if (channel.SensorId > 0) { sensorId = channel.SensorId; } cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@Disabled", SqlDbType.Bit) { Value = channel.Disabled }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = channel.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 255) { Value = channel.LastModifiedBy }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelsUpdate {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } cmd.ExecuteNonQuery(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"ChannelsUpdate {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } public ulong ChannelsGet(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, long? channelId, int? groupId, int? dasId, int? sensorId, int? testSetupId, string testSetupName, out IChannelDbRecord[] channels) { channels = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, clientDbVersion, "sp_ChannelsGet", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } var list = new List(); try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = channelId }); cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = groupId }); cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = dasId }); cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = testSetupId }); cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 255) { Value = testSetupName }); var reader = cmd.ExecuteReader(); while (reader.Read()) { //33192 Hide the TSR AIR Humidity channel var newDbRecord = new ChannelDbRecord(reader); if (newDbRecord.UserChannelName.EndsWith(DFConstantsAndEnums.USER_CHANNEL_NAME_HUMIDITY)) { continue; } list.Add(newDbRecord); } channels = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.DataRecorders, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } public ulong ChannelsDelete(IUserDbRecord user, IConnectionDetails connection, long id, out string errorString) { errorString = string.Empty; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_ChannelsDelete"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } var errorNumberULong = ErrorCodes.ERROR_SUCCESS; try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.BigInt) { Value = id }); cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 255) { Value = null }); var errorNumber = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumber); var errorMessage = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); cmd.ExecuteNonQuery(); if (null != errorNumber.Value) { if (Convert.ToInt32(errorNumber.Value) != 0) { errorNumberULong = Convert.ToUInt64(errorNumber.Value); errorString = (string)errorMessage.Value; } } } catch (Exception ex) { //Concatenate any error string returned from the stored procedure call errorString = $"{ex.Message}; {errorString}"; return errorNumberULong; } finally { cmd.Connection.Dispose(); } return errorNumberULong; } } }