using DbAPI.Connections; using DbAPI.Errors; using DbAPI.Logging; using DTS.Common.Classes.Sensors; using DTS.Common.Classes.Sensors.AnalogDiagnostics; using DTS.Common.Interface.Database; using DTS.Common.Interface.Sensors; using DTS.Common.Interface.Sensors.AnalogDiagnostics; using DTS.Common.Utilities.Logging; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Diagnostics; using System.Globalization; using System.Linq; using DTS.Common; namespace DbAPI.Sensors { /// /// Handles sensor functions /// /// internal class Sensors : ISensors { private const int DB_VERSION_TRACK_DIAGNOSTICS = 98; /// /// returns all matching analog diagnostic records /// /// user making query /// connection being queried over /// id of record, or null for all records /// id of diagnostic run, or null for all records /// sensor id to query for, or null for all /// serial number to query for, or null for all /// public ulong SensorsAnalogDiagnosticsGet(IUserDbRecord user, IConnectionDetails connection, long? Id, long? diagnosticRunId, int? sensorId, string sensorSerialNumber, out IDiagnosticEntry[] records) { records = new IDiagnosticEntry[0]; var list = new List(); if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (connection.ConnectionDbVersion < DB_VERSION_TRACK_DIAGNOSTICS) { return ErrorCodes.ERROR_NOT_SUPPORTED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_AnalogDiagnosticsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { AddNullableBigIntParameter(cmd, "@Id", Id); AddNullableBigIntParameter(cmd, "@DiagnosticRunId", diagnosticRunId); AddNullableIntParameter(cmd, "@SensorId", sensorId); AddNullableStringParameter(cmd, "@SensorSerialNumber", sensorSerialNumber); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new DiagnosticEntry(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_AnalogDiagnosticsGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves any matching /// /// user making query /// diagnostic run id to query for or null for any id /// test setup id to query for or null for any id /// test setup name to query for or null for any name /// connection to query on /// out records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsAnalogDiagnosticRunGet(IUserDbRecord user, IConnectionDetails connection, long? Id, int? testId, string testName, out IDiagnosticRun[] records) { records = new IDiagnosticRun[0]; var list = new List(); if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (connection.ConnectionDbVersion < DB_VERSION_TRACK_DIAGNOSTICS) { return ErrorCodes.ERROR_NOT_SUPPORTED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_DiagnosticRunsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { AddNullableBigIntParameter(cmd, "@Id", Id); AddNullableIntParameter(cmd, "@TestId", testId); AddNullableStringParameter(cmd, "@TestName", testName); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new DiagnosticRun(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_DiagnosticRunsGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// adds an error number style parameter to command object (int output parameter) /// /// /// /// private void AddErrorNumberParameter(SqlCommand cmd, string paramName, out SqlParameter errorNumberParam) { errorNumberParam = new SqlParameter(paramName, SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); } /// /// adds an error message style parameter to command object (nvarchar 250 output parameter) /// /// /// /// private void AddErrorMessageParameter(SqlCommand cmd, string paramName, out SqlParameter errorMessageParam) { errorMessageParam = new SqlParameter(paramName, SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); } /// /// adds a nullable double parameter to command object /// if input value is null or NaN, then DBNull is used /// /// /// /// private void AddNullableDoubleParameter(SqlCommand cmd, string paramName, double? dValue) { var cParam = new SqlParameter(paramName, SqlDbType.Float); if (null == dValue || double.IsNaN((double)dValue)) { cParam.Value = DBNull.Value; } else { cParam.Value = (double)dValue; } cmd.Parameters.Add(cParam); } /// /// adds a nullable int parameter to the command object /// /// /// /// private void AddNullableIntParameter(SqlCommand cmd, string paramName, int? dValue) { var cParam = new SqlParameter(paramName, SqlDbType.Int); if (null == dValue) { cParam.Value = DBNull.Value; } else { cParam.Value = (int)dValue; } cmd.Parameters.Add(cParam); } /// /// adds a nullable string parameter to the command object /// /// /// /// private void AddNullableStringParameter(SqlCommand cmd, string paramName, string dValue) { var cParam = new SqlParameter(paramName, SqlDbType.NVarChar); if (string.IsNullOrEmpty(dValue)) { cParam.Value = DBNull.Value; } else { cParam.Value = dValue; } cmd.Parameters.Add(cParam); } /// /// adds a nullable big int parameter to command object /// /// /// /// private void AddNullableBigIntParameter(SqlCommand cmd, string paramName, long? dValue) { var cParam = new SqlParameter(paramName, SqlDbType.BigInt); if (null == dValue) { cParam.Value = DBNull.Value; } else { cParam.Value = (long)dValue; } cmd.Parameters.Add(cParam); } /// /// update or inserts all entries passed in /// /// user committing entries /// connection to commit over /// entries to insert or update /// public ulong SensorsAnalogDiagnosticUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref IDiagnosticEntry entry) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == entry) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (entry.Timestamp < SqlDateTime.MinValue) { APILogger.Log("SensorsAnalogDiagnosticUpdateInsert - entry Timestamp is invalid"); return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_AnalogDiagnosticsUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; AddNullableBigIntParameter(cmd, "@Id", entry.Id); cmd.Parameters.Add(new SqlParameter("@DiagnosticRunId", SqlDbType.BigInt) { Value = entry.DiagnosticRunId }); AddNullableDoubleParameter(cmd, "@Excitation", entry.Excitation); cmd.Parameters.Add(new SqlParameter("@ExcitationStatus", SqlDbType.SmallInt) { Value = (int)entry.ExcitationStatus }); AddNullableDoubleParameter(cmd, "@Offset", entry.Offset); cmd.Parameters.Add(new SqlParameter("@OffsetStatus", SqlDbType.SmallInt) { Value = (int)entry.ShuntStatus }); AddNullableDoubleParameter(cmd, "@ActualRange", entry.ActualRange); cmd.Parameters.Add(new SqlParameter("@ActualRangeStatus", SqlDbType.SmallInt) { Value = (int)entry.ActualRangeStatus }); AddNullableDoubleParameter(cmd, "@Shunt", entry.Shunt); cmd.Parameters.Add(new SqlParameter("@ShuntStatus", SqlDbType.SmallInt) { Value = (int)entry.ShuntStatus }); AddNullableDoubleParameter(cmd, "@Noise", entry.Noise); cmd.Parameters.Add(new SqlParameter("@NoiseStatus", SqlDbType.SmallInt) { Value = (int)entry.NoiseStatus }); AddNullableIntParameter(cmd, "@SensorId", entry.SensorId); cmd.Parameters.Add(new SqlParameter("@SensorSerialNumber", SqlDbType.NVarChar) { Value = entry.SensorSerialNumber }); AddNullableIntParameter(cmd, "@DasId", entry.DASId); cmd.Parameters.Add(new SqlParameter("@DASSerialNumber", SqlDbType.NVarChar) { Value = entry.DASSerialNumber }); cmd.Parameters.Add(new SqlParameter("@DASChannelIdx", SqlDbType.Int) { Value = entry.DASChannelIdx }); cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar) { Value = entry.UserCode }); cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar) { Value = entry.UserChannelName }); cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar) { Value = entry.IsoCode }); cmd.Parameters.Add(new SqlParameter("@IsoChannelName", SqlDbType.NVarChar) { Value = entry.IsoChannelName }); cmd.Parameters.Add(new SqlParameter("@ScaleFactorMV", SqlDbType.Float) { Value = entry.ScaleFactor }); AddNullableIntParameter(cmd, "@CalibrationRecordId", entry.CalibrationRecordId); cmd.Parameters.Add(new SqlParameter("@CalibrationRecord", SqlDbType.NVarChar) { Value = entry.CalibrationRecordXML }); cmd.Parameters.Add(new SqlParameter("@Timestamp", SqlDbType.DateTime) { Value = entry.Timestamp }); AddErrorNumberParameter(cmd, "@errorNumber", out var errorNumberParam); AddErrorMessageParameter(cmd, "@errorMessage", out var errorMessageParam); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_AnalogDiagnosticsUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { entry.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_AnalogDiagnosticsUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_AnalogDiagnosticsUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// updates or inserts a Diagnostic run into the database /// /// user committing record /// connection diagnostic run is being committed over /// the record to insert or update /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsAnalogDiagnosticRunUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref IDiagnosticRun run) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == run) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_DiagnosticRunsUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; AddNullableBigIntParameter(cmd, "@Id", run.Id); cmd.Parameters.Add(new SqlParameter("@DataPROUser", SqlDbType.NVarChar) { Value = run.DataPROUser }); AddNullableIntParameter(cmd, "@TestId", run.TestId); cmd.Parameters.Add(new SqlParameter("@TestName", SqlDbType.NVarChar) { Value = run.TestName }); cmd.Parameters.Add(new SqlParameter("@PreTest", SqlDbType.Bit) { Value = run.PreTest }); AddErrorNumberParameter(cmd, "@errorNumber", out var errorNumberParam); AddErrorMessageParameter(cmd, "@errorMessage", out var errorMessageParam); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_DiagnosticRunsUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { run.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_DiagnosticRunsUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_DiagnosticRunsUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// updates or inserts an input stream record into the database /// Database id is modified on record on an insert operation /// appears to always do an insert currently? /// /// user committing record /// connection record is being committed over /// record to be inserted or updated /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsInputStreamUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref IStreamInputRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsStreamInputUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@UDPAddress", SqlDbType.NVarChar) { Value = record.StreamInUDPAddress }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.LastUpdatedBy }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.Binary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamInputUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { record.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamInputUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamInputUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves matching input streams from database /// /// user making request /// connection over which to look for records /// database id of record (use null for all) /// serial number of record (use null for all) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsInputStreamGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string SerialNumber, out IStreamInputRecord[] records) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsStreamInputGet"); 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = SerialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new StreamInputRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamInputGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves matching thermocouplers from database /// /// user making request /// connection over which to look for records /// database id of record (use null for all) /// serial number of record (use null for all) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsThermocouplerGet(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, int? Id, string SerialNumber, out IThermocouplerRecord[] records) { var storedProcedureVersionToUse = 0; SqlCommand cmd; records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorsThermocouplerGet", out storedProcedureVersionToUse, out cmd); 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = SerialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new ThermocouplerRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsThermocouplerGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// updates or inserts an output stream record into the database /// Database id is modified on record on an insert operation /// appears to always do an insert currently? /// /// user committing record /// connection record is being committed over /// record to be inserted or updated /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsOutputStreamUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref IStreamOutputRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, Database.Database.GetStoredProcedureVersionCached(connection, "sp_SensorsStreamOutputUpdateInsert")); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@StreamProfile", SqlDbType.NVarChar) { Value = record.StreamOutUDPProfile }); cmd.Parameters.Add(new SqlParameter("@UDPAddress", SqlDbType.NVarChar) { Value = record.StreamOutUDPAddress }); cmd.Parameters.Add(new SqlParameter("@TimeChannelId", SqlDbType.Int) { Value = record.StreamOutUDPTimeChannelId }); cmd.Parameters.Add(new SqlParameter("@DataChannelId", SqlDbType.Int) { Value = record.StreamOutUDPDataChannelId }); cmd.Parameters.Add(new SqlParameter("@TmNSConfig", SqlDbType.NVarChar) { Value = record.StreamOutUDPTmNSConfig }); cmd.Parameters.Add(new SqlParameter("@IRIGTimeDataPacketIntervalMs", SqlDbType.Int) { Value = record.StreamOutIRIGTimeDataPacketIntervalMs }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.LastUpdatedBy }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.Binary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); if (connection.ClientDbVersion >= DTS.Common.Constants.TMATS_INTERVAL_VERSION && connection.ConnectionDbVersion >= DTS.Common.Constants.TMATS_INTERVAL_VERSION) { cmd.Parameters.Add(new SqlParameter("@TMATSIntervalMs", SqlDbType.Int) { Value = record.StreamOutTMATSIntervalMs }); } var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamOutputUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { record.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamOutputUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamOutputUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves matching output streams from database /// /// user making request /// connection over which to look for records /// database id of record (use null for all) /// serial number of record (use null for all) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsOutputStreamGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string SerialNumber, out IStreamOutputRecord[] 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_SensorsStreamOutputGet")); 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = SerialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new StreamOutputRecord(reader, connection.ClientDbVersion, connection.ConnectionDbVersion)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsStreamOutputGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// updates or inserts a new UART record into the database /// Id is updated if a new record is inserted /// /// user committing UART /// connection UART should be committed on /// record being inserted or updated /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsUARTUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref IUARTRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsUARTUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@BaudRate", SqlDbType.Int) { Value = record.UartBaudRate }); cmd.Parameters.Add(new SqlParameter("@DataBits", SqlDbType.Int) { Value = record.UartDataBits }); cmd.Parameters.Add(new SqlParameter("@StopBits", SqlDbType.NVarChar) { Value = record.UartStopBits }); cmd.Parameters.Add(new SqlParameter("@Parity", SqlDbType.NVarChar) { Value = record.UartParity }); cmd.Parameters.Add(new SqlParameter("@FlowControl", SqlDbType.NVarChar) { Value = record.UartFlowControl }); cmd.Parameters.Add(new SqlParameter("@DataFormat", SqlDbType.NVarChar) { Value = record.UartDataFormat }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.LastUpdatedBy }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.Binary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsUARTUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { record.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsUARTUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsUARTUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves UART settings /// /// user making requests /// connection request sh /// Id to search for (use null for all) /// serial number to search for (use null or empty for all) /// matching records found /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsUARTGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string SerialNumber, out IUARTRecord[] records) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsUARTGet"); 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = SerialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new UARTRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsUARTGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } public ulong SensorsCanGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string SerialNumber, out ICANRecord[] records) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = DbAPI.GetDatabaseVersion(connection, out int actualDbVersion); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } if (actualDbVersion < Constants.SLICE_PRO_CAN_FD_DB_VERSION) { return ErrorCodes.ERROR_NOT_SUPPORTED; } ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsCANGet"); 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = SerialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new CANRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsCANGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } public ulong SensorsCanUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ref ICANRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = DbAPI.GetDatabaseVersion(connection, out int actualDbVersion); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } if (actualDbVersion < Constants.SLICE_PRO_CAN_FD_DB_VERSION) { return ErrorCodes.ERROR_NOT_SUPPORTED; } ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsCanUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.LastUpdatedBy }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.Binary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsCanUpdateInsert failed, {Convert.ToInt32(errorNumberParam.Value)}, {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (!DBNull.Value.Equals(newIdParam.Value)) { record.Id = Convert.ToInt32(newIdParam.Value); } else { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsCanUpdateInsert failed, no new_id returned"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsCanUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// commits a digital output setting to the db /// The record will be modified with a new database id if /// a new record is inserted /// /// user making commit /// connection over which to commit /// the record to commit /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsDigitalOutUpdateInsert(IUserDbRecord user, IConnectionDetails connection, IDigitalOutDbRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDigitalOutUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add( new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add( new SqlParameter("@DelayMS", SqlDbType.Float) { Value = record.DODelay }); cmd.Parameters.Add( new SqlParameter("@DurationMSFloat", SqlDbType.Float) { Value = record.DODuration }); cmd.Parameters.Add( new SqlParameter("@OutputMode", SqlDbType.SmallInt) { Value = (int)record.DOMode }); cmd.Parameters.Add( new SqlParameter("@LimitDuration", SqlDbType.Bit) { Value = record.LimitDuration }); cmd.Parameters.Add( new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add( new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.ModifiedBy }); cmd.Parameters.Add(new SqlParameter("@Version", SqlDbType.Int) { Value = record.Version }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.Binary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumberParam.Value) && 0 != Convert.ToInt32(errorNumberParam.Value)) { APILogger.Log($"sp_SensorsDigitalOutUpdateInsert failed: {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } record.DatabaseId = Convert.ToInt32(newIdParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsDigitalInUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves all matching digital output settings in the db /// /// user requesting records /// connection to query records on /// Database id of records (can be null) /// serial number/name of setting (can be null) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsDigitalOutGet( IUserDbRecord user, IConnectionDetails connection, int? id, string serialNumber, out IDigitalOutDbRecord[] records) { records = new IDigitalOutDbRecord[0]; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDigitalOutGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (id is null) { 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { var record = new DigitalOutDbRecord(reader); list.Add(record); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsDigitalOutGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// inserts or updates a digital input record into the db. If a record is inserted /// then the original record is updated with the database id of the entry /// /// user committing record /// /// /// public ulong SensorsDigitalInUpdateInsert(IUserDbRecord user, IConnectionDetails connection, IDigitalInDbRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDigitalInUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@SettingMode", SqlDbType.Int) { Value = (int)record.Mode }); cmd.Parameters.Add(new SqlParameter("@ScaleMultiplier", SqlDbType.NVarChar) { Value = record.ScaleMultiplier.ToSerializeDbString() }); cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar, 50) { Value = record.ISOCode }); cmd.Parameters.Add(new SqlParameter("@IsoChannelName", SqlDbType.NVarChar, 255) { Value = record.ISOChannelName }); if (null == record.UserCode) { record.UserCode = string.Empty; } cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar, 50) { Value = record.UserCode }); if (null == record.UserChannelName) { record.UserChannelName = string.Empty; } cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar, 255) { Value = record.UserChannelName }); cmd.Parameters.Add( new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add( new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar) { Value = record.LastModifiedBy }); cmd.Parameters.Add(new SqlParameter("@eId", SqlDbType.NVarChar) { Value = record.EID }); if (null == record.UserValue1) { record.UserValue1 = string.Empty; } cmd.Parameters.Add( new SqlParameter("@UserValue1", SqlDbType.NVarChar) { Value = record.UserValue1 }); if (null == record.UserValue2) { record.UserValue2 = string.Empty; } cmd.Parameters.Add( new SqlParameter("@UserValue2", SqlDbType.NVarChar) { Value = record.UserValue2 }); if (null == record.UserValue3) { record.UserValue3 = string.Empty; } cmd.Parameters.Add( new SqlParameter("@UserValue3", SqlDbType.NVarChar) { Value = record.UserValue3 }); cmd.Parameters.Add( new SqlParameter("@UserTags", SqlDbType.VarBinary) { Value = record.UserTags }); cmd.Parameters.Add( new SqlParameter("@MeasurementUnit", SqlDbType.NVarChar) { Value = record.MeasurementUnit }); cmd.Parameters.Add( new SqlParameter("@FilterClass", SqlDbType.NVarChar) { Value = record.FilterClass.ToString() }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); 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)) { APILogger.Log($"sp_SensorsDigitalInUpdateInsert failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } record.Id = Convert.ToInt32(newIdParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsDigitalInUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves any digital input settings matching input criteria /// in the database /// /// user making request /// connection to query over /// Database Id of digital input setting (can be null) /// serial number of setting (can be null) /// Electronic id of setting (can be null) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong SensorsDigitalInGet(IUserDbRecord user, IConnectionDetails connection, int? id, string serialNumber, string eId, out IDigitalInDbRecord[] records) { records = new IDigitalInDbRecord[0]; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDigitalInGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (id is null) { 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); cmd.Parameters.Add(new SqlParameter("@EID", SqlDbType.NVarChar, 50) { Value = eId }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { var record = new DigitalInDbRecord(reader); list.Add(record); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsDigitalInGet failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// Inserts or updates a squib setting in the db /// setting is modified with new db id after execution /// /// user inserting setting /// connection for inserting /// record to be inserted /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsSquibUpdateInsert(IUserDbRecord user, IConnectionDetails connection, ISquibDbRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsSquibUpdateInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("Id", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("IsoChannelName", SqlDbType.NVarChar, 255) { Value = record.IsoChannelName }); if (null == record.UserCode) { record.UserCode = string.Empty; } cmd.Parameters.Add(new SqlParameter("UserCode", SqlDbType.NVarChar, 50) { Value = record.UserCode }); if (null == record.UserChannelName) { record.UserChannelName = string.Empty; } cmd.Parameters.Add(new SqlParameter("UserChannelName", SqlDbType.NVarChar, 255) { Value = record.UserChannelName }); cmd.Parameters.Add(new SqlParameter("Broken", SqlDbType.Bit) { Value = record.Broken }); cmd.Parameters.Add(new SqlParameter("DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = record.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@BypassCurrentFilter", SqlDbType.Bit) { Value = record.BypassCurrentFilter }); cmd.Parameters.Add(new SqlParameter("@BypassVoltageFilter", SqlDbType.Bit) { Value = record.BypassVoltageFilter }); cmd.Parameters.Add(new SqlParameter("@DelayMS", SqlDbType.Float) { Value = record.DelayMs }); cmd.Parameters.Add(new SqlParameter("@DurationMS", SqlDbType.Float) { Value = record.DurationMs }); cmd.Parameters.Add(new SqlParameter("@FireMode", SqlDbType.SmallInt) { Value = (short)record.FireMode }); cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar, 50) { Value = record.IsoCode }); cmd.Parameters.Add( new SqlParameter("@MeasurementType", SqlDbType.SmallInt) { Value = (short)record.MeasurementType }); cmd.Parameters.Add(new SqlParameter("@SquibOutputCurrent", SqlDbType.Float) { Value = record.SquibOutputCurrent }); cmd.Parameters.Add(new SqlParameter("@SquibToleranceLow", SqlDbType.Float) { Value = record.SquibToleranceLow }); cmd.Parameters.Add(new SqlParameter("@SquibToleranceHigh", SqlDbType.Float) { Value = record.SquibToleranceHigh }); cmd.Parameters.Add(new SqlParameter("@LimitDuration", SqlDbType.Bit) { Value = record.LimitDuration }); cmd.Parameters.Add(new SqlParameter("@DefineDelayInTest", SqlDbType.Bit) { Value = record.DefineDelayInTest }); cmd.Parameters.Add(new SqlParameter("@ArticleId", SqlDbType.NVarChar, 50) { Value = record.ArticleId }); cmd.Parameters.Add(new SqlParameter("@Version", SqlDbType.Int) { Value = record.Version }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 50) { Value = record.LastModifiedBy }); if (null == record.UserValue1) { record.UserValue1 = string.Empty; } cmd.Parameters.Add(new SqlParameter("@UserValue1", SqlDbType.NVarChar, 255) { Value = record.UserValue1 }); if (null == record.UserValue2) { record.UserValue2 = string.Empty; } cmd.Parameters.Add(new SqlParameter("@UserValue2", SqlDbType.NVarChar, 255) { Value = record.UserValue2 }); if (null == record.UserValue3) { record.UserValue3 = string.Empty; } cmd.Parameters.Add(new SqlParameter("@UserValue3", SqlDbType.NVarChar, 255) { Value = record.UserValue3 }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.VarBinary) { Value = record.UserTags }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); 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)) { APILogger.Log($"sp_SensorsSquibUpdateInsert failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } record.Id = Convert.ToInt32(newIdParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"sp_SensorsSquibUpdateInsert failed, {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves all squib settings matching input criteria /// /// user requesting squib settings /// connection for retrieving squib settings /// Electronic Id /// Database Id for squib setting /// serial number/name of squib setting /// output records discovered /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong SensorsSquibGet(IUserDbRecord user, IConnectionDetails connection, int? Id, string serialNumber, string eId, out ISquibDbRecord[] records) { records = new ISquibDbRecord[0]; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsSquibGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (Id is null) { 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("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); cmd.Parameters.Add(new SqlParameter("@EID", SqlDbType.NVarChar, 50) { Value = eId }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { var squib = new SquibDbRecord(reader); list.Add(squib); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// Deletes ALL sensors in the db /// /// user deleting sensors /// connection sensors to be deleted on /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong SensorsDeleteAll(IUserDbRecord user, IConnectionDetails connection) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDeleteAll"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; 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)) { APILogger.Log($"sp_SensorsDeleteAll failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves the bridge resistance for a sensor /// /// user making query /// connection query is being made on /// serial number of sensor /// output bridge resistance of sensor /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsAnalogBridgeResistanceGet(IUserDbRecord user, IConnectionDetails connection, string serialNumber, out double bridgeResistance) { bridgeResistance = double.NaN; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsAnalogBridgeResistanceGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@sensorID", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); var bridgeResParam = new SqlParameter("@BridgeResistance", SqlDbType.Float) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(bridgeResParam); 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)) { APILogger.Log($"sp_SensorsAnalogBridgeResistanceGet failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } if (DBNull.Value.Equals(bridgeResParam.Value)) { APILogger.Log($"sp_SensorsAnalogBridgeResistanceGet failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } bridgeResistance = Convert.ToDouble(bridgeResParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// deletes all sensor calibrations matching criteria /// nulls are wild cards, so passing in all nulls will /// delete all calibrations /// /// user deleting calibrations /// connection to use for deletes /// allows null /// allows null /// allows null /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong SensorCalibrationsDelete(IUserDbRecord user, IConnectionDetails connection, string sensorSerialNumber, DateTime? calibrationDate, DateTime? modifyDate ) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorCalibrationsDelete"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { var list = new List(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@SensorSerialNumber", SqlDbType.NVarChar, 255) { Value = sensorSerialNumber }); if (null == calibrationDate) { cmd.Parameters.Add(new SqlParameter("@CalibrationDate", SqlDbType.DateTime) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@CalibrationDate", SqlDbType.DateTime) { Value = (DateTime)calibrationDate }); } if (null == modifyDate) { cmd.Parameters.Add(new SqlParameter("@ModifiedDate", SqlDbType.DateTime) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@ModifiedDate", SqlDbType.DateTime) { Value = (DateTime)modifyDate }); } 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)) { APILogger.Log($"SensorCalibrationsDelete failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// inserts a new calibration record /// /// user submitting record /// connection record is being submitted on /// calibration record /// type of sensor /// /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorCalibrationsInsert(IUserDbRecord user, IConnectionDetails connection, ISensorCalDbRecord cal, int sensorType, bool setCalibrationId) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == cal) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (sensorType < 0) { return ErrorCodes.ERROR_MISSING_PARAMETER; } SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorCalibrationsInsert", out var storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("Id", SqlDbType.TinyInt) { Value = null }); cmd.Parameters.Add(new SqlParameter("@SensorSerialNumber", SqlDbType.NVarChar, 50) { Value = cal.SerialNumber }); cmd.Parameters.Add(new SqlParameter("@SensorType", SqlDbType.TinyInt) { Value = sensorType }); cmd.Parameters.Add(new SqlParameter("@CalibrationDate", SqlDbType.DateTime) { Value = cal.CalibrationDate.Date.ToShortDateString() }); cmd.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 50) { Value = cal.Username ?? "" }); cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = cal.LocalOnly }); cmd.Parameters.Add(new SqlParameter("@NonLinear", SqlDbType.Bit) { Value = cal.NonLinear }); cmd.Parameters.Add(new SqlParameter("@ModifyDate", SqlDbType.DateTime) { Value = cal.ModifyDate }); cmd.Parameters.Add(new SqlParameter("@IsProportional", SqlDbType.Bit) { Value = cal.IsProportional }); cmd.Parameters.Add(new SqlParameter("@RemoveOffset", SqlDbType.Bit) { Value = cal.RemoveOffset }); if (storedProcedureVersionToUse >= DTS.Common.Constants.SENSOR_ASSEMBLY_DB_VERSION) { cmd.Parameters.Add(new SqlParameter("@SensitivityInspection", SqlDbType.Int) { Value = cal.SensitivityInspection }); cmd.Parameters.Add(new SqlParameter("@CalibrationNote", SqlDbType.NVarChar, 2048) { Value = cal.CalibrationNote }); cmd.Parameters.Add(new SqlParameter("@UsageCount", SqlDbType.Int) { Value = cal.UsageCount }); } var zero = cal.ZeroMethods; if (null == zero) { zero = new ZeroMethods(new ZeroMethod(DTS.Common.Enums.Sensors.ZeroMethodType.None, -.5, -.2)); } cmd.Parameters.Add( new SqlParameter("@ZeroMethod", SqlDbType.NVarChar, 255) { Value = zero.ToSerializedString() }); cmd.Parameters.Add(new SqlParameter("@CertificationDocuments", SqlDbType.NVarChar, 2048) { Value = string.Join(CultureInfo.InvariantCulture.TextInfo.ListSeparator, cal.CertificationDocuments.ToArray()) }); var offset = cal.InitialOffsets; if (null == offset) { offset = new InitialOffsets(new InitialOffset(0)); } cmd.Parameters.Add( new SqlParameter("@InitialOffset", SqlDbType.NVarChar) { Value = offset.ToSerializedString() }); cmd.Parameters.Add( new SqlParameter("@CalibrationRecords", SqlDbType.NVarChar, 255) { Value = cal.Records.ToSerializedString(cal) }); cmd.Parameters.Add(new SqlParameter("@SetLatestCalibrationId", SqlDbType.Bit) { Value = setCalibrationId }); var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); 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); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value) && 0 != Convert.ToInt32(errorNumber.Value)) { APILogger.Log($"SensorsCalibrationsInsert failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } cal.CalibrationId = Convert.ToInt32(newIdParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// deletes all sensors matching criteria /// sensor types are defined in table SensorsType /// 0 - analog /// 1 - digital in /// 2 - digital out /// 3 - squib /// 4 - UART /// /// user deleting sensors /// connection sensors are being deleted on /// id in database /// type of sensor /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong SensorsDelete(IUserDbRecord user, IConnectionDetails connection, int sensorId, int sensorType) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsDelete"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { var list = new List(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@SensorType", SqlDbType.Int) { Value = sensorType }); 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)) { APILogger.Log($"SensorsDelete failed: {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves all sensor calibrations matching search criteria /// /// /// /// /// /// null, or calibrations found /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorCalibrationsGet(IUserDbRecord user, IConnectionDetails connection, int? sensorId, string serialNumber, out ISensorCalDbRecord[] calibrations) { calibrations = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = DbAPI.GetDatabaseVersion(connection, out int actualDbVersion); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorCalibrationsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { var list = new List(); cmd.CommandType = CommandType.StoredProcedure; if (null != sensorId) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = (int)sensorId }); } cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new SensorCalDbRecord(reader, actualDbVersion)); } calibrations = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// commits an analog sensor to the db /// /// DataPRO user making commit /// connection commit is being made on /// the record being committed /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsAnalogUpdateInsert(IUserDbRecord user, IConnectionDetails connection, IAnalogDbRecord record) { if (null == record || string.IsNullOrWhiteSpace(record.SerialNumber)) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorsAnalogUpdateInsert", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add( new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = record.SerialNumber }); cmd.Parameters.Add( new SqlParameter("@UserSerialNumber", SqlDbType.NVarChar, 50) { Value = record.UserSerialNumber ?? "" }); cmd.Parameters.Add( new SqlParameter("@DiagnosticsMode", SqlDbType.Bit) { Value = record.DiagnosticsMode }); cmd.Parameters.Add( new SqlParameter("@SensorModelId", SqlDbType.Int) { Value = 0 }); if ( null == record.Model) { record.Model = string.Empty; } cmd.Parameters.Add(new SqlParameter("@Model", SqlDbType.NVarChar, 50) { Value = record.Model }); cmd.Parameters.Add( new SqlParameter("@Manufacturer", SqlDbType.NVarChar, 50) { Value = record.Manufacturer }); cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.SmallInt) { Value = (int)record.Status }); cmd.Parameters.Add( new SqlParameter("@MeasurementUnit", SqlDbType.NVarChar, 50) { Value = record.DisplayUnit }); cmd.Parameters.Add( new SqlParameter("@OffsetToleranceLow", SqlDbType.Float) { Value = record.OffsetToleranceLow }); cmd.Parameters.Add( new SqlParameter("@OffsetToleranceHigh", SqlDbType.Float) { Value = record.OffsetToleranceHigh }); cmd.Parameters.Add(new SqlParameter("@eId", SqlDbType.NVarChar, 50) { Value = record.EId ?? "" }); cmd.Parameters.Add(new SqlParameter("@Capacity", SqlDbType.Float) { Value = record.Capacity }); cmd.Parameters.Add(new SqlParameter("@Comment", SqlDbType.NVarChar, 50) { Value = record.Comment ?? "" }); cmd.Parameters.Add( new SqlParameter("@BridgeType", SqlDbType.SmallInt) { Value = DTS.Common.Enums.Sensors.SensorConstants.ConvertBridgeToInt(record.Bridge) }); cmd.Parameters.Add( new SqlParameter("@BridgeLegMode", SqlDbType.SmallInt) { Value = record.BridgeLegMode }); cmd.Parameters.Add(new SqlParameter("@Shunt", SqlDbType.SmallInt) { Value = (int)record.Shunt }); cmd.Parameters.Add(new SqlParameter("@Invert", SqlDbType.Bit) { Value = record.Invert }); cmd.Parameters.Add(new SqlParameter("@UserValue1", SqlDbType.NVarChar, 50) { Value = record.UserValue1 ?? "" }); cmd.Parameters.Add(new SqlParameter("@UserValue2", SqlDbType.NVarChar, 50) { Value = record.UserValue2 ?? "" }); cmd.Parameters.Add(new SqlParameter("@UserValue3", SqlDbType.NVarChar, 50) { Value = record.UserValue3 ?? "" }); var filter = record.Filter; if (null == filter) { filter = new FilterClass(DTS.Common.Enums.Sensors.FilterClassType.None); } cmd.Parameters.Add( new SqlParameter("@FilterClass", SqlDbType.NVarChar, 50) { Value = filter.ToString() }); cmd.Parameters.Add( new SqlParameter("@BridgeResistance", SqlDbType.Float) { Value = record.BridgeResistance }); //these parameters are required not null, if they are null in the commit just use string.empty //http://manuscript.dts.local/f/cases/38044/EQX-doesn-t-import-sensors-and-doesn-t-say-it-didn-t-import-sensors cmd.Parameters.Add(new SqlParameter("@IsoCode", SqlDbType.NVarChar, 50) { Value = record.ISOCode ?? string.Empty }); cmd.Parameters.Add(new SqlParameter("@IsoChannelName", SqlDbType.NVarChar, 255) { Value = record.ISOChannelName ?? string.Empty }); cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar, 50) { Value = record.UserCode ?? string.Empty }); cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar, 255) { Value = record.UserChannelName ?? string.Empty }); cmd.Parameters.Add(new SqlParameter("@CheckOffset", SqlDbType.Bit) { Value = record.CheckOffset }); cmd.Parameters.Add(new SqlParameter("@SupportedExcitation", SqlDbType.NVarChar, 50) { Value = string.Join(CultureInfo.InvariantCulture.TextInfo.ListSeparator, record.SupportedExcitation.Select(e => e.ToString()).ToArray()) }); var initialEU = 0D; if (null != record.InitialEu) { initialEU = (double)record.InitialEu; } cmd.Parameters.Add(new SqlParameter("@InitialEU", SqlDbType.Float) { Value = initialEU }); cmd.Parameters.Add(new SqlParameter("@CalInterval", SqlDbType.Int) { Value = record.CalInterval }); cmd.Parameters.Add(new SqlParameter("@CalibrationSignal", SqlDbType.Bit) { Value = record.CalibrationSignal }); cmd.Parameters.Add( new SqlParameter("@InternalShuntResistance", SqlDbType.Float) { Value = record.InternalShuntResistance }); cmd.Parameters.Add( new SqlParameter("@ExternalShuntResistance", SqlDbType.Float) { Value = record.ExternalShuntResistance }); cmd.Parameters.Add(new SqlParameter("@UniPolar", SqlDbType.Bit) { Value = record.UniPolar }); cmd.Parameters.Add(new SqlParameter("@RangeLow", SqlDbType.Float) { Value = record.RangeLow }); cmd.Parameters.Add(new SqlParameter("@RangeAve", SqlDbType.Float) { Value = record.RangeMedium }); cmd.Parameters.Add(new SqlParameter("@RangeHigh", SqlDbType.Float) { Value = record.RangeHigh }); var created = record.Created; if (created < SqlDateTime.MinValue.Value) { created = SqlDateTime.MinValue.Value; } if (created > SqlDateTime.MaxValue.Value) { created = SqlDateTime.MaxValue.Value; } cmd.Parameters.Add(new SqlParameter("@Created", SqlDbType.DateTime) { Value = created }); cmd.Parameters.Add(new SqlParameter("@TimesUsed", SqlDbType.BigInt) { Value = record.TimesUsed }); cmd.Parameters.Add(new SqlParameter("@SensorCategory", SqlDbType.Int) { Value = record.SensorCategory }); cmd.Parameters.Add(new SqlParameter("@BypassFilter", SqlDbType.Bit) { Value = record.BypassFilter }); cmd.Parameters.Add(new SqlParameter("@CouplingMode", SqlDbType.SmallInt) { Value = (int)record.CouplingMode }); cmd.Parameters.Add(new SqlParameter("@Version", SqlDbType.Int) { Value = record.Version }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add( new SqlParameter("@ModifiedBy", SqlDbType.NVarChar, 50) { Value = record.ModifiedBy }); cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = record.LocalOnly }); cmd.Parameters.Add(new SqlParameter("@AxisNumber", SqlDbType.SmallInt) { Value = record.AxisNumber }); cmd.Parameters.Add(new SqlParameter("@NumberOfAxes", SqlDbType.SmallInt) { Value = record.NumberOfAxes }); cmd.Parameters.Add(new SqlParameter("@UserTags", SqlDbType.VarBinary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@DoNotUse", SqlDbType.Bit) { Value = record.DoNotUse }); cmd.Parameters.Add(new SqlParameter("@Broken", SqlDbType.Bit) { Value = record.Broken }); object o = DBNull.Value; if (null != record.FirstUseDate) { o = (DateTime)record.FirstUseDate; } cmd.Parameters.Add(new SqlParameter("@FirstUseDate", SqlDbType.DateTime) { Value = o }); cmd.Parameters.Add(new SqlParameter("@LatestCalibrationId", SqlDbType.Int) { Value = DBNull.Value }); cmd.Parameters.Add(new SqlParameter("@ACCouplingModeEnabled", SqlDbType.Bit) { Value = record.ACCouplingModeEnabled }); if (storedProcedureVersionToUse >= DTS.Common.Constants.SENSOR_ASSEMBLY_DB_VERSION) { cmd.Parameters.Add(new SqlParameter("@SensitivityTolerancePercent", SqlDbType.Float) { Value = record.SensitivityTolerancePercent }); cmd.Parameters.Add(new SqlParameter("@AssemblyName", SqlDbType.NVarChar, 50) { Value = record.AssemblyName }); cmd.Parameters.Add(new SqlParameter("@UsageCount", SqlDbType.Int) { Value = record.UsageCount }); cmd.Parameters.Add(new SqlParameter("@MaximumUsage", SqlDbType.Int) { Value = record.MaximumUsage }); } var newIdParam = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newIdParam); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); if (int.Parse(errorNumberParam.Value.ToString()) != 0) { APILogger.Log($"SensorsAnalogUpdateInsert failed: {errorMessageParam.Value}"); return ErrorCodes.ERROR_UNKNOWN; } record.Id = Convert.ToInt32(newIdParam.Value); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves all analog sensors matching search criteria /// /// user querying sensors /// connection is using /// sensor database id (allows null) /// sensor serial number (allows null) /// electronic Id (DALLAS or TEDS id value) /// any sensors matching criteria /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsAnalogGet(IUserDbRecord user, IConnectionDetails connection, int? sensorId, string serialNumber, string eId, out IAnalogDbRecord[] sensors) { sensors = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = DbAPI.GetDatabaseVersion(connection, out int actualDbVersion); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsAnalogGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { var list = new List(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); cmd.Parameters.Add(new SqlParameter("@EID", SqlDbType.NVarChar, 50) { Value = eId }); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new AnalogDbRecord(reader, actualDbVersion)); } sensors = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } /// /// retrieves all analog sensors matching search criteria /// /// user querying sensors /// connection is using /// sensor serial number (allows null) /// any sensors matching criteria /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong SensorsGet(IUserDbRecord user, IConnectionDetails connection, string serialNumber, out ISensorDbRecord[] sensors) { sensors = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_SensorsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { var list = new List(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar, 50) { Value = serialNumber }); var reader = cmd.ExecuteReader(); while (reader.Read()) { list.Add(new SensorDbRecord(reader)); } sensors = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, ex.Message); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } public ulong UpdateAssemblySensorUsageCount(IUserDbRecord user, IConnectionDetails connection, string assemblyName, int newUsageCount) { if (string.IsNullOrWhiteSpace(assemblyName) || newUsageCount == 0) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorsAnalogAssemblyUsageCountUpdate", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@AssemblyName", SqlDbType.NVarChar, 50) { Value = assemblyName }); cmd.Parameters.Add(new SqlParameter("@UsageCount", SqlDbType.Int) { Value = newUsageCount }); 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) && Convert.ToInt32(errorNumber.Value) != 0) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"Error number in {cmd.CommandText} = {errorNumber.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } public ulong UpdateSensorUsageCount(IUserDbRecord user, IConnectionDetails connection, ISensorData sd) { if (null == sd || sd.DatabaseId == 0 || string.IsNullOrWhiteSpace(sd.DatabaseId.ToString())) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorsAnalogUsageCountUpdate", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sd.DatabaseId }); cmd.Parameters.Add(new SqlParameter("@UsageCount", SqlDbType.Int) { Value = sd.UsageCount }); 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) && Convert.ToInt32(errorNumber.Value) != 0) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"Error number in {cmd.CommandText} = {errorNumber.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } public ulong UpdateSensorCalibrationUsageCount(IUserDbRecord user, IConnectionDetails connection, int sensorId, int sensorCalibrationId, int newUsageCount) { if (string.IsNullOrWhiteSpace(sensorCalibrationId.ToString()) || (sensorCalibrationId <= 0)) { return ErrorCodes.ERROR_MISSING_PARAMETER; } if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = Database.Database.PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_SensorCalibrationsUsageCountUpdate", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@SensorCalibrationId", SqlDbType.Int) { Value = sensorCalibrationId }); cmd.Parameters.Add(new SqlParameter("@UsageCount", SqlDbType.Int) { Value = newUsageCount }); 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) && Convert.ToInt32(errorNumber.Value) != 0) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Sensors, $"Error number in {cmd.CommandText} = {errorNumber.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } } }