using System; using System.Collections.Generic; using System.Data; using System.Text; using DTS.Common.Utilities.Logging; using System.Threading; using System.Linq; // ReSharper disable ConditionIsAlwaysTrueOrFalse using System.Data.SqlClient; using DTS.Common.Interface.Channels; using DTS.Common.Interface.Groups; using DTS.Common.Classes.Groups.ChannelSettings; using Prism.Ioc; using DTS.Common.Events; using System.IO.Compression; using System.IO; using DTS.Common.Interface.Database; using DTS.Common.Interface.DataRecorders; using DTS.Common.Interface.Sensors; using DTS.Common.Interface.Graphs; using DTS.Common.Interface.TestSetups; using DTS.Common.Interface.TestSetups.TestSetupsList; using DTS.Common.Interface.Tags; using DTS.Common.Interface.TestMetaData; using DTS.Common.Classes.CustomerDetails; using DTS.Common.Classes.LabratoryDetails; using DTS.Common.Classes.TestEngineerDetails; using DTS.Common.Interface.Channels.ChannelCodes; using DTS.Common.Enums.Channels; using DTS.Common.Classes.Groups; using DTS.Common.Classes; using DTS.Common.Interface.RegionOfInterest; using DTS.Common.Interface.Sensors.AnalogDiagnostics; using Prism.Events; using DbAPI.Errors; namespace DTS.Common.Storage { public partial class DbOperations { public static void LogDBCaching(string message) { DbAPI.DbAPI.LogDBCaching(message); } /// /// returns the client db version (software/code version) /// public static int GetClientDbVersion() { var connection = DbAPI.DbAPI.Connections.GetActiveConnections().FirstOrDefault(); if (null == connection) { return MINIMUM_LTS_DB_VERSION; } return connection.ClientDbVersion; } /// /// returns the version of the connected database (caches value) /// public static int GetSQLVersion() { var sqlVersion = 0; var connection = DbAPI.DbAPI.Connections.GetActiveConnections().FirstOrDefault(); if (connection != null) { sqlVersion = DbAPI.DbAPI.Database.GetSQLVersion(connection); } return sqlVersion; } /// /// returns the version of the connected database (caches value) /// public static int GetConnectionDbVersion() { var connection = DbAPI.DbAPI.Connections.GetActiveConnections().FirstOrDefault(); if (null == connection) { return MINIMUM_LTS_DB_VERSION; } if (0 == connection.ConnectionDbVersion) { var user = CurrentUserDbRecord; _ = DbAPI.DbAPI.Database.GetDatabaseVersion(user, connection, out var iVersion); connection.ConnectionDbVersion = iVersion; } return 0 >= connection.ConnectionDbVersion ? MINIMUM_LTS_DB_VERSION : connection.ConnectionDbVersion; } public static ulong GetStoredProcedureToUse(string storedProcedure, out int storedProcedureVersionToUse) { var connection = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var ret = DbAPI.DbAPI.GetStoredProcedureToUse(connection, storedProcedure, CURRENT_DB_VERSION, out storedProcedureVersionToUse); return ret; } /// /// returns all EID (or squib article id) entries in the database /// public static HashSet GetAllExistingSensorIds() { var hash = new HashSet(); try { using (var cmd = GetSQLCommand(true)) { try { cmd.CommandText = "SELECT eId FROM [SensorsAnalog]"; var reader = cmd.ExecuteReader(); while (reader.Read()) { var eid = Utility.GetString(reader, "eId"); if (string.IsNullOrWhiteSpace(eid)) { continue; } hash.Add(eid); } reader.Close(); cmd.CommandText = "SELECT ArticleId FROM [SensorsSquib]"; reader = cmd.ExecuteReader(); while (reader.Read()) { var articleId = Utility.GetString(reader, "ArticleId"); if (string.IsNullOrWhiteSpace(articleId)) { continue; } hash.Add(articleId); } } finally { cmd.Connection.Dispose(); } } } catch (Exception ex) { APILogger.Log(ex); } return hash; } public static ulong SensorsAnalogRunsGet(long? Id, int? testId, string testName, out IDiagnosticRun[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogDiagnosticRunGet(user, con, Id, testId, testName, out records); } public static ulong SensorsAnalogDiagnosticsGet(long? Id, long? diagnosticRunId, int? sensorId, string sensorSerialNumber, out IDiagnosticEntry[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogDiagnosticsGet(user, con, Id, diagnosticRunId, sensorId, sensorSerialNumber, out records); } public static ulong SensorsAnalogDiagnosticRunUpdateInsert( IDiagnosticRun run) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogDiagnosticRunUpdateInsert(user, con, ref run); } public static ulong SensorsAnalogDiagnosticUpdateInsert( IDiagnosticEntry entry) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogDiagnosticUpdateInsert(user, con, ref entry); } public static ulong SensorsStreamOutputUpdateInsert( ref IStreamOutputRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsOutputStreamUpdateInsert(user, con, ref record); } public static ulong SensorsStreamOutputGet( int? Id, string SerialNumber, out IStreamOutputRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsOutputStreamGet(user, con, Id, SerialNumber, out records); } public static ulong SensorsStreamInputUpdateInsert( ref IStreamInputRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsInputStreamUpdateInsert(user, con, ref record); } public static ulong SensorsStreamInputGet( int? Id, string SerialNumber, out IStreamInputRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsInputStreamGet(user, con, Id, SerialNumber, out records); } public static ulong SensorsThermocouplerGet( int? Id, string SerialNumber, out IThermocouplerRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; if (con.ConnectionDbVersion < Constants.SLICE_TC_DB_VERSION) { //The database doesn't have this Stored Procedure so don't try to call it. records = null; return ErrorCodes.ERROR_UNKNOWN; } var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsThermocouplerGet(user, con, CURRENT_DB_VERSION, Id, SerialNumber, out records); } public static ulong SensorsUARTUpdateInsert(ref IUARTRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsUARTUpdateInsert(user, con, ref record); } public static ulong SensorsUARTGet( int? Id, string SerialNumber, out IUARTRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsUARTGet(user, con, Id, SerialNumber, out records); } public static ulong SensorsCANGet( int? Id, string SerialNumber, out ICANRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsCanGet(user, con, Id, SerialNumber, out records); } public static ulong SensorsCanUpdateInsert(ref ICANRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsCanUpdateInsert(user, con, ref record); } /// /// deletes matching test setup hardware records /// Either Id, dasId, or testSetupId must be specified /// /// test setup harware id (use null for all) /// das database id (use null for all) /// test setup database id (use null for all) /// 0 on success, all other values are error codes public static ulong TestSetupHardwareDelete( int? Id, int? dasId, int? testSetupId ) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupHardwareDelete(user, con, Id, dasId, testSetupId); } /// /// updates a test setup hardware record /// /// record to update /// 0 on success, all other values are error codes public static ulong TestSetupHardwareUpdate(ITestSetupHardwareRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupHardwareUpdate(user, con, record); } /// /// inserts a new test setup hardware record /// /// record to insert /// 0 on success, all other values are error codes public static ulong TestSetupHardwareInsert(ITestSetupHardwareRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupHardwareInsert(user, con, record); } /// /// retrieves hardware links for test setup /// /// test setup id (use null for all) /// all matching records /// 0 on success, all other values are error codes public static ulong TestSetupHardwareGet(int? testSetupId, out ITestSetupHardwareRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupHardwareGet(user, con, con.ClientDbVersion, testSetupId, out records); } /// /// inserts a new group record into test setup /// /// record to insert /// 0 on success, all other values are error codes public static ulong TestSetupGroupsInsert(ITestSetupGroupRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupGroupsInsert(user, con, record); } /// /// Updates a group record for test setup /// /// record to update /// 0 on success, all other values are error codes public static ulong TestSetupGroupsUpdate(ITestSetupGroupRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupGroupsUpdate(user, con, record); } /// /// returns all matching records to search criteria /// /// matching group ids (use null for all) /// matching test setup id (use null for all) /// matching test setup name (use null for all) /// matching records /// 0 on success, all other values are error codes public static ulong TestSetupGroupsGet(int? groupId, int? testSetupId, string testSetupName, out ITestSetupGroupRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupGroupsGet(user, con, groupId, testSetupId, testSetupName, out records); } /// /// Inserts a new channel code into the database /// /// lookup of string channel code type to short /// channel code to insert /// 0 on success, all other values are error codes public static ulong ChannelCodesInsert(IReadOnlyDictionary lookup, IChannelCode channelCode, out int id) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelCodesInsert(user, con, lookup, channelCode, out id); } /// /// Updates a channel code database record /// /// lookup of string channel code type to short /// channel code to update /// 0 on success, all other values are error codes public static ulong ChannelCodesUpdate(IReadOnlyDictionary lookup, IChannelCode channelCode) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelCodesUpdate(user, con, lookup, channelCode); } /// /// deletes matching channel codes /// /// user making deletes /// connection to delete on /// id of channel code /// code of matching channel codes (can be null) /// name of matching channel codes (can be null) /// code type of matching channel codes (can be null) /// 0 (ERROR_SUCCESS) on success, all other values are error codes public static ulong ChannelCodesDelete( int? id, string code, string name, int? codeType) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelCodesDelete(user, con, id, code, name, codeType); } /// /// retrieves all matching channel code types /// /// id, use null for all /// code type, use null for all /// matching records /// 0 on success, all other values are error codes public static ulong ChannelCodeTypesGet( short? id, string codeType, out Tuple[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelCodeTypesGet(user, con, id, codeType, out records); } /// /// retrieves all matching channel codes /// /// /// /// /// /// /// /// 0 on success, all other values are error codes public static ulong ChannelCodesGet( int? Id, string code, string name, ChannelEnumsAndConstants.ChannelCodeType? codeType, IReadOnlyDictionary channelTypeLookup, out IChannelCode[] records ) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelCodesGet(user, con, Id, code, name, codeType, channelTypeLookup, out records); } /// /// inserts a tag assignment into the database /// /// assignment to insert /// 0 on success, all other values are error codes public static ulong TagAssignmentsInsert(ITagAssignment tagAssignment) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagAssignmentsInsert(user, con, tagAssignment); } /// /// deletes all tag assignments which match search criteria /// /// object type tag is assigned to /// object id of object tags are assigned to /// 0 on success, all other values are error codes public static ulong TagAssignmentsDelete(TagTypes objectType, int objectId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagAssignmentsDelete(user, con, objectId, objectType); } /// /// retrieves all tag assignments which match search criteria /// /// tag type for which to retrieve assignments (use null for all) /// matching records /// 0 on success, all other values are error codes public static ulong TagAssignmentsGet(TagTypes? tagType, out ITagAssignment[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagAssignmentsGet(user, con, tagType, out records); } /// /// inserts a tag into the database /// modifies tag by updating id after insert /// /// tag to be inserted /// 0 on success, all other values are error codes public static ulong TagsInsert(ref ITag tag) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagsInsert(user, con, ref tag); } /// /// retrieves a tag id associated with a tag text /// /// text to search for /// id (or null if not found) /// 0 on success, all other values are error codes public static ulong TagsGetId(string text, out int? id) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagsGetId(user, con, text, out id); } /// /// deletes requested tag /// /// database id of tag to delete /// 0 on success, all other values are error codes public static ulong TagsDelete(int tagId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagsDelete(user, con, tagId); } /// /// returns all tags matching given search criteria /// /// tag id to search for (use null for all) /// all matching records /// 0 on success, all other values are errors public static ulong TagsGet(int? tagId, out ITag[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Tags.TagsGet(user, con, tagId, out records); } /// /// updates channel setting /// /// setting id to update /// new default value for setting /// 0 on success, all other values are error codes public static ulong ChannelSettingsUpdate(int settingId, string defaultValue) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelSettingsUpdate(user, con, settingId, defaultValue); } /// /// retrieves all channel settings matching search criteria /// /// channel id to search for (allows NULL) /// setting name to search for (allows null/empty) /// matching records /// 0 on success, all other values are error codes public static ulong ChannelSettingsGet(int? settingId, string settingName, out IChannelSettingRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelSettingsGet(user, con, settingId, settingName, out records); } /// /// deletes channel setting(s) from db associated with channel /// /// channel settings are associated /// setting to delete (use null to delete all) /// 0 on success, all other values are error codes public static ulong GroupChannelSettingsDelete(long channelId, int? settingId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.GroupChannelSettingsDelete(user, con, channelId, settingId); } /// /// inserts a group channel setting into the db /// /// channel setting is associated with /// setting to insert /// 0 on success, all other values are error codes public static ulong GroupChannelSettingsInsert(long channelid, IGroupChannelSettingRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.GroupChannelSettingsInsert(user, con, CURRENT_DB_VERSION, channelid, record); } /// /// returns all channel settings matching input channel id /// /// channel id to query for /// all matching channel settings /// any errors encountered while retrieving group channel settings /// 0 on success, all other values are error codes public static ulong GroupChannelSettingsGet(List channelIdList, out IGroupChannelSettingRecord[] records, out string[] errors) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.GroupChannelSettingsGet(user, con, CURRENT_DB_VERSION, channelIdList, out records, out errors); } /// /// marks a test setup as dirty or complete in the db /// a test setup is dirty if readiness to run or completeness has not been calculated yet or not /// /// name of test setup to mark /// whether the test setup has completeness and readiness has been calculated yet or not /// whether the test setup is complete and ready to run /// any errors or warnings associated with test setup /// 0 on success, all other values are error codes public static ulong TestSetupsMarkIsCompleteIsDirty(string name, bool dirty, bool complete, string error) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsMarkIsDirtyIsComplete(user, con, name, dirty, complete, error); } public static ulong TestSetupsDeleteByDate(DateTime date) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsDeleteByDate(user, con, date); } /// /// deletes all test setups and groups /// /// 0 on success, all other values are error codes public static ulong TestSetupsAndGroupsDeleteAll() { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsAndGroupsDeleteAll(user, con); } /// /// deletes test setups matching criteria /// /// ids of test setups that should be deleted /// 0 on success, all other values are error codes public static ulong TestSetupsDeleteById(int[] ids) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsDeleteById(user, con, ids); } /// /// deletes test setups matching criteria /// /// names of test setups that should be deleted /// 0 on success, all other values are error codes public static ulong TestSetupsDeleteByName(string[] names) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsDeleteByName(user, con, names); } /// /// updates or inserts a test setup record into the database /// test setup is modified with database id if an insert is completed /// /// record to update or insert /// 0 on success, all other values are error codes public static ulong TestSetupsUpdateInsert(ref ITestSetupRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsUpdateInsert(user, con, CURRENT_DB_VERSION, ref record); } /// /// returns all test setup records matching search criteria /// /// database id of test setup (can be null) /// test setup name (can be empty or null) /// default ROI start time (used for old test setups which may not have ROI start/stop specified for all events) /// default ROI end time (used for old test setups which may not have ROI start/stop specified for all events) /// all matching records /// 0 on success, all other values are error codes public static ulong TestSetupsGet(int? testSetupId, string testSetupName, double defaultROIStart, double defaultROIEnd, bool defaultIgnoreShortedStart, bool defaultIgnoreShortedTrigger, out ITestSetupRecord[] records, out string[] errors) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestSetups.TestSetupsGet(user, con, CURRENT_DB_VERSION, testSetupId, testSetupName, defaultROIStart, defaultROIEnd, defaultIgnoreShortedStart, defaultIgnoreShortedTrigger, out records, out errors); } /// /// deletes a calculated channel record from db /// /// /// 0 on success, all other values are error codes public static ulong CalculatedChannelsDelete(int calculatedChannelId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CalculatedChannels.CalculatedChannelsDelete(user, con, calculatedChannelId); } /// /// inserts a calculated channel record into the db /// /// record to insert /// 0 on success, all other values are error codes public static ulong CalculatedChannelsInsert(ICalculatedChannelRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CalculatedChannels.CalculatedChannelsInsert(user, con, ref record); } /// /// updates a calculated channel record in the db /// /// record to update /// 0 on success, all other values are error codes public static ulong CalculatedChannelsUpdate(ICalculatedChannelRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CalculatedChannels.CalculatedChannelsUpdate(user, con, record); } /// /// retrieves all calculated channels matching search criteria /// /// database id of calculated channel (can be null) /// test setup calculated channels belong to /// all matching records /// 0 on success, all other values are error codes public static ulong CalculatedChannelsGet(int? ccId, string testSetupName, out ICalculatedChannelRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CalculatedChannels.CalculatedChannelsGet(user, con, ccId, testSetupName, out records); } /// /// Deletes records from the TestSetupROIs and ROIPeriodChannels tables /// /// /// public static ulong RegionsOfInterestDelete(int testSetupId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.RegionsOfInterest.RegionsOfInterestDelete(user, con, testSetupId); } /// /// Inserts records into the TestSetupROIs and ROIPeriodChannels tables /// /// /// /// public static ulong RegionsOfInterestInsert(int testSetupId, IRegionOfInterest regionOfInterest) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.RegionsOfInterest.RegionsOfInterestInsert(user, con, CURRENT_DB_VERSION, testSetupId, regionOfInterest); } /// /// Retrieves records from the TestSetupROIs and ROIPeriodChannels tables /// /// /// /// public static ulong RegionsOfInterestGet(int testSetupId, out IRegionOfInterest[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.RegionsOfInterest.RegionsOfInterestGet(user, con, CURRENT_DB_VERSION, testSetupId, out records); } public static ulong TestGraphsDelete(int graphId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Graphs.GraphsDelete(user, con, graphId); } public static ulong TestGraphsInsert(IGraphRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Graphs.GraphsInsert(user, con, ref record); } public static ulong TestGraphsUpdate(IGraphRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Graphs.GraphsUpdate(user, con, record); } public static ulong TestGraphsGet(int? graphId, int? testSetupId, out IGraphRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Graphs.GraphsGet(user, con, graphId, testSetupId, out records); } public static ulong SensorsDigitalOutUpdateInsert(IDigitalOutDbRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDigitalOutUpdateInsert(user, con, record); } /// /// returns all db digital output records matching search criteria /// /// database id of setting (can be null) /// serial number/name of sensor (can be null) /// matching records /// 0 (ERROR_SUCCESS) on success, all other values are error codes public static ulong SensorsDigitalOutGet(int? id, string serialNumber, out IDigitalOutDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDigitalOutGet(user, con, id, serialNumber, out records); } /// /// updates or inserts a digital input setting into the db /// modifies record on the case of insert with new database id /// /// record to commit /// 0 (ERROR_SUCCESS) on success, all other values are error codes public static ulong SensorsDigitalInUpdateInsert(IDigitalInDbRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDigitalInUpdateInsert(user, con, record); } /// /// retrieves all digital input settings matching search criteria /// /// database id of setting (can be null) /// serial number/name of setting (can be null) /// electronic id of setting (can be null) /// matching records /// 0 on success, all other values are error codes public static ulong SensorsDigitalInGet(int? id, string serialNumber, string eId, out IDigitalInDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDigitalInGet(user, con, id, serialNumber, eId, out records); } /// /// commits a squib to the database /// /// record to commit /// 0 on success, all other values are errors public static ulong SensorsSquibUpdateInsert(ISquibDbRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsSquibUpdateInsert(user, con, record); } /// /// retrieves any squibs matching search criteria /// /// Database id of squib (can be null) /// Setting name or serial number of squib (can be null) /// Electronic Id of squib (can be null) /// any matching records /// 0 on success, all other values are errors public static ulong SensorsSquibGet(int? id, string serialNumber, string eId, out ISquibDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsSquibGet(user, con, id, serialNumber, eId, out records); } /// /// Deletes all sensors (but test specific template sensors) /// /// 0 on success, all other values are error codes public static ulong SensorsDeleteAll() { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDeleteAll(user, con); } /// /// retrieves bridge resistance for sensor in db /// /// serial number of sensor /// bridge resistance in db /// 0 on success, all other values are error codes public static ulong SensorsAnalogBridgeResistanceGet( string serialNumber, out double bridgeResistance) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogBridgeResistanceGet(user, con, serialNumber, out bridgeResistance); } /// /// deletes matching sensors /// /// database id of sensor to be deleted /// type of sensor /// Squib = 3 /// DigitalIn = 1 /// DigitalOut = 2 /// UART = 4 /// Analog = 0 /// /// 0 on success, all other values are error codes public static ulong SensorsDelete(int sensorId, int sensorType) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsDelete(user, con, sensorId, sensorType); } /// /// deletes any matching sensor calibrations /// /// serial number /// calibration date (can be null) /// modify date (can be null) /// public static ulong SensorCalibrationsDelete(string sensorSerialNumber, DateTime? calibrationDate, DateTime? modifyDate) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorCalibrationsDelete(user, con, sensorSerialNumber, calibrationDate, modifyDate); } /// /// inserts a sensor calibration into the db /// /// calibration record to insert /// sensor type /// Squib = 3 /// DigitalIn = 1 /// DigitalOut = 2 /// UART = 4 /// Analog = 0 /// /// /// public static ulong SensorCalibrationsInsert( ISensorCalibration cal, int sensorType, bool setCalibrationId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorCalibrationsInsert(user, con, cal, sensorType, setCalibrationId); } /// /// inserts or updates sensor in database /// if inserted will be modified with database id after insert /// /// record to commit /// 0 on success, all other values are error codes public static ulong SensorsAnalogInsertUpdate(IAnalogDbRecord record) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogUpdateInsert(user, con, record); } /// /// retrieves all analog sensors matching criteria /// /// database id of sensor (can be null) /// serial number of sensor (can be null) /// Electronic Id (can be null) /// all records matching criteria /// 0 on success, all other values are error codes public static ulong SensorsAnalogGet(int? sensorId, string serialNumber, string eId, out IAnalogDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsAnalogGet(user, con, sensorId, serialNumber, eId, out records); } /// /// retrieves all sensors matching criteria /// /// serial number of sensor (can be null) /// all records matching criteria /// 0 on success, all other values are error codes public static ulong SensorsGet(string serialNumber, out ISensorDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorsGet(user, con, serialNumber, out records); } /// /// Updates the Sensor Usage count for all sensors in an Assembly /// /// 0 on success, all other values are error codes public static ulong UpdateAssemblySensorUsageCount(string assemblyName, int newUsageCount) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.UpdateAssemblySensorUsageCount(user, con, assemblyName, newUsageCount); } /// /// Updates the Sensor Usage count for a sensor in database /// /// 0 on success, all other values are error codes public static ulong UpdateSensorUsageCount(ISensorData sd) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.UpdateSensorUsageCount(user, con, sd); } /// /// returns all calibrations matching criteria /// /// database id of sensor (can be null) /// serial number of sensor (can be null) /// records matching criteria /// 0 on success, all other values are error codes public static ulong SensorCalibrationsGet(int? sensorId, string serialNumber, out ISensorCalDbRecord[] records) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.SensorCalibrationsGet(user, con, sensorId, serialNumber, out records); } /// /// Updates the Sensor Calibration Usage count for a sensor in database /// /// 0 on success, all other values are error codes public static ulong UpdateSensorCalibrationUsageCount(int sensorId, int sensorCalibrationId, int newUsageCount) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Sensors.UpdateSensorCalibrationUsageCount(user, con, sensorId, sensorCalibrationId, newUsageCount); } /// /// initializes loggers for DbAPI (path, size, verbosity) /// /// /// /// Bitmask for log types (based on TraceEventTypes) /// Critical - Bit 0 /// Error - Bit 1 /// Warning - Bit 2 /// Information - Bit 3 /// Verbose - Bit 4 /// Start - Bit 8 /// Stop - Bit 9 /// Suspend - Bit 10 /// Resume - Bit 11 /// Transfer - Bit 12 /// public static void InitializeDbAPI(int logSize, string path, int logTypes) { DbAPI.DbAPI.InitializeLogger(logSize, path, logTypes); } /// /// Deletes channels belong to a DAS /// /// string indicating hardware (serial_dastype) /// 0 on success, all other values are error codes public static ulong DASChannelsDelete(string hardwareId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASChannelsDelete(user, con, hardwareId); } /// /// gets any children associated with a das (S6 connected to a S6 distributor for instance) /// /// serial number of parent das /// output of serial numbers for any associated children /// 0 on success, all other values are error codes public static ulong DASChildrenGet(string serial, out string[] childrenSerialNumbers) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASChildrenGet(user, con, serial, out childrenSerialNumbers); } /// /// Deletes a DAS /// will remove record from any test setups /// will remove from channel assignments (if embedded, otherwise will remove channels as well) /// will remove das channels and das meta data /// /// /// /// whether das is embedded (only exists in a given test or group) /// 0 on success, all other values are error codes public static ulong DASDelete(int DASId, string serial, bool embedded) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASDelete(user, con, DASId, serial, embedded); } /// /// deletes all DAS /// /// 0 on success, all other values are error codes public static ulong ClearNonPrototypeDas() { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; var ret = DbAPI.DbAPI.DAS.DASGet(user, con, con.ClientDbVersion, null, null, out var allDAS); foreach (var d in allDAS) { ret = DbAPI.DbAPI.DAS.DASDelete(user, con, d.DASId, d.SerialNumber, false); if (ret != 0) break; } return ret; } /// /// retrieves all das matching input criteria /// /// specific das id to look for (or null) /// specific serial to look for (or null) /// position to look for (or null) use Prototype to find prototype hardware /// matching DAS /// 0 on success, all other values are error codes public static ulong DASGet(string dasSerial, string position, out IDASDBRecord[] das) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASGet(user, con, con.ClientDbVersion, dasSerial, position, out das); } /// /// inserts a new das record into the DB /// DAS Id will be updated on insert /// /// DAS to insert /// 0 on success, all other values are error codes public static ulong DASInsert(IDASDBRecord das) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASInsert(user, con, das); } /// /// update a DAS record in the db /// /// DAS to update /// 0 on success, all other values are error codes public static ulong DASUpdate(IDASDBRecord das) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASUpdate(user, con, das); } /// /// returns all channels matching input criteria /// /// string indentifying hardware (serial_dastype) /// output all matching channels /// 0 on success, all other values are error codes public static ulong DASChannelsGet(string hardwareId, out IDASChannelDBRecord[] channels) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASChannelsGet(user, con, hardwareId, out channels); } /// /// inserts DAS channels into database /// /// channels to insert /// string indentifying hardware (serial_dastype) /// 0 on success, all other values are error codes public static ulong DASChannelsInsert(IDASChannelDBRecord channel, string hardwareId) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.DAS.DASChannelsInsert(user, con, hardwareId, ref channel); } /// /// Inserts a new record in the Channels table /// /// The new values for the record in the Channels table /// public static ulong ChannelsInsert(ref IChannelDbRecord channel) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelsInsert(user, con, ref channel); } /// /// Updates an existing record in the Channels table /// /// The new values for the record in the Channels table /// public static ulong ChannelsUpdate(IChannelDbRecord channel) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelsUpdate(user, con, channel); } /// /// Returns all channels matching input criteria /// /// Id in the Channels table /// GroupId in the Channels and TestSetupGroups tables /// DASId in the Channels table /// SensorId in the Channels table /// TestSetupId in the TestSetupGroups and TestSetups tables /// TestSetupName in the TestSetups table /// output all matching channels /// 0 on success, all other values are error codes public static ulong ChannelsGet(int? channelId, int? groupId, int? dasId, int? sensorId, int? testSetupId, string testSetupName, out IChannelDbRecord[] channels) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelsGet(user, con, con.ClientDbVersion, channelId, groupId, dasId, sensorId, testSetupId, testSetupName, out channels); } /// /// Deletes an entry in the Channels table /// /// Id in the Channels table /// Error string returned, possibly from sp_ChannelsDelete /// public static ulong ChannelsDelete(long id, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Channels.ChannelsDelete(user, con, id, out errorMessage); } /// /// Inserts a new record in the GroupHardware table /// /// public static ulong GroupHardwareInsert(GroupHardwareDbRecord groupHardwareDbRecord, out int newId, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; newId = -1; errorMessage = string.Empty; return DbAPI.DbAPI.GroupHardware.GroupHardwareInsert(user, con, groupHardwareDbRecord, out newId, out errorMessage); } /// /// Gets one or more record from the GroupHardware table /// /// public static ulong GroupHardwareGet(int? groupId, string serialNumber, bool? embedded, out GroupHardwareDbRecord[] groupHardwareDbRecords) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.GroupHardware.GroupHardwareGet(user, con, groupId, serialNumber, embedded, out groupHardwareDbRecords); } /// /// Deletes a record in the GroupHardware table /// /// public static ulong GroupHardwareDelete(int? groupId, int? dasId, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.GroupHardware.GroupHardwareDelete(user, con, groupId, dasId, out errorMessage); } /// /// Inserts a new record in the Groups table /// /// public static ulong GroupsInsert(ref IGroupDbRecord group) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Groups.GroupsInsert(user, con, ref group); } /// /// Updates a record in the Groups table /// /// public static ulong GroupsUpdate(IGroupDbRecord group) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Groups.GroupsUpdate(user, con, group); } public static ulong GroupsGet(int? id, string serialNumber, string displayName, bool? embedded, int? staticGroupId, out IGroupDbRecord[] groups) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Groups.GroupsGet(user, con, id, serialNumber, displayName, embedded, staticGroupId, out groups); } /// /// Deletes a record in the Groups table /// /// public static ulong GroupsDelete(long id, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.Groups.GroupsDelete(user, con, id, out errorMessage); } /// /// Inserts a new record in the CustomerDetails table /// /// The new values for the record in the CustomerDetails table /// The Id of the new record in the CustomerDetails table /// Error string returned, possibly from sp_CustomerDetailsInsert /// public static ulong CustomerDetailsInsert(CustomerDetailsDbRecord customerDetailsDbRecord, out int newId, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CustomerDetails.CustomerDetailsInsert(user, con, customerDetailsDbRecord, out newId, out errorMessage); } /// /// Updates an existing record in the CustomerDetails table /// /// The new values for the record in the CustomerDetails table /// Error string returned, possibly from sp_CustomerDetailsUpdate /// public static ulong CustomerDetailsUpdate(CustomerDetailsDbRecord customerDetailsDbRecord, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CustomerDetails.CustomerDetailsUpdate(user, con, customerDetailsDbRecord, out errorMessage); } /// /// Returns all channels matching input criteria /// /// Name in the CustomerDetails table /// output all matching records /// 0 on success, all other values are error codes public static ulong CustomerDetailsGet(string name, out ICustomerDetailsDbRecord[] customerDetailsDbRecords) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CustomerDetails.CustomerDetailsGet(user, con, name, out customerDetailsDbRecords); } /// /// Deletes an entry in the CustomerDetails table /// /// Id in the CustomerDetails table /// Error string returned, possibly from sp_CustomerDetailsDelete /// public static ulong CustomerDetailsDelete(string name, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.CustomerDetails.CustomerDetailsDelete(user, con, name, out errorMessage); } /// /// Inserts a new record in the LabratoryDetails table /// /// The new values for the record in the LabratoryDetails table /// The Id of the new record in the LabratoryDetails table /// Error string returned, possibly from sp_LabratoryDetailsInsert /// public static ulong LabratoryDetailsInsert(LabratoryDetailsDbRecord labratoryDetailsDbRecord, out int newId, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.LabratoryDetails.LabratoryDetailsInsert(user, con, labratoryDetailsDbRecord, out newId, out errorMessage); } /// /// Updates an existing record in the LabratoryDetails table /// /// The new values for the record in the LabratoryDetails table /// Error string returned, possibly from sp_LabratoryDetailsUpdate /// public static ulong LabratoryDetailsUpdate(LabratoryDetailsDbRecord labratoryDetailsDbRecord, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.LabratoryDetails.LabratoryDetailsUpdate(user, con, labratoryDetailsDbRecord, out errorMessage); } /// /// Updates an existing record or Inserts a new record in the LabratoryDetails table /// /// The new values for the record in the LabratoryDetails table /// Error string returned, possibly from sp_LabratoryDetailsUpdate /// public static ulong LabratoryDetailsUpdateInsert(LabratoryDetailsDbRecord labratoryDetailsDbRecord, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.LabratoryDetails.LabratoryDetailsUpdateInsert(user, con, labratoryDetailsDbRecord, out errorMessage); } /// /// Returns all channels matching input criteria /// /// Name in the LabratoryDetails table /// output all matching records /// 0 on success, all other values are error codes public static ulong LabratoryDetailsGet(string name, out ILabratoryDetailsDbRecord[] labratoryDetailsDbRecords) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.LabratoryDetails.LabratoryDetailsGet(user, con, name, out labratoryDetailsDbRecords); } /// /// Deletes an entry in the LabratoryDetails table /// /// Id in the LabratoryDetails table /// Error string returned, possibly from sp_LabratoryDetailsDelete /// public static ulong LabratoryDetailsDelete(string name, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.LabratoryDetails.LabratoryDetailsDelete(user, con, name, out errorMessage); } /// /// Inserts a new record in the TestEngineerDetails table /// /// The new values for the record in the TestEngineerDetails table /// The Id of the new record in the TestEngineerDetails table /// Error string returned, possibly from sp_TestEngineerDetailsInsert /// public static ulong TestEngineerDetailsInsert(TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out int newId, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestEngineerDetails.TestEngineerDetailsInsert(user, con, testEngineerDetailsDbRecord, out newId, out errorMessage); } /// /// Updates an existing record in the TestEngineerDetails table /// /// The new values for the record in the TestEngineerDetails table /// Error string returned, possibly from sp_TestEngineerDetailsUpdate /// public static ulong TestEngineerDetailsUpdate(TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestEngineerDetails.TestEngineerDetailsUpdate(user, con, testEngineerDetailsDbRecord, out errorMessage); } /// /// Updates an existing record or Inserts a new record in the TestEngineerDetails table /// /// The new values for the record in the TestEngineerDetails table /// Error string returned, possibly from sp_TestEngineerDetailsUpdate /// public static ulong TestEngineerDetailsUpdateInsert(TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestEngineerDetails.TestEngineerDetailsUpdateInsert(user, con, testEngineerDetailsDbRecord, out errorMessage); } /// /// Returns all channels matching input criteria /// /// Name in the LabratoryDetails table /// output all matching records /// 0 on success, all other values are error codes public static ulong TestEngineerDetailsGet(string name, out ITestEngineerDetailsDbRecord[] testEngineerDetailsDbRecords) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestEngineerDetails.TestEngineerDetailsGet(user, con, name, out testEngineerDetailsDbRecords); } /// /// Deletes an entry in the TestEngineerDetails table /// /// Id in the TestEngineerDetails table /// Error string returned, possibly from sp_TestEngineerDetailsDelete /// public static ulong TestEngineerDetailsDelete(string name, out string errorMessage) { var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var user = CurrentUserDbRecord; return DbAPI.DbAPI.TestEngineerDetails.TestEngineerDetailsDelete(user, con, name, out errorMessage); } /// /// updated whenever current user is changed, this is the recorder of the user in terms of the database information on /// the user, used for database calls /// public static IUserDbRecord CurrentUserDbRecord { get; set; } = null; public static bool LoginUserHash(string user, string hash, out IUserDbRecord iUser) { iUser = null; var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var hResult = DbAPI.DbAPI.Connections.LoginUserHash(con, user, hash, out var userObject); if (0 == hResult) { iUser = userObject; return true; } return false; } public static bool LoginUser(string user, string password, out IUserDbRecord iUser) { iUser = null; var con = DbAPI.DbAPI.Connections.GetActiveConnections()[0]; var hResult = DbAPI.DbAPI.Connections.LoginUser(con, user, password, out var userObject); if (0 == hResult) { iUser = userObject; return true; } return false; } public static string BEGIN_STATEMENT => _usingMSSQL ? "BEGIN TRAN;" : "BEGIN;"; public static string COMMIT_STATEMENT => _usingMSSQL ? "COMMIT TRAN;" : "COMMIT;"; public int DbVersion { get; set; } = -1; public class NoDBAccessException : Exception { public NoDBAccessException(Exception ex) : base(ex.Message, ex) { } } /// /// inserts a sensor history record into the db /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// public static int InsertArmEventSensorRecord( long testHistoryId, int sensorId, string serialNumber, double? capacity, double? range, DateTime? calibrationDate, string hardwareChannelName, string isoChannelName, string isoCode, string userChannelName, string userCode, string sensitivity, string filterclass, bool isProportional, string linearizationFormula, string eid, double? measuredExcitation, string measurementUnit, int samplesPerSecond, int aaf) { using (var cmd = GetSQLCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "sp_SensorTestHistoryUpdateInsert"; cmd.Parameters.Add(new SqlParameter("@SensorTestHistoryId", SqlDbType.BigInt) { Value = DBNull.Value }); cmd.Parameters.Add(new SqlParameter("@TestHistoryId", SqlDbType.BigInt) { Value = testHistoryId }); cmd.Parameters.Add(new SqlParameter("@SensorId", SqlDbType.Int) { Value = sensorId }); cmd.Parameters.Add(new SqlParameter("@SerialNumber", SqlDbType.NVarChar) { Value = serialNumber }); if (null != capacity) { cmd.Parameters.Add(new SqlParameter("@Capacity", SqlDbType.Float) { Value = (double)capacity }); } if (null != range) { cmd.Parameters.Add(new SqlParameter("@Range", SqlDbType.Float) { Value = (double)range }); } if (null != calibrationDate) { cmd.Parameters.Add(new SqlParameter("@CalibrationDate", SqlDbType.DateTime) { Value = (DateTime)calibrationDate }); } cmd.Parameters.Add(new SqlParameter("@HardwareChannelName", SqlDbType.NVarChar) { Value = hardwareChannelName }); cmd.Parameters.Add(new SqlParameter("@ISOChannelName", SqlDbType.NVarChar) { Value = isoChannelName }); cmd.Parameters.Add(new SqlParameter("@ISOCode", SqlDbType.NVarChar, 50) { Value = isoCode }); cmd.Parameters.Add(new SqlParameter("@UserChannelName", SqlDbType.NVarChar) { Value = userChannelName }); cmd.Parameters.Add(new SqlParameter("@UserCode", SqlDbType.NVarChar, 50) { Value = userCode }); cmd.Parameters.Add(new SqlParameter("@Sensitivity", SqlDbType.NVarChar) { Value = sensitivity }); cmd.Parameters.Add(new SqlParameter("@FilterClass", SqlDbType.NVarChar, 50) { Value = filterclass }); cmd.Parameters.Add(new SqlParameter("@IsProportional", SqlDbType.Bit) { Value = isProportional }); cmd.Parameters.Add(new SqlParameter("@LinearizationFormula", SqlDbType.NVarChar) { Value = linearizationFormula }); cmd.Parameters.Add(new SqlParameter("@EID", SqlDbType.NVarChar, 50) { Value = eid }); if (null != measuredExcitation) { cmd.Parameters.Add(new SqlParameter("@MeasuredExcitation", SqlDbType.Decimal) { Value = (double)measuredExcitation }); } cmd.Parameters.Add(new SqlParameter("@MeasurementUnit", SqlDbType.NVarChar) { Value = measurementUnit }); cmd.Parameters.Add(new SqlParameter("@SamplesPerSecond", SqlDbType.Int) { Value = samplesPerSecond }); cmd.Parameters.Add(new SqlParameter("@AAF", SqlDbType.Int) { Value = aaf }); 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, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value)) { var error = Convert.ToInt32(errorNumber.Value); if (0 != error) { throw new Exception( $"Failed to insert sensor record - errorcode: {error} - msg: {(string)errorNumber.Value}"); } } return Convert.ToInt32(newId.Value); } catch (Exception ex) { APILogger.Log(ex); return -1; } finally { cmd.Connection.Dispose(); } } } /// /// Inserts a test history record into the db /// /// /// /// /// /// /// /// /// whether to store the test setup in a compressed form in the db /// public static int InsertArmEvent( int testSetupId, string testName, string testDescription, string testId, bool destructive, DateTime armTime, string testSetupXml, bool storeTestSetup ) { using (var cmd = GetSQLCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "sp_TestHistoryUpdateInsert"; cmd.Parameters.Add(new SqlParameter("@TestHistoryId", SqlDbType.BigInt) { Value = DBNull.Value }); cmd.Parameters.Add(new SqlParameter("@TestSetupId", SqlDbType.Int) { Value = testSetupId }); cmd.Parameters.Add(new SqlParameter("@TestSetupName", SqlDbType.NVarChar, 50) { Value = testName }); cmd.Parameters.Add(new SqlParameter("@TestSetupDescription", SqlDbType.NVarChar, 50) { Value = testDescription }); cmd.Parameters.Add(new SqlParameter("@TestId", SqlDbType.NVarChar) { Value = testId }); cmd.Parameters.Add(new SqlParameter("@Destructive", SqlDbType.Bit) { Value = destructive }); cmd.Parameters.Add(new SqlParameter("@ArmTime", SqlDbType.DateTime) { Value = armTime }); if (string.IsNullOrWhiteSpace(testSetupXml) || !storeTestSetup) { cmd.Parameters.Add(new SqlParameter("@TestSetup", SqlDbType.Binary) { Value = DBNull.Value }); } else { cmd.Parameters.Add(new SqlParameter("@TestSetup", SqlDbType.Binary) { Value = GetSetupBytes(testSetupXml) }); } 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, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessage); cmd.ExecuteNonQuery(); if (!DBNull.Value.Equals(errorNumber.Value)) { var error = Convert.ToInt32(errorNumber.Value); if (0 != error) { throw new Exception($"InsertArmEvent failed - errorcode: {error} msg: {errorMessage.Value}"); } } return Convert.ToInt32(newId.Value); } catch (Exception ex) { APILogger.Log("Failed to InsertArmEvent", ex); var eventAggregator = ContainerLocator.Container.Resolve(); eventAggregator.GetEvent() .Publish(new PageErrorArg(new[] { DTS.Common.Strings.Strings.Warning_FailedEventInsert }, null)); return -1; } finally { cmd.Connection.Dispose(); } } } /// /// compresses a string using gzip and utf-8 /// /// /// private static byte[] GetSetupBytes(string xml) { var bytes = new byte[0]; using (var s = new MemoryStream()) { using (var gs = new GZipStream(s, CompressionMode.Compress, false)) { var localbytes = Encoding.UTF8.GetBytes(xml); gs.Write(localbytes, 0, localbytes.Length); } s.Flush(); bytes = s.ToArray(); } return bytes; } /// /// current db version in this code base /// public const int CURRENT_DB_VERSION = 100; public const int MINIMUM_LTS_DB_VERSION = 91; /// /// inserts all known ui items into the UIItems table, as part of migration step 52 to 53 /// /// private void InsertIUIItems(string[] items) { using (var cmd = GetCommand()) { var sb = new StringBuilder(); sb.Append(BEGIN_STATEMENT); for (var i = 0; i < items.Length; i++) { sb.AppendFormat("INSERT INTO UIItems ([NAME]) VALUES (@{0}_1);", i); CreateParam(cmd, $"@{i}_1", SqlDbType.NVarChar, items[i]); } sb.Append(COMMIT_STATEMENT); cmd.CommandText = sb.ToString(); //Connection.ExecuteCommand(cmd); if (_usingMSSQL) { ExecuteCommand(cmd); } else { ExecuteSQLiteCommand(cmd); } } } /// /// looks up all the UIitems in the db, used in migration 52 to 53 /// /// private static Dictionary GetPermissionsLookup() { var lookup = new Dictionary(); using (var cmd = GetCommand()) { cmd.CommandText = "SELECT [ID],[NAME] FROM [UIItems]"; using (var ds = Connection.QueryDataSet(cmd)) { foreach (DataRow row in ds.Tables[0].Rows) { var id = Convert.ToInt64(row["ID"]); var name = Convert.ToString(row["NAME"]); lookup[name] = id; } } } return lookup; } private enum SensUnits { NONE, mV, mVperV, mVperVperEU, mVperEU } private void UpdateCalibrationRecords() { using (var cmdQRY = GetSQLCommand()) { //Get all Calibrations cmdQRY.CommandText = "SELECT * from tblSensorCalibrations"; using (var ds = QueryDataSet(cmdQRY)) { foreach (DataRow dr in ds.Tables[0].Rows) { var serialNumber = Convert.ToString(dr[SensorDB.SensorCalibrationFields.SerialNumber.ToString()]); var calDate = Convert.ToDateTime(dr[SensorDB.SensorCalibrationFields.CalibrationDate.ToString()]); var modifyDate = Convert.ToDateTime(dr[SensorDB.SensorCalibrationFields.ModifyDate.ToString()]); var proportionalToExcitation = Convert.ToBoolean(dr[SensorDB.SensorCalibrationFields.IsProportional.ToString()]); var nonLinear = Convert.ToBoolean(dr[SensorDB.SensorCalibrationFields.NonLinear.ToString()]); var cr = Convert.ToString(dr[SensorDB.SensorCalibrationFields.CalibrationRecords.ToString()]); var excitationRecords = cr.Split(new string[] { "__x__" }, StringSplitOptions.None); for (var i = 0; i < excitationRecords.Length; i++) { // split record into fields var calRecordFields = excitationRecords[i].Split(','); //Set AtCapacity to False calRecordFields[(int)SensorDB.SensorCalibrationRecordFields.AtCapacity] = "False"; //Stuff back in record string excitationRecords[i] = string.Join(",", calRecordFields); // Build SensitivityUnits string var sbSensitivityUnits = new StringBuilder(); sbSensitivityUnits.Append(","); if (nonLinear) { // If we are nonlinear leave units blank sbSensitivityUnits.Append(SensUnits.NONE); } else { // Always Append per EU because we have no "AtCapacity" Sensors, yet. sbSensitivityUnits.Append(proportionalToExcitation ? SensUnits.mVperVperEU : SensUnits.mVperEU); } //Add new SensitivityUnits CalibrationRecord Setting excitationRecords[i] = string.Concat(excitationRecords[i], sbSensitivityUnits.ToString()); } cr = string.Join("__x__", excitationRecords); // execute change using (var cmdEX = GetSQLCommand()) { cmdEX.CommandText = "UPDATE tblSensorCalibrations SET CalibrationRecords=@CalibrationRecords where SerialNumber=@SerialNumber AND CalibrationDate=@CalibrationDate AND ModifyDate=@ModifyDate"; CreateParam(cmdEX, "@SerialNumber", SqlDbType.NVarChar, serialNumber); CreateParam(cmdEX, "@CalibrationDate", SqlDbType.DateTime, calDate); CreateParam(cmdEX, "@ModifyDate", SqlDbType.DateTime, modifyDate); CreateParam(cmdEX, "@CalibrationRecords", SqlDbType.NVarChar, cr); ExecuteCommand(cmdEX); } } } } } private void InsertIntoSqlVersionsTable(SqlCommand cmd, int version, int step) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_DbVersionInsert.ToString(); #region params cmd.Parameters.Add(new SqlParameter("@Version", SqlDbType.Int) { Value = version }); cmd.Parameters.Add(new SqlParameter("@Step", SqlDbType.Int) { Value = step }); cmd.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime) { Value = DateTime.Now }); cmd.Parameters.Add(new SqlParameter("@Remarks", SqlDbType.NVarChar, 255) { Value = string.Empty }); cmd.Parameters.Add(new SqlParameter("@UserField", SqlDbType.NVarChar, 255) { Value = "SYSTEM" }); cmd.Parameters.Add(new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output }); cmd.Parameters.Add( new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }); cmd.Parameters.Add( new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }); #endregion params cmd.ExecuteNonQuery(); } catch (Exception ex) { throw new Exception(ex.Message, ex); } } public class DbTypeAttr : Attribute { public string DbType { get; } internal DbTypeAttr(string attr) { DbType = attr; } public static string GetDbType(object o) { var mi = o?.GetType().GetMember(o.ToString()); if (mi != null && mi.Length > 0) { if (GetCustomAttribute(mi[0], typeof(DbTypeAttr)) is DbTypeAttr attr) { return attr.DbType; } } return null; } } public static bool _usingCentralizedDB = true; //True means using a remote, centralized server; False means using a local SqlLocalDb public static bool _usingMSSQL = true; public static bool _usingNTLMAuthentication = false; public static string _previousDir = string.Empty; public static /*System.Data.IDbDataParameter*/ void CreateParam(IDbCommand icmd, string name, SqlDbType type, object value) { switch (type) { case SqlDbType.DateTime: if (null == value) { value = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; } else if (value is DateTime) { if (((DateTime)value) < (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue) { value = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; } //value = string.Format("{0:yyyy-MM-dd}", ((DateTime)value)) + " " + ((DateTime)value).ToLongTimeString(); value = $"{(DateTime)value:yyyy-MM-dd} {(DateTime)value:HH:mm:ss}"; } break; case SqlDbType.NVarChar: break; } if (_usingMSSQL) { var param = new SqlParameter(name, type); param.Value = value; icmd.Parameters.Add(param); } else { var cmd = icmd as System.Data.SQLite.SQLiteCommand; cmd.Parameters.AddWithValue(name, value); } } /// /// returns a DbCommand interface to the DASFactory db /// /// public static IDbCommand GetDASFactoryCommand() { var cmd = new SqlCommand(); cmd.Connection = new SqlConnection(Connection.GetLocalDASFactoryConnectionString()); cmd.Connection.Open(); return cmd; } public static IDbCommand GetISOCommand() { var cmd = new SqlCommand(); cmd.Connection = new SqlConnection(Connection.GetLocalISOConnectionString()); cmd.Connection.Open(); return cmd; } public static IDbCommand GetCommand() { if (_usingMSSQL) { return GetSQLCommand(); } return new System.Data.SQLite.SQLiteCommand(); } public static IDbCommand GetSQLiteCommand() { return new System.Data.SQLite.SQLiteCommand(); } public static SqlCommand _cmd { get; set; } = null; public static SqlCommand GetSQLCommand() { return GetSQLCommand(true); } public static SqlCommand GetSQLCommand(bool newCommand) { if (_cmd == null) { _cmd = new SqlCommand(); } var currentCmd = _cmd; if (newCommand) { currentCmd = new SqlCommand(); } if (currentCmd.Connection == null || currentCmd.Connection.State != ConnectionState.Open) { currentCmd.Connection = new SqlConnection(Connection.GetLocalConnectionString()); try { //FB16165: don't crash when SQL connection drops currentCmd.Connection.Open(); } catch (Exception ex) { APILogger.Log("Could not open db connection", ex); } } currentCmd.Parameters.Clear(); return currentCmd; } public static IDbCommand GetSQLOnlyCommand() { return new SqlCommand(); } private string _localConnection = null; public void ResetLocalConnectionString() { lock (dbLock) { _localConnection = null; //http://manuscript.dts.local/f/cases/39203/Local-mode-interacts-with-central-db //we are switching from local to remote or vice versa, clear any existing connections //we want to make sure we dont' use them DbAPI.DbAPI.Connections.ClearConnections(); Server = ""; } } public void ResetLocalConnectionStringDb(string dbName) { lock (dbLock) { _localConnection = null; DBName = dbName; } } private string _localDASFactoryConnection = null; public string GetLocalDASFactoryConnectionString() { lock (dbLock) { if (null != _localDASFactoryConnection) return _localDASFactoryConnection; _localDASFactoryConnection = _usingNTLMAuthentication ? $"Server={Server};Database=DASFactory;Trusted_Connection=TRUE;" : $"Server={Server};Database=DASFactory;User Id={Username};Password={Password};"; } return _localDASFactoryConnection; } private string _localISOConnection = null; public string GetLocalISOConnectionString() { lock (dbLock) { if (null != _localISOConnection) return _localISOConnection; _localISOConnection = _usingNTLMAuthentication ? $"Server={Server};Database=ISO;Trusted_Connection=TRUE;" : $"Server={Server};Database=ISO;User Id={Username};Password={Password};"; } return _localISOConnection; } public string GetLocalConnectionString() { lock (dbLock) { if (null != _localConnection) return _localConnection; if (null == Server && !_bCS3) { throw new Exception("db connection not initialized"); } if (_bCS3) { _localConnection = CS3UsingNTLMAuthentication ? $"Server={CS3Host};Database={CS3Name};Trusted_Connection=TRUE;" : $"Server={CS3Host};Database={CS3Name};User Id={CS3User};Password={CS3Password}"; } else { _localConnection = _usingNTLMAuthentication ? $"Server={Server};Database={DBName};Trusted_Connection=TRUE;" : $"Server={Server};Database={DBName};User Id={Username};Password={Password};"; } } return _localConnection; } #region CS3 STUFF public bool CS3UsingNTLMAuthentication { get; set; } = false; public string CS3Host { get; set; } = null; public string CS3Name { get; set; } = null; public string CS3User { get; set; } = null; public string CS3Password { get; set; } = null; #endregion CS3 STUFF public string Server { get; set; } = null; public string DBName { get; set; } = null; public string Username { get; set; } = ""; public string Password { get; set; } private static bool _lastConnectionStatus = false; public static bool LastConnectionStatus { get { lock (dbLock) { return _lastConnectionStatus; } } set { lock (dbLock) { _lastConnectionStatus = value; } ConnectionStatusChanged?.Invoke(value); } } public delegate void ConnectionStatusChangedDelegate(bool connected); private static ConnectionStatusChangedDelegate _ConnectionStatusChange; public static ConnectionStatusChangedDelegate ConnectionStatusChanged { get { lock (dbLock) { return _ConnectionStatusChange; } } set { lock (dbLock) { _ConnectionStatusChange = value; } } } private static DbOperations _dbOperations = null; private static DbOperations _dbOperationsCS3 = null; private static readonly object dbLock = new object(); public static DbOperations Connection { get { lock (dbLock) { if (null == _dbOperations) { _dbOperations = new DbOperations(); } } return _dbOperations; } } public static DbOperations Cs3Connection { get { lock (dbLock) { if (null == _dbOperationsCS3) { _dbOperationsCS3 = new DbOperations(true); } } return _dbOperationsCS3; } } private readonly bool _bCS3 = false; protected DbOperations(bool bCs3) { _bCS3 = true; } protected DbOperations() { } public void StartSynchronizationThread() { if (null != _syncThread) { StopSynchronizationThread(); } _stopHandle = new ManualResetEvent(false); _syncThread = new Thread(new ThreadStart(SyncThread)); _syncThread.Start(); } private ManualResetEvent _stopHandle; private Thread _syncThread = null; private readonly int msWaitTime = 100; private readonly int waitsBetweenSync = 6000; private void SyncThread() { var currentWait = waitsBetweenSync; while (!_stopHandle.WaitOne(msWaitTime, false)) { if (++currentWait >= waitsBetweenSync) { try { //Synchronize(); } catch (Exception ex) { APILogger.Log(ex); } currentWait = 0; } } _syncThread = null; } public void StopSynchronizationThread() { if (null != _syncThread) { while (null != _syncThread) { _stopHandle.Set(); Thread.Sleep(100); } _stopHandle = null; } } public const string NoConnection = "NoConnection"; public DataSet QueryDataSet(SqlCommand icmd) { try { Log(icmd); } catch (Exception ex) { APILogger.Log(ex); } if (icmd == null) return null; using (var adapter = new SqlDataAdapter(icmd)) { var ds = new DataSet(); try { adapter.Fill(ds); return ds; } catch (Exception) { Log(icmd, true); throw; } } // } } public DataSet QueryDataSet(IDbCommand icmd) { try { Log(icmd); } catch (Exception ex) { APILogger.Log(ex); } if (_usingMSSQL) { var cmd = icmd as SqlCommand; if (icmd == null) return null; using (var adapter = new SqlDataAdapter(cmd)) { var ds = new DataSet(); try { adapter.Fill(ds); return ds; } catch (Exception) { Log(icmd, true); throw; } } } var fullDbConnectionPath = System.IO.Path.Combine(_previousDir, "db", "datapro.db"); using (var c = new System.Data.SQLite.SQLiteConnection($"Data Source={fullDbConnectionPath}")) { if (c.State == ConnectionState.Closed) { try { c.Open(); LastConnectionStatus = true; } catch (Exception ex) { LastConnectionStatus = false; throw new SystemException(NoConnection, ex); } } var cmd = icmd as System.Data.SQLite.SQLiteCommand; cmd.Connection = c; using (var adapter = new System.Data.SQLite.SQLiteDataAdapter(cmd)) { var ds = new DataSet(); try { adapter.Fill(ds); } catch (Exception ex) { Log(icmd, true); APILogger.Log("Failed to read db", ex); } return ds; } } } private string _dbConnection = System.IO.Path.Combine("db", "datapro.db"); /// /// Used by DBTypeChoice in the InstallerCustomActions to migrate old SQLite databases /// /// /// /// /// /// public DataSet QueryDataSet(IDbCommand icmd, string previousDir, bool standAlone, string dbName) { if (standAlone) { _dbConnection = dbName; } var fullDbConnectionPath = System.IO.Path.Combine(previousDir, _dbConnection); using (var c = new System.Data.SQLite.SQLiteConnection($"Data Source={fullDbConnectionPath}")) { if (c.State == ConnectionState.Closed) { try { c.Open(); LastConnectionStatus = true; } catch (Exception ex) { LastConnectionStatus = false; throw new SystemException(NoConnection, ex); } } var cmd = icmd as System.Data.SQLite.SQLiteCommand; cmd.Connection = c; using (var adapter = new System.Data.SQLite.SQLiteDataAdapter(cmd)) { var ds = new DataSet(); try { adapter.Fill(ds); } catch (Exception ex) { Log(icmd, true); APILogger.Log("Failed to read db", ex); } return ds; } } } public int ExecuteSQLiteCommand(IDbCommand icmd) { var fullDbConnectionPath = System.IO.Path.Combine(_previousDir, _dbConnection); using (var c = new System.Data.SQLite.SQLiteConnection($"Data Source={fullDbConnectionPath}")) { if (c.State == ConnectionState.Closed) { try { c.Open(); LastConnectionStatus = true; } catch (Exception ex) { LastConnectionStatus = false; throw new SystemException(NoConnection, ex); } } var cmd = icmd as System.Data.SQLite.SQLiteCommand; cmd.Connection = c; return cmd.ExecuteNonQuery(); } } public int ExecuteCommand(IDbCommand icmd) { try { Log(icmd); } catch (Exception ex) { APILogger.Log(ex); } var cmd = icmd as SqlCommand; using (var MsSqlConnection = new SqlConnection(GetLocalConnectionString())) { try { MsSqlConnection.Open(); cmd.Connection = MsSqlConnection; LastConnectionStatus = true; } catch (Exception ex) { LastConnectionStatus = false; throw new SystemException(NoConnection, ex); } if (cmd != null) { cmd.Connection = MsSqlConnection; } try { return cmd.ExecuteNonQuery(); } catch (Exception) { Log(cmd, true); throw; } } } private volatile bool _bLoggingOn = false; public void SetTransactionLogging(bool bLog) { lock (LogLock) { LogName = $"SQL_{DateTime.Now.Year:0000}_{DateTime.Now.Month:00}_{DateTime.Now.Day:00}.log"; } _bLoggingOn = bLog; } private static readonly object LogLock = new object(); private string LogName; private void Log(IDbCommand cmd, bool exception = false) { if (!_bLoggingOn && !exception) { return; } var sb = new StringBuilder(); sb.AppendFormat("{1:u} COMMAND_TEXT: {0}\r\n", cmd.CommandText, DateTime.Now); foreach (IDbDataParameter p in cmd.Parameters) { sb.AppendFormat("Param: {0}\r\n", p.ParameterName); sb.AppendFormat("Value: {0}\r\n", p.Value?.ToString() ?? string.Empty); } if (exception) { try { APILogger.Log("SQLException:\r\n", sb.ToString()); } catch (Exception ex) { APILogger.Log(ex); } } else { lock (LogLock) { System.IO.File.AppendAllText(LogName, sb.ToString()); } } } public static void SaveChannelSettingDefaults(IChannelSetting[] channelDefaults) { foreach (var setting in channelDefaults) { _ = ChannelSettingsUpdate(setting.SettingTypeId, setting.Value); } } public static IChannelSetting[] GetChannelSettingDefaults() { var dictionary = new Dictionary>(); var hr = ChannelSettingsGet(null, null, out var records); if (0 == hr && null != records && records.Any()) { foreach (var record in records) { dictionary[record.Id] = new Tuple(record.SettingName, record.DefaultValue); } } var list = new List(); using (var enumSettings = dictionary.GetEnumerator()) { while (enumSettings.MoveNext()) { list.Add(new ChannelSettingBase(enumSettings.Current.Key, enumSettings.Current.Value.Item1, enumSettings.Current.Value.Item2)); } } return list.ToArray(); } public static Dictionary> GetSettingsLookup() { var dictionary = new Dictionary>(); var hr = DbOperations.ChannelSettingsGet(null, null, out var records); if (0 == hr && null != records && records.Any()) { foreach (var record in records) { dictionary[record.SettingName] = new Tuple(record.Id, record.SettingName, record.DefaultValue); } } return dictionary; } public static Dictionary> GetSettingsLookup2() { var dictionary = new Dictionary>(); var hr = ChannelSettingsGet(null, null, out var records); if (0 == hr && null != records && records.Any()) { foreach (var record in records) { dictionary[record.Id] = new Tuple( record.SettingName, record.DefaultValue); } } return dictionary; } } #region CustomChannelFieldSizeExtensions public class CustomChannelFieldSizeAttribute : Attribute { internal CustomChannelFieldSizeAttribute(int size) { Size = size; } public int Size { get; } } public static class CustomChannelFieldSizeExtensions { public static int GetFieldSize(DbOperations.MMETables.MMEPossibleChannelsFields field) { return (field.GetAttribute()).Size; } } public static class EnumExtensions { public static TAttribute GetAttribute(this Enum value) where TAttribute : Attribute { return (value.GetType()).GetField(Enum.GetName(value.GetType(), value)).GetCustomAttributes(false).OfType().SingleOrDefault(); } } #endregion CustomChannelFieldSizeExtensions }