using DbAPI.Connections; using DbAPI.Errors; using DbAPI.Logging; using DTS.Common.Classes.Groups; using DTS.Common.Classes.TestSetups; using DTS.Common.Interface.Database; using DTS.Common.Interface.Groups; using DTS.Common.Interface.TestSetups; using DTS.Common.Interface.TestSetups.TestSetupsList; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.Linq; namespace DbAPI.TestSetups { /// /// Handles TestSetup functions /// /// internal class TestSetups : ITestSetups { /// /// deletes matching test setup hardware record /// at least one parameter (id/dasid/testsetupid) must be specified /// /// user making request /// connection request is being made on /// id of test setup hardware record (null for all) /// id of das (null for all) /// id of test setup (null for all) /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupHardwareDelete(IUserDbRecord user, IConnectionDetails connection, int? Id, int? dasId, int? testSetupId ) { if (null == Id && null == dasId && null == testSetupId) { 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_TestSetupHardwareDelete"); 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 }); } if (null == dasId) { cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = (int)dasId }); } if (null == testSetupId) { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = (int)testSetupId }); } 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 && !DBNull.Value.Equals(errorNumber.Value)) { if (0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareDelete - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareDelete - Error {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// updates a test setup hardware record /// /// user committing update /// connection update is being made on /// updated record /// 0 on success, all other values are error codes public ulong TestSetupHardwareUpdate(IUserDbRecord user, IConnectionDetails connection, ITestSetupHardwareRecord record) { if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } SqlCommand cmd; var ret = PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_TestSetupHardwareUpdate", out int storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = record.DASId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@AddOrRemove", SqlDbType.Bit) { Value = record.AddDAS }); cmd.Parameters.Add(new SqlParameter("@SamplesPerSecond", SqlDbType.Float) { Value = record.SamplesPerSecond }); cmd.Parameters.Add(new SqlParameter("@IsClockMaster", SqlDbType.Bit) { Value = record.IsClockMaster }); cmd.Parameters.Add(new SqlParameter("@AntiAliasFilterRate", SqlDbType.Float) { Value = record.AntiAliasFilterRate }); if (storedProcedureVersionToUse >= DTS.Common.Constants.PTP_DOMAIN_ID_DB_VERSION) { cmd.Parameters.Add(new SqlParameter("@PTPDomainId", SqlDbType.Int) { Value = (int)record.PTPDomainId }); } 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 && !DBNull.Value.Equals(errorNumber.Value)) { if (0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareUpdate - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareUpdate - Error {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// inserts a new record /// /// user inserting record /// connection being inserted on /// record being inserted /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupHardwareInsert(IUserDbRecord user, IConnectionDetails connection, ITestSetupHardwareRecord record) { if (null == record) { return ErrorCodes.ERROR_MISSING_PARAMETER; } SqlCommand cmd; var ret = PrepareForDbAccess(user, connection, connection.ClientDbVersion, "sp_TestSetupHardwareInsert", out int storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@DASId", SqlDbType.Int) { Value = record.DASId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@AddOrRemove", SqlDbType.Bit) { Value = record.AddDAS }); cmd.Parameters.Add(new SqlParameter("@SamplesPerSecond", SqlDbType.Float) { Value = record.SamplesPerSecond }); cmd.Parameters.Add(new SqlParameter("@IsClockMaster", SqlDbType.Bit) { Value = record.IsClockMaster }); cmd.Parameters.Add(new SqlParameter("@AntiAliasFilterRate", SqlDbType.Float) { Value = record.AntiAliasFilterRate }); if (storedProcedureVersionToUse >= DTS.Common.Constants.PTP_DOMAIN_ID_DB_VERSION) { cmd.Parameters.Add(new SqlParameter("@PTPDomainId", SqlDbType.Int) { Value = (int)record.PTPDomainId }); } 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 && !DBNull.Value.Equals(errorNumber.Value)) { if (0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareInsert - Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareInsert - Error {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// retrieves all hardware meta data associated with test /// [sample rate, aaf, etc] /// /// user retrieving hardware /// connecting hardware is retrieved on /// id of test setup (use null for all) /// all matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupHardwareGet(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, int? testSetupId, out ITestSetupHardwareRecord[] records) { var storedProcedureVersionToUse = 0; records = null; SqlCommand cmd; var ret = PrepareForDbAccess(user, connection, clientDbVersion, "sp_TestSetupHardwareGet", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == testSetupId) { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = (int)testSetupId }); } var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new TestSetupHardwareRecord(reader, storedProcedureVersionToUse)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupHardwareGet - Error {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// inserts a new group/test setup association into db /// /// user making request /// connection request is being made on /// record to insert /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupGroupsInsert(IUserDbRecord user, IConnectionDetails connection, ITestSetupGroupRecord record) { if (null == record) { 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_TestSetupGroupsInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = record.GroupId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@DisplayOrder", SqlDbType.Int) { Value = record.DisplayOrder }); cmd.Parameters.Add(new SqlParameter("@Position", SqlDbType.VarChar, 1) { Value = record.Position }); cmd.Parameters.Add(new SqlParameter("@TestObjectType", SqlDbType.VarChar, 1) { Value = record.TestObjectType }); cmd.Parameters.Add(new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }); 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 && !DBNull.Value.Equals(errorNumber.Value)) { if (0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsGroupsInsert Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsGroupInsert Error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// updates a group/test setup association in db /// /// user making request /// connection is being made on /// updated record /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupGroupsUpdate(IUserDbRecord user, IConnectionDetails connection, ITestSetupGroupRecord record) { if (null == record) { 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_TestSetupGroupsUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = record.GroupId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@DisplayOrder", SqlDbType.Int) { Value = record.DisplayOrder }); cmd.Parameters.Add(new SqlParameter("@Position", SqlDbType.VarChar, 1) { Value = record.Position }); cmd.Parameters.Add(new SqlParameter("@TestObjectType", SqlDbType.VarChar, 1) { Value = record.TestObjectType }); 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 && !DBNull.Value.Equals(errorNumber.Value)) { if (0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsGroupsUpdate Error - {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsGroupInsert Error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// retrieves all group records matching search criteria /// /// user making request /// connection request is being made on /// database id of group (use null for all) /// database id of test setup (use null for all) /// test setup name for test setup (use null for all) /// matching groups /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupGroupsGet(IUserDbRecord user, IConnectionDetails connection, int? groupId, int? testSetupId, string testSetupName, out ITestSetupGroupRecord[] records ) { records = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupGroupsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == groupId) { cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@GroupId", SqlDbType.Int) { Value = (int)groupId }); } if (null == testSetupId) { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = (int)testSetupId }); } cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 255) { Value = testSetupName }); var reader = cmd.ExecuteReader(); var list = new List(); while (reader.Read()) { list.Add(new TestSetupGroupRecord(reader)); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsGroupsGet Error - {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// Commits a change to the IsDirty or IsComplete flags in the db for a test /// /// user committing change /// connection change is being committed on /// name of test setup to modify /// whether to set dirty flag or not. Dirty flag indicates /// whether the test setup has been checked for completeness and readiness to run /// whether the test setup is ready to run or not /// errors associated with test, if any /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupsMarkIsDirtyIsComplete(IUserDbRecord user, IConnectionDetails connection, string name, bool dirty, bool complete, string error) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupsIsCompleteUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 50) { Value = name }); cmd.Parameters.Add(new SqlParameter("@Dirty", SqlDbType.Bit) { Value = dirty }); cmd.Parameters.Add(new SqlParameter("@Complete", SqlDbType.Bit) { Value = complete }); cmd.Parameters.Add(new SqlParameter("@Error", SqlDbType.NVarChar, 255) { Value = error }); 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) { var msg = Convert.ToString(errorMessageParam.Value); LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsMarkIsDirtyIsComplete failed: {errorNumberParam.Value} - {msg}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsMarkIsDirtyIsComplete failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// deletes all test setups matching criteria /// /// user deleting test setups /// connection tests are being deleted on /// date of oldest allowed test setup /// 0 (ERROR_SUCCESS) on success. All other values are error codes. public ulong TestSetupsDeleteByDate(IUserDbRecord user, IConnectionDetails connection, DateTime date) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupsDeleteManyByDate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@DeleteDateBefore", SqlDbType.DateTime) { Value = date }); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); cmd.ExecuteNonQuery(); var errorNumber = int.Parse(errorNumberParam.Value.ToString()); if (errorNumber != 0) { var message = errorMessageParam.Value.ToString(); LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsDeleteByDate failed: {errorNumber} - {message}"); return ErrorCodes.ERROR_UNKNOWN; } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsDeleteByDate failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// deletes all test setups and groups /// /// user requesting deletes /// connection to delete on /// 0 (ERROR_SUCCESS) on success. All other values are error codes public ulong TestSetupsAndGroupsDeleteAll(IUserDbRecord user, IConnectionDetails connection) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupsAndGroupsDeleteAll"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; var errorMessageParam = new SqlParameter("@ErrorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); var errorSeverityParam = new SqlParameter("@ErrorSeverity", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorSeverityParam); var errorNumberParam = new SqlParameter("@ErrorState", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); cmd.ExecuteNonQuery(); if (DBNull.Value != errorNumberParam.Value) { var error = int.Parse(errorNumberParam.Value.ToString()); if (error != 0) { var message = int.Parse(errorNumberParam.Value.ToString()); var state = int.Parse(errorNumberParam.Value.ToString()); LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsAndGroupsDeleteAll failed: {error} - {state} - {message}"); return ErrorCodes.ERROR_UNKNOWN; } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"TestSetupsAndGroupsDeleteAll failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// Deletes all test setups that match the search criteria /// /// user deleting test setups /// connection to delete test setups on /// ids of test setups to delete /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong TestSetupsDeleteById(IUserDbRecord user, IConnectionDetails connection, int[] ids) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == ids || 0 == ids.Length) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupsDeleteManyById"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@TestSetupIdList", SqlDbType.NVarChar) { Value = string.Join(",", ids) }); 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)) { var error = int.Parse(errorNumber.Value.ToString()); if (error != 0) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsDeleteById failed: {error} - {errorMessage.Value}"); } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsDeleteById failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// deletes all test setups that match the search criteria /// /// user deleting test setups /// connection to delete test setups on /// names of test setups to delete /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong TestSetupsDeleteByName(IUserDbRecord user, IConnectionDetails connection, string[] names) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } if (null == names || 0 == names.Length) { return ErrorCodes.ERROR_MISSING_PARAMETER; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestSetupsDeleteManyByName"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@TestSetupNameList", SqlDbType.NVarChar) { Value = string.Join(",", names) }); 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)) { var error = int.Parse(errorNumber.Value.ToString()); if (error != 0) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsDeleteByName failed: {error} - {errorMessage.Value}"); } } return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsDeleteByName failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } private ulong PrepareForDbAccess(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, string storedProcedure, out int storedProcedureVersionToUse, out SqlCommand cmd) { storedProcedureVersionToUse = 0; cmd = null; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = DbAPI.GetStoredProcedureToUse(connection, storedProcedure, clientDbVersion, out storedProcedureVersionToUse); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } ret = ConnectionManager.GetSqlCommand(connection, out cmd, storedProcedureVersionToUse == 0 ? storedProcedure : $"{storedProcedure}_{storedProcedureVersionToUse}"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } return ret; } /// /// commits a test setup into the database /// /// user committing record /// connection record is being committed on /// the db version of the calling client /// record being committed /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong TestSetupsUpdateInsert(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, ref ITestSetupRecord record) { var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = PrepareForDbAccess(user, connection, clientDbVersion, "sp_TestSetupsUpdateInsert", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; #region params cmd.Parameters.Add( new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 50) { Value = record.Name }); cmd.Parameters.Add( new SqlParameter("@SetupDescription", SqlDbType.NVarChar, 50) { Value = record.Description ?? "" }); cmd.Parameters.Add( new SqlParameter("@AutomaticTestProgression", SqlDbType.Bit) { Value = record.AutomaticProgression }); cmd.Parameters.Add( new SqlParameter("@AutomaticProgressionDelayMS", SqlDbType.Int) { Value = record.AutomaticProgressionDelayMS }); cmd.Parameters.Add( new SqlParameter("@InvertTrigger", SqlDbType.Bit) { Value = record.InvertTriggerCompletion }); cmd.Parameters.Add( new SqlParameter("@InvertStart", SqlDbType.Bit) { Value = record.InvertStartRecordCompletion }); if (storedProcedureVersionToUse >= DTS.Common.Constants.IgnoreShorted_DB_VERSION) { //Since we're not calling the older version (91) that doesn't have these parameters, include them cmd.Parameters.Add(new SqlParameter("@IgnoreShortedStart", SqlDbType.Bit) { Value = record.IgnoreShortedStartCompletion }); cmd.Parameters.Add(new SqlParameter("@IgnoreShortedTrigger", SqlDbType.Bit) { Value = record.IgnoreShortedTriggerCompletion }); } cmd.Parameters.Add( new SqlParameter("@ViewDiagnostics", SqlDbType.Bit) { Value = record.ViewDiagnostics }); cmd.Parameters.Add( new SqlParameter("@VerifyChannels", SqlDbType.Bit) { Value = record.VerifyChannels }); cmd.Parameters.Add( new SqlParameter("@AutoVerifyChannels", SqlDbType.Bit) { Value = record.AutoVerifyChannels }); cmd.Parameters.Add(new SqlParameter("@VerifyChannelsDelayMS", SqlDbType.Int) { Value = Convert.ToInt32(record.AutoVerifyDelaySeconds * 1000) }); cmd.Parameters.Add( new SqlParameter("@RecordingMode", SqlDbType.SmallInt) { Value = record.RecordingMode }); cmd.Parameters.Add( new SqlParameter("@SamplesPerSecond", SqlDbType.Float) { Value = record.SamplesPerSecondAggregate }); cmd.Parameters.Add( new SqlParameter("@PreTriggerSeconds", SqlDbType.Float) { Value = record.PreTriggerSeconds }); cmd.Parameters.Add( new SqlParameter("@PostTriggerSeconds", SqlDbType.Float) { Value = record.PostTriggerSeconds }); cmd.Parameters.Add( new SqlParameter("@NumberOfEvents", SqlDbType.Int) { Value = record.NumberOfEvents }); cmd.Parameters.Add( new SqlParameter("@StrictDiagnostics", SqlDbType.Bit) { Value = record.StrictDiagnostics ? 255 : 0 }); cmd.Parameters.Add( new SqlParameter("@RequireConfirmationOnErrors", SqlDbType.Bit) { Value = record.RequireUserConfirmationOnErrors }); cmd.Parameters.Add( new SqlParameter("@ROIDownload", SqlDbType.Bit) { Value = record.DoROIDownload }); cmd.Parameters.Add( new SqlParameter("@ViewROIDownload", SqlDbType.Bit) { Value = record.ViewROIDownload }); cmd.Parameters.Add(new SqlParameter("@DownloadAll", SqlDbType.Bit) { Value = record.DownloadAll }); cmd.Parameters.Add( new SqlParameter("@ViewRealtime", SqlDbType.Bit) { Value = record.ViewRealtime }); cmd.Parameters.Add( new SqlParameter("@RealtimePlotCount", SqlDbType.SmallInt) { Value = record.DefaultNumberRealtimeGraphs }); if (storedProcedureVersionToUse < DTS.Common.Constants.ROITables_DB_VERSION) { //Since we're calling the older version (91) that has this parameter, include it cmd.Parameters.Add(new SqlParameter("@RegionsOfInterest", SqlDbType.NVarChar, -1) { Value = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize( record.RegionsOfInterest) }); } cmd.Parameters.Add(new SqlParameter("@ROIStart", SqlDbType.Float) { Value = record.ROIStart }); cmd.Parameters.Add(new SqlParameter("@ROIEnd", SqlDbType.Float) { Value = record.ROIEnd }); cmd.Parameters.Add( new SqlParameter("@ViewDownloadAll", SqlDbType.Bit) { Value = record.ViewDownloadAll }); cmd.Parameters.Add(new SqlParameter("@Export", SqlDbType.Bit) { Value = record.ViewExport }); cmd.Parameters.Add( new SqlParameter("@ExportFormat", SqlDbType.BigInt) { Value = Convert.ToUInt64(record.ExportFormats) }); cmd.Parameters.Add(new SqlParameter("@LabDetails", SqlDbType.NVarChar, 50) { Value = record.LabDetails ?? "" }); cmd.Parameters.Add( new SqlParameter("@UseLabDetails", SqlDbType.Bit) { Value = record.UseLabratoryDetails }); cmd.Parameters.Add(new SqlParameter("@CustomerDetails", SqlDbType.NVarChar, 50) { Value = record.CustomerDetails ?? "" }); cmd.Parameters.Add( new SqlParameter("@UseCustomerDetails", SqlDbType.Bit) { Value = record.UseCustomerDetails }); cmd.Parameters.Add(new SqlParameter("@ExtraProperties", SqlDbType.NVarChar, -1) { Value = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize( record.ExtraProperties.ToArray()) }); cmd.Parameters.Add(new SqlParameter("@AllowMissingSensors", SqlDbType.Bit) { Value = record.AllowMissingSensors }); cmd.Parameters.Add(new SqlParameter("@AllowSensorIdToBlankChannel", SqlDbType.Bit) { Value = record.AllowSensorIdToBlankChannel }); cmd.Parameters.Add(new SqlParameter("@CalibrationBehavior", SqlDbType.SmallInt) { Value = (int)record.CalibrationBehavior }); cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = record.LocalOnly }); cmd.Parameters.Add(new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = record.LastModified }); cmd.Parameters.Add(new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 50) { Value = record.LastModifiedBy }); cmd.Parameters.Add(new SqlParameter("@TurnOffExcitation", SqlDbType.Bit) { Value = record.TurnOffExcitation }); cmd.Parameters.Add(new SqlParameter("@TriggerCheckRealtime", SqlDbType.Bit) { Value = record.TriggerCheckRealtime }); cmd.Parameters.Add(new SqlParameter("@TriggerCheckStep", SqlDbType.Bit) { Value = record.TriggerCheckStep }); cmd.Parameters.Add(new SqlParameter("@PostTestDiagnostics", SqlDbType.Int) { Value = record.PostTestDiagnosticsLevel }); cmd.Parameters.Add(new SqlParameter("@MeasureSquibResistancesStep", SqlDbType.Bit) { Value = record.MeasureSquibResistancesStep }); cmd.Parameters.Add(new SqlParameter("@ExportFolder", SqlDbType.NVarChar, 150) { Value = "" }); cmd.Parameters.Add( new SqlParameter("@DownloadFolder", SqlDbType.NVarChar, 150) { Value = "" }); cmd.Parameters.Add( new SqlParameter("@CommonStatusLine", SqlDbType.Bit) { Value = record.CommonStatusLine }); cmd.Parameters.Add( new SqlParameter("@SameAsDownloadFolder", SqlDbType.Bit) { Value = record.SameAsDownloadFolder }); cmd.Parameters.Add(new SqlParameter("@UploadData", SqlDbType.Bit) { Value = record.UploadData }); cmd.Parameters.Add( new SqlParameter("@UploadDataFolder", SqlDbType.NVarChar, 150) { Value = record.UploadFolder ?? "" }); cmd.Parameters.Add( new SqlParameter("@UploadExportsOnly", SqlDbType.Bit) { Value = record.UploadExportsOnly }); cmd.Parameters.Add( new SqlParameter("@Settings", SqlDbType.NVarChar, 4000) { Value = record.Settings ?? "" }); cmd.Parameters.Add( new SqlParameter("@WarnOnBatteryFail", SqlDbType.Bit) { Value = record.WarnOnFailedBattery }); cmd.Parameters.Add(new SqlParameter("@Dirty", SqlDbType.Bit) { Value = record.Dirty }); cmd.Parameters.Add(new SqlParameter("@Complete", SqlDbType.Bit) { Value = record.IsComplete }); cmd.Parameters.Add( new SqlParameter("@Error", SqlDbType.NVarChar, 255) { Value = record.ErrorMessage }); cmd.Parameters.Add(new SqlParameter("@TestEngineerDetails", SqlDbType.NVarChar, 50) { Value = record.TestEngineerDetails ?? "" }); cmd.Parameters.Add( new SqlParameter("@UseTestEngineerDetails", SqlDbType.Bit) { Value = record.UseTestEngineerDetails }); cmd.Parameters.Add( new SqlParameter("@UserTags", SqlDbType.VarBinary) { Value = record.TagsBlobBytes }); cmd.Parameters.Add(new SqlParameter("@DoAutoArm", SqlDbType.Bit) { Value = record.DoAutoArm }); cmd.Parameters.Add(new SqlParameter("@DoStreaming", SqlDbType.Bit) { Value = record.DoStreaming }); if (DTS.Common.Constants.OnePPSOutProfiles.Contains(record.ClockSyncProfileMaster) && storedProcedureVersionToUse < DTS.Common.Constants.ONEPPS_OUT_DB_VERSION) { record.ClockSyncProfileMaster = DTS.Common.ClockSyncProfile.None; } cmd.Parameters.Add(new SqlParameter("@ClockSyncProfileMaster", SqlDbType.NVarChar, 50) { Value = record.ClockSyncProfileMaster.ToString() }); if (DTS.Common.Constants.OnePPSOutProfiles.Contains(record.ClockSyncProfileSlave) && storedProcedureVersionToUse < DTS.Common.Constants.ONEPPS_OUT_DB_VERSION) { record.ClockSyncProfileSlave = DTS.Common.ClockSyncProfile.None; } cmd.Parameters.Add(new SqlParameter("@ClockSyncProfileSlave", SqlDbType.NVarChar, 50) { Value = record.ClockSyncProfileSlave.ToString() }); cmd.Parameters.Add( new SqlParameter("@CheckoutMode", SqlDbType.Bit) { Value = record.CheckoutMode }); cmd.Parameters.Add( new SqlParameter("@ISFFile", SqlDbType.NVarChar, 4000) { Value = record.ISFFile ?? "" }); cmd.Parameters.Add( new SqlParameter("@QuitTestWithoutWarning", SqlDbType.Bit) { Value = record.QuitTestWithoutWarning }); cmd.Parameters.Add( new SqlParameter("@NotAllChannelsRealTime", SqlDbType.Bit) { Value = record.NotAllChannelsRealTime }); cmd.Parameters.Add( new SqlParameter("@NotAllChannelsViewer", SqlDbType.Bit) { Value = record.NotAllChannelsViewer }); cmd.Parameters.Add( new SqlParameter("@SuppressMissingSensorsWarning", SqlDbType.Bit) { Value = record.SuppressMissingSensorsWarning }); //If we got here without either maintaining or generating a new TestSetupUniqueId, generate one here if (record.TestSetupUniqueId == null) { record.TestSetupUniqueId = Guid.NewGuid().ToString(); } cmd.Parameters.Add(new SqlParameter("@TestSetupUniqueId", SqlDbType.NVarChar, 4000) { Value = record.TestSetupUniqueId }); cmd.Parameters.Add( new SqlParameter("@TestSetup", SqlDbType.VarBinary) { Value = new byte[0] }); cmd.Parameters.Add(new SqlParameter("@WakeupAndTriggerOn", SqlDbType.Bit) { Value = record.WakeUpAndArmTriggerOn }); cmd.Parameters.Add(new SqlParameter("@WakeupTrigger", SqlDbType.SmallInt) { Value = (int)record.WakeUpTrigger }); cmd.Parameters.Add(new SqlParameter("@WakeUpMotionTimeout", SqlDbType.Int) { Value = record.WakeUpMotionTimeout }); cmd.Parameters.Add(new SqlParameter("@TimedIntervalFrequency", SqlDbType.Int) { Value = Convert.ToInt32(record.IntervalBetweenEventStartsMinutes) }); if (DateTime.MinValue.Equals(record.RTCScheduleStartDateTime)) { cmd.Parameters.Add(new SqlParameter("@RTCScheduleStartDateTime", SqlDbType.DateTime) { Value = DBNull.Value }); } else { cmd.Parameters.Add(new SqlParameter("@RTCScheduleStartDateTime", SqlDbType.DateTime) { Value = record.RTCScheduleStartDateTime }); } cmd.Parameters.Add(new SqlParameter("@RTCScheduleDuration", SqlDbType.BigInt) { Value = record.RTCScheduleDuration.Ticks }); cmd.Parameters.Add(new SqlParameter("@StartWithEvent", SqlDbType.Bit) { Value = record.StartWithEvent }); if (storedProcedureVersionToUse >= DTS.Common.Constants.EnableRepeat_DB_VERSION) { //Since we're not calling the older version (91) that doesn't have this parameter, include it cmd.Parameters.Add(new SqlParameter("@RepeatAutoArmOrStreaming", SqlDbType.Bit) { Value = record.DoEnableRepeat }); } if (storedProcedureVersionToUse >= DTS.Common.Constants.ALIGNUDPTOPPS_DB_VERSION) { cmd.Parameters.Add(new SqlParameter("@AlignUDPToPPS", SqlDbType.Bit) { Value = record.AlignUDPToPPS }); } 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); #endregion params cmd.ExecuteNonQuery(); if (int.Parse(errorNumberParam.Value.ToString()) != 0) { throw new Exception((string)errorMessageParam.Value); } record.Id = int.Parse(newIdParam.Value.ToString()); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsUpdateInsert failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } /// /// Retrieves all test setups which match given search criteria /// /// user making query /// connection over which query is to be made /// the db version of the calling client /// database id of test setup (can be null) /// name of test setup (can be null or empty) /// ROI end period (used to populate older test setups that /// are missing explicit ROI start/end periods for multiple events) /// ROI start period (used to populate older test setups /// that are missing explicit ROI start/end periods for multiple events) /// whether or not to ignore a shorted start /// since we may be using a Version 91 database that doesn't store this /// whether or not to ignore a shorted trigger /// since we may be using a Version 91 database that doesn't store this /// matching records /// any errors encountered while retrieving test setups /// 0 (ERROR_SUCCESS) on success, all other values are errors public ulong TestSetupsGet(IUserDbRecord user, IConnectionDetails connection, int clientDbVersion, int? testSetupId, string testSetupName, double defaultROIStart, double defaultROIEnd, bool defaultIgnoreShortedStart, bool defaultIgnoreShortedTrigger, out ITestSetupRecord[] records, out string[] errors) { errors = new string[0]; records = new ITestSetupRecord[0]; var storedProcedureVersionToUse = 0; SqlCommand cmd; var ret = PrepareForDbAccess(user, connection, clientDbVersion, "sp_TestSetupsGet", out storedProcedureVersionToUse, out cmd); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == testSetupId) { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = (int)testSetupId }); } cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 50) { Value = testSetupName }); var reader = cmd.ExecuteReader(); var list = new List(); var lErrors = new List(); while (reader.Read()) { try { list.Add(new TestSetupRecord(reader, defaultROIStart, defaultROIEnd, defaultIgnoreShortedStart, defaultIgnoreShortedTrigger, storedProcedureVersionToUse, out var recordErrors)); if (null != recordErrors && recordErrors.Any()) { lErrors.AddRange(recordErrors); errors = lErrors.ToArray(); } } catch (Exception ex) { lErrors.Add($"{DTS.Common.Strings.Strings.FailedToReadTestSetup} - {ex.Message}"); errors = lErrors.ToArray(); } } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.TestSetups, $"sp_TestSetupsGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); cmd.Dispose(); } } } }