265 lines
11 KiB
Markdown
265 lines
11 KiB
Markdown
|
|
---
|
||
|
|
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<CustomChannel>`. 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<string, string> GetAllSensorTypeToDimensionMappings()
|
||
|
|
```
|
||
|
|
- Returns a dictionary mapping sensor type codes to ISO physical dimensions.
|
||
|
|
|
||
|
|
#### `SerializedSettings.SensorTypeToDimension` Class
|
||
|
|
Nested class extending `Tuple<string, string, string>` 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.
|