using DbAPI.Connections; using DbAPI.Errors; using DbAPI.Logging; using DTS.Common.Classes.TestSetups; using DTS.Common.Interface.Database; using DTS.Common.Interface.Graphs; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; namespace DbAPI.TestSetups { /// /// Handles graph functions /// /// internal class Graphs : IGraphs { /// /// removes a record from the db /// /// user removing record /// connection record is being removed on /// database id of record being removed /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GraphsDelete(IUserDbRecord user, IConnectionDetails connection, int graphId) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestGraphsDelete"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = null }); cmd.Parameters.Add(new SqlParameter("@GraphId", SqlDbType.Int) { Value = graphId }); 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 && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsDelete error: {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsInsert exception {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } /// /// inserts a record into the db, updates GraphId of record after insert with database id /// /// user inserting record /// connection record is being inserted on /// record being inserted /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GraphsInsert(IUserDbRecord user, IConnectionDetails connection, ref IGraphRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestGraphsInsert"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } if (null == record) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsUpdate no record supplied to update"); cmd.Connection.Dispose(); return ErrorCodes.ERROR_MISSING_PARAMETER; } try { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@GraphName", SqlDbType.NVarChar, 50) { Value = record.GraphName }); cmd.Parameters.Add(new SqlParameter("@GraphDescription", SqlDbType.NVarChar, 50) { Value = record.GraphDescription }); cmd.Parameters.Add(new SqlParameter("@Channels", SqlDbType.NVarChar, 2048) { Value = record.ChannelsString }); cmd.Parameters.Add(new SqlParameter("@UseDomainMin", SqlDbType.Bit) { Value = record.UseDomainMin }); cmd.Parameters.Add(new SqlParameter("@DomainMin", SqlDbType.Float) { Value = record.DomainMin }); cmd.Parameters.Add(new SqlParameter("@UseDomainMax", SqlDbType.Bit) { Value = record.UseDomainMax }); cmd.Parameters.Add(new SqlParameter("@DomainMax", SqlDbType.Float) { Value = record.DomainMax }); cmd.Parameters.Add(new SqlParameter("@UseRangeMin", SqlDbType.Bit) { Value = record.UseRangeMin }); cmd.Parameters.Add(new SqlParameter("@RangeMin", SqlDbType.Float) { Value = record.RangeMin }); cmd.Parameters.Add(new SqlParameter("@UseRangeMax", SqlDbType.Bit) { Value = record.UseRangeMax }); cmd.Parameters.Add(new SqlParameter("@RangeMax", SqlDbType.Float) { Value = record.RangeMax }); cmd.Parameters.Add( new SqlParameter("@Thresholds", SqlDbType.NVarChar, 2048) { Value = record.ThresholdsString }); cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = record.LocalOnly }); var newId = new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(newId); 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 && 0 != Convert.ToInt32(errorNumber.Value)) { throw new Exception((string)errorMessage.Value); } record.GraphId = Convert.ToInt32(newId.Value); } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsInsert exception {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } /// /// updates a record in the database /// /// user updating record /// connection record is being updated on /// record to update /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GraphsUpdate(IUserDbRecord user, IConnectionDetails connection, IGraphRecord record) { if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestGraphsUpdate"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { if (null == record) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsUpdate no record supplied to update"); return ErrorCodes.ERROR_MISSING_PARAMETER; } cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@GraphId", SqlDbType.Int) { Value = record.GraphId }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = record.TestSetupId }); cmd.Parameters.Add(new SqlParameter("@GraphName", SqlDbType.NVarChar, 50) { Value = record.GraphName }); cmd.Parameters.Add(new SqlParameter("@GraphDescription", SqlDbType.NVarChar, 50) { Value = record.GraphDescription }); cmd.Parameters.Add(new SqlParameter("@Channels", SqlDbType.NVarChar, 2048) { Value = record.ChannelsString }); cmd.Parameters.Add(new SqlParameter("@UseDomainMin", SqlDbType.Bit) { Value = record.UseDomainMin }); cmd.Parameters.Add(new SqlParameter("@DomainMin", SqlDbType.Float) { Value = record.DomainMin }); cmd.Parameters.Add(new SqlParameter("@UseDomainMax", SqlDbType.Bit) { Value = record.UseDomainMax }); cmd.Parameters.Add(new SqlParameter("@DomainMax", SqlDbType.Float) { Value = record.DomainMax }); cmd.Parameters.Add(new SqlParameter("@UseRangeMin", SqlDbType.Bit) { Value = record.UseRangeMin }); cmd.Parameters.Add(new SqlParameter("@RangeMin", SqlDbType.Float) { Value = record.RangeMin }); cmd.Parameters.Add(new SqlParameter("@UseRangeMax", SqlDbType.Bit) { Value = record.UseRangeMax }); cmd.Parameters.Add(new SqlParameter("@RangeMax", SqlDbType.Float) { Value = record.RangeMax }); cmd.Parameters.Add( new SqlParameter("@Thresholds", SqlDbType.NVarChar, 2048) { Value = record.ThresholdsString }); cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = record.LocalOnly }); 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 && 0 != Convert.ToInt32(errorNumber.Value)) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsUpdate exception {errorNumber.Value} - {errorMessage.Value}"); return ErrorCodes.ERROR_UNKNOWN; } } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"GraphsUpdate exception {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } return ErrorCodes.ERROR_SUCCESS; } /// /// retrieves all graph records matching search criteria /// /// user making query /// connection query is being made on /// graph to query for (can be null) /// test setup graph belongs to /// all matching records found /// 0 (ERROR_SUCCESS) on success, all other values are error codes public ulong GraphsGet(IUserDbRecord user, IConnectionDetails connection, int? graphId, int? testSetupId, out IGraphRecord[] records) { records = new IGraphRecord[0]; if (!DbAPI.Connections.IsUserLoggedIn(user, connection)) { return ErrorCodes.ERROR_ACCESS_DENIED; } var ret = ConnectionManager.GetSqlCommand(connection, out var cmd, "sp_TestGraphsGet"); if (ret != ErrorCodes.ERROR_SUCCESS) { return ret; } try { cmd.CommandType = CommandType.StoredProcedure; if (null == graphId) { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = null }); } else { cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = (int)graphId }); } 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()) { var graph = new GraphRecord(reader); list.Add(graph); } records = list.ToArray(); return ErrorCodes.ERROR_SUCCESS; } catch (Exception ex) { LogManager.Log(TraceEventType.Error, LogManager.LogEvents.Graphs, $"sp_GraphsGet failed: {ex.Message}"); return ErrorCodes.ERROR_UNKNOWN; } finally { cmd.Connection.Dispose(); } } } }