--- source_files: - DataPRO/Modules/DatabaseImporter/DatabaseImport/CustomChannel.cs - DataPRO/Modules/DatabaseImporter/DatabaseImport/TestGraph.cs - DataPRO/Modules/DatabaseImporter/DatabaseImport/SerializedSettings.cs - DataPRO/Modules/DatabaseImporter/DatabaseImport/DbImporter.cs generated_at: "2026-04-17T15:54:30.728728+00:00" model: "zai-org/GLM-5-FP8" schema_version: 1 sha256: "92a90606b341eecd" --- # DatabaseImport Module Documentation ## Purpose The `DatabaseImport` namespace provides infrastructure for managing custom channel definitions beyond the ISO13499 standard, graph configurations for test visualization, serialized application settings storage, and XML-based database import/migration functionality. This module serves as a bridge between the ISO13499-compliant database schema and user-defined extensions, enabling test configuration persistence and cross-version database migrations. --- ## Public Interface ### CustomChannel.cs #### `CustomChannel` Class A wrapper for `MMEPossibleChannels` that supports user-defined channels outside the ISO13499 standard. **Constructor:** ```csharp public CustomChannel(MMEPossibleChannels channel, bool newChannel = true) ``` - Creates a new `CustomChannel` wrapping an `MMEPossibleChannels` instance. If `newChannel` is `true`, creates a copy of the channel; otherwise uses the provided reference directly. Initializes lookup values for direction, filter class, fine locations, main location, physical dimension, position, and test object from the ISO database. **Properties:** ```csharp public MMEPossibleChannels Channel { get; private set; } public string Text1 { get; set; } // Proxies to Channel.Text_L1 and Channel.SetText1() ``` **Methods:** ```csharp public int CompareTo(CustomChannel other) ``` - Implements `IComparable`. Returns 0 if channels are equal, otherwise performs ordinal string comparison on `Text1` properties. #### `CustomChannelList` Class A thread-safe singleton collection manager for `CustomChannel` instances. **Singleton Access:** ```csharp public static CustomChannelList List { get; } ``` - Thread-safe lazy initialization using lock pattern on `LockObject`. **Methods:** ```csharp public void ReloadAll() ``` - Clears the cached channel list, refreshes all data from `IsoDb`, and repopulates the channel collection. ```csharp public void DeleteAll() ``` - Clears all cached channels and deletes SQL records via `IsoDb.DeleteSQL()`. **Properties:** ```csharp public ISO13499FileDb IsoDb { get; } ``` - Lazy-initialized `ISO13499FileDb` instance with auto-refresh on first access. --- ### TestGraph.cs #### `TestGraph` Class Manages graph configuration including channels, thresholds, and axis domains. **Constructor:** ```csharp public TestGraph(TestTemplate template) ``` - Initializes groups and added groups from the provided template. **Constants:** ```csharp private const int MAX_CHANNELS_PER_GRAPH = 8; private const string SEPARATOR = "§"; ``` **Properties:** ```csharp public string GraphName { get; set; } = ""; public string GraphDescription { get; set; } = ""; public bool UseDomainMin { get; set; } public double DomainMin { get; set; } = double.MinValue; public bool UseDomainMax { get; set; } public double DomainMax { get; set; } = double.MaxValue; public bool UseRangeMin { get; set; } public double RangeMin { get; set; } = double.MinValue; public bool UseRangeMax { get; set; } public double RangeMax { get; set; } = double.MaxValue; public TestObjectChannel[] AvailableChannels { get; } ``` **Methods:** ```csharp public void SetThresholdsFromSQL(string sThresholds) ``` - Parses a string containing threshold values separated by `§` with `{` and `}` delimiters. Parses tokens as doubles and adds to internal `_thresholds` list. ```csharp public void SetChannelsFromSQL(string sChannels) ``` - Parses a string containing channel graph IDs separated by `§` with `{`, `}`, `(`, and `)` delimiters. Looks up channels by graph ID and adds them via `AddChannel()`. --- ### SerializedSettings.cs #### `SerializedSettings` Class (Sealed) Provides typed access to application-wide settings stored in `SettingsDB`. **Nested Enums:** ```csharp public enum Keys { /* 100+ setting keys including IgnorePowerMode, UseUserCodes, etc. */ } public enum ISOSupportLevels { ISO_ONLY, TRANSITORY, NO_ISO } ``` **Properties:** ```csharp public static string ExportINIFile { get; set; } public static IsoChannelSensorCompatibilityLevels IsoChannelSensorCompatibilityLevel { get; set; } public static ISOSupportLevels ISOSupportLevel { get; set; } public static bool TestSetupDefaultDontAllowOutOfCalSensors { get; set; } public static SensorTypeToDimension[] AllSensorTypeToDimensions { get; set; } ``` **Methods:** ```csharp public static Dictionary GetAllSensorTypeToDimensionMappings() ``` - Returns a dictionary mapping sensor type codes to ISO physical dimensions. #### `SerializedSettings.SensorTypeToDimension` Class Nested class extending `Tuple` representing sensor type mappings. **Constructor:** ```csharp public SensorTypeToDimension(string sensorType, string name, string dimension) ``` **Properties:** ```csharp public string Code => Item1; // Sensor type code public string Name => Item2; // Sensor type name public string Dimension => Item3; // ISO physical dimension ``` --- ### DbImporter.cs #### `DbImporter` Class Handles XML-based database import and schema migrations. **Constructors:** ```csharp public DbImporter() public DbImporter(int dbType, string dbName, string server, bool useNTLMAuthentication, string localDbUser, string localDbPassword) ``` - Parameterized constructor configures `DbOperations` for local (`dbType=1`) or centralized database connections. **Nested Types:** ```csharp public enum TopLevelFields { CustomerDetails, TestEngineerDetails, LabDetails, DASList, SensorModels, Sensors, Calibrations, CustomDirections, CustomFilterClasses, CustomTestObjects, CustomFinLoc1s, CustomFinLoc2s, CustomFinLoc3s, CustomMainLocs, CustomPhysicalDimensions, CustomPositions, CustomChannels, GroupTemplates, Groups, TestSetups, Users, GlobalSettings } public delegate void SetStatusDelegate(string status, bool output = false); ``` **Methods:** ```csharp public void ImportXML(string ImportFile, SetStatusDelegate SetStatus) ``` - Imports an XML file into the database. Clears all tables via `ImportSensorsImportControl.ClearAllTables(true)`, then processes each XML element type through `ImportTestSetup.ProcessRootNode()`. Post-import, calls `AssignSettingsToAllUsers()`, `MigrateG5ChannelSupportedBridges()`, and `MigrateSPSChannelSupportedBridges()`. ```csharp public bool MigrateG5ChannelSupportedBridges() ``` - Updates `DASChannels.SupportedBridges` from 12 to 140 for DAS Type=12 (TDAS G5 VDS). Addresses issue #12431 for 1.4 to 1.10 migrations. ```csharp public void MigrateSPSChannelSupportedBridges() ``` - Updates `DASChannels.SupportedBridges` from 15 to 143 for DAS Type=19 with ProtocolVersion >= 154. Addresses issue #12850 for SPS channel count mismatch. ```csharp public bool IsServerConnected() ``` - Returns result of `DbOperations.IsServerConnected()`. --- ## Invariants 1. **CustomChannelList Singleton**: The `List` property always returns the same instance; `_list` is only created once under lock. 2. **Channel Uniqueness**: In `CustomChannelList.PopulateChannelsIfNecessary()`, channels are keyed by ISO code; duplicate ISO codes are silently skipped via `if (_dictChannels.ContainsKey(iso)) continue;`. 3. **Max Channels Per Graph**: `TestGraph` enforces `MAX_CHANNELS_PER_GRAPH = 8`. When `_channels.Count >= MAX_CHANNELS_PER_GRAPH`, `AvailableChannels` returns an empty array. 4. **Sensor Type Mapping Default Count**: `AllSensorTypeToDimensions` defaults to 7 mappings if `NUM_SENSORTYPE_MAPPINGS` is not set or unparseable. 5. **ISO Support Level Default**: `ISOSupportLevel` defaults to `ISOSupportLevels.ISO_ONLY` if parsing fails. 6. **Thread Safety**: `CustomChannelList` uses `LockObject` for all state mutations (`ReloadAll`, `DeleteAll`, `PopulateChannelsIfNecessary`). --- ## Dependencies ### Imports (This module depends on): - `System`, `System.Collections.Generic`, `System.Linq` - `System.Windows` (CustomChannel.cs - `Application.Current` cast to `App`) - `System.Data`, `System.Data.SqlClient` (DbImporter.cs) - `System.Xml` (DbImporter.cs) - `System.Text` (DbImporter.cs) ### External Types Referenced (not defined in source): - `MMEPossibleChannels`, `MMETestObjects`, `MMEPositions`, `MMETransducerMainLocation`, `MMEFineLocations1/2/3`, `MMEPhysicalDimensions`, `MMEDirections`, `MMEFilterClasses` - `ISO13499FileDb`, `ISO13499FileDb.ExpiredISOFieldException` - `ISO.IsoCode` - `App` (WPF application class) - `TestObjectChannel`, `TestTestObject`, `TestTemplate`, `TestObjectTemplate` - `SensorsCollection.SensorsList` - `SettingsDB` - `DbOperations`, `DbOperations.Connection`, `DbOperationsEnum` - `ImportSensorsImportControl`, `ImportTestSetup` - `IsoChannelSensorCompatibilityLevels` (enum) ### Likely Dependents (inferred): - Test configuration modules (using `TestGraph`, `CustomChannel`) - Database migration tools (using `DbImporter`) - Settings management UI (using `SerializedSettings`) --- ## Gotchas 1. **Expired ISO Field Exceptions Silently Collected**: In `CustomChannel` constructor, `ExpiredISOFieldException` for main location lookup is caught and added to `_expiredErrors` list, but this list is never exposed or used elsewhere in the provided source. The exception is effectively swallowed. 2. **Commented-Out Base Class Inheritance**: Both `CustomChannel` and `CustomChannelList` have commented-out inheritance from `BasePropertyChanged`, suggesting a refactoring or removal of change notification infrastructure. `TestGraph` similarly has this pattern. 3. **Hardcoded Default Sensor Mappings**: `GetSensorTypeMapping(int index)` contains hardcoded default mappings for indices 0-6 (Acceleration, Force, Momentum, Displacement, Angular Acceleration, Angle, Voltage). Index 7+ returns empty strings. 4. **Magic Character in Sensor Mapping Serialization**: `SetSensorTypeMapping` uses `(char)149` as a delimiter, which is the "bullet" character (•). This could cause encoding issues. 5. **G5/SPS Migration Hardcoded Values**: `MigrateG5ChannelSupportedBridges()` and `MigrateSPSChannelSupportedBridges()` use hardcoded magic numbers (140, 143, 154) without constants, tied to specific bug IDs (#12431, #12850). 6. **AvailableChannels Clears Lookup on Every Access**: The `AvailableChannels` getter calls `_lookup.Clear()` at the start, which may have side effects if `_lookup` is used elsewhere between accesses. 7. **Squib Channel Mutation Side Effect**: In `AddChannels()`, when handling voltage channels for squib sensors, the original `channel` object has its `SquibChannelType` and `NameOfTheChannel` modified before being added to the list, while current channels create a new instance. 8. **Exception Re-throw Loses Stack Trace**: In `ImportXML()`, `throw ex;` re-throws the caught exception, losing the original stack trace. Should be `throw;`. 9. **Empty Catch Blocks**: `AssignSettingsToAllUsers()` and `SetUserProperty()` have empty catch blocks, silently swallowing exceptions.