11 KiB
source_files, generated_at, model, schema_version, sha256
| source_files | generated_at | model | schema_version | sha256 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
2026-04-16T04:25:29.306320+00:00 | Qwen/Qwen3-Coder-Next-FP8 | 1 | 440dcd3555714b4f |
Test Metadata Database API Module Documentation
1. Purpose
This module provides a standardized database abstraction layer for CRUD operations on three core metadata entity types—Customer, Laboratory, and Test Engineer details—within the system's database. It encapsulates direct SQL Server interactions via stored procedures (sp_*) and enforces user authentication, error handling, and connection management. The module exists to decouple business logic from low-level data access, ensuring consistent error reporting (via ulong return codes), centralized logging, and reuse of common database patterns across the application.
2. Public Interface
All interfaces reside in the DbAPI.TestMetaData namespace (e.g., ICustomerDetails, ILabratoryDetails, ITestEngineerDetails). Implementation classes (CustomerDetails, LabratoryDetails, TestEngineerDetails) are internal and implement their respective interfaces.
ICustomerDetails
-
ulong CustomerDetailsInsert(IUserDbRecord user, IConnectionDetails connection, CustomerDetailsDbRecord customerDetailsDbRecord, out int newId, out string errorString)
Inserts a new record into theCustomerDetailstable viasp_CustomerDetailsInsert. ReturnsERROR_SUCCESS(0) on success;newIdholds the generated ID.errorStringmay contain SP-level error details. -
ulong CustomerDetailsUpdate(IUserDbRecord user, IConnectionDetails connection, CustomerDetailsDbRecord customerDetailsDbRecord, out string errorString)
Updates an existingCustomerDetailsrecord viasp_CustomerDetailsUpdate. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details. -
ulong CustomerDetailsGet(IUserDbRecord user, IConnectionDetails connection, string name, out ICustomerDetailsDbRecord[] customerDetailsDbRecords)
Retrieves allCustomerDetailsrecords matching thenamefilter viasp_CustomerDetailsGet. ReturnsERROR_SUCCESSon success;customerDetailsDbRecordsis an array of valid (non-IsInvalidBlank()) records, ornullif none found. -
ulong CustomerDetailsDelete(IUserDbRecord user, IConnectionDetails connection, string name, out string errorString)
DeletesCustomerDetailsrecords matchingnameviasp_CustomerDetailsDelete. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details.
ILabratoryDetails
-
ulong LabratoryDetailsInsert(IUserDbRecord user, IConnectionDetails connection, LabratoryDetailsDbRecord labratoryDetailsDbRecord, out int newId, out string errorString)
Inserts a newLabratoryDetailsrecord viasp_LabratoryDetailsInsert. ReturnsERROR_SUCCESSon success;newIdholds the generated ID.errorStringmay contain SP-level error details. -
ulong LabratoryDetailsUpdate(IUserDbRecord user, IConnectionDetails connection, LabratoryDetailsDbRecord labratoryDetailsDbRecord, out string errorString)
Updates an existingLabratoryDetailsrecord viasp_LabratoryDetailsUpdate. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details. -
ulong LabratoryDetailsUpdateInsert(IUserDbRecord user, IConnectionDetails connection, LabratoryDetailsDbRecord labratoryDetailsDbRecord, out string errorString)
Performs an upsert (update or insert) onLabratoryDetailsviasp_LabratoryDetailsUpdateInsert. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details. Note: NonewIdoutput is provided for this operation. -
ulong LabratoryDetailsGet(IUserDbRecord user, IConnectionDetails connection, string name, out ILabratoryDetailsDbRecord[] labratoryDetailsDbRecords)
RetrievesLabratoryDetailsrecords matchingnameviasp_LabratoryDetailsGet. ReturnsERROR_SUCCESSon success;labratoryDetailsDbRecordsis an array of valid records, ornullif none found. -
ulong LabratoryDetailsDelete(IUserDbRecord user, IConnectionDetails connection, string name, out string errorString)
DeletesLabratoryDetailsrecords matchingnameviasp_LabratoryDetailsDelete. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details.
ITestEngineerDetails
-
ulong TestEngineerDetailsInsert(IUserDbRecord user, IConnectionDetails connection, TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out int newId, out string errorString)
Inserts a newTestEngineerDetailsrecord viasp_TestEngineerDetailsInsert. ReturnsERROR_SUCCESSon success;newIdholds the generated ID.errorStringmay contain SP-level error details. -
ulong TestEngineerDetailsUpdate(IUserDbRecord user, IConnectionDetails connection, TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out string errorString)
Updates an existingTestEngineerDetailsrecord viasp_TestEngineerDetailsUpdate. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details. -
ulong TestEngineerDetailsUpdateInsert(IUserDbRecord user, IConnectionDetails connection, TestEngineerDetailsDbRecord testEngineerDetailsDbRecord, out string errorString)
Performs an upsert onTestEngineerDetailsviasp_TestEngineerDetailsUpdateInsert. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details. Note: NonewIdoutput is provided for this operation. -
ulong TestEngineerDetailsGet(IUserDbRecord user, IConnectionDetails connection, string name, out ITestEngineerDetailsDbRecord[] testEngineerDetailsDbRecords)
RetrievesTestEngineerDetailsrecords matchingnameviasp_TestEngineerDetailsGet. ReturnsERROR_SUCCESSon success;testEngineerDetailsDbRecordsis an array of valid records, ornullif none found. -
ulong TestEngineerDetailsDelete(IUserDbRecord user, IConnectionDetails connection, string name, out string errorString)
DeletesTestEngineerDetailsrecords matchingnameviasp_TestEngineerDetailsDelete. ReturnsERROR_SUCCESSon success.errorStringmay contain SP-level error details.
3. Invariants
- User Authentication: All public methods first verify user login via
DbAPI.Connections.IsUserLoggedIn(user, connection). If false, they returnErrorCodes.ERROR_ACCESS_DENIEDwithout executing any DB operation. - Connection Management: All methods use
ConnectionManager.GetSqlCommand(...)to obtain aSqlCommand. The underlying connection is disposed infinallyblocks after execution. - Error Reporting:
- Return value is a
ulongerror code (0 =ERROR_SUCCESS). - SP-level errors are captured via
@errorNumber(output) and@errorMessage(output) parameters. - If SP reports an error (
@errorNumber != 0), the return value is set to@errorNumber(cast toulong). - Exceptions during execution are caught, logged (via
LogManager.Log), and concatenated into theerrorStringoutput (format:"{exception message}; {SP error string}").
- Return value is a
- Record Validation:
Getmethods filter out records whereIsInvalidBlank()returnstrue. - Stored Procedure Naming: Each operation maps to a specific stored procedure:
- Insert →
sp_*Insert - Update →
sp_*Update - Upsert →
sp_*UpdateInsert - Get →
sp_*Get - Delete →
sp_*Delete
- Insert →
- Parameter Consistency: All insert/update/upsert operations pass the same set of fields (e.g.,
@Name,@LastModified,@Version = 1) to their respective stored procedures.
4. Dependencies
Module Dependencies (Imports/Usings):
- Core Infrastructure:
DbAPI.Connections(IUserDbRecord,IConnectionDetails,IsUserLoggedIn,ConnectionManager)DbAPI.Errors(ErrorCodes, e.g.,ERROR_ACCESS_DENIED,ERROR_SUCCESS,ERROR_UNKNOWN)DbAPI.Logging(LogManager,TraceEventType,LogEvents.DataRecorders)
- Data Models:
DTS.Common.Interface.Database(IUserDbRecord,IConnectionDetails)DTS.Common.Interface.TestMetaData(ICustomerDetailsDbRecord,ILabratoryDetailsDbRecord,ITestEngineerDetailsDbRecord)DTS.Common.Classes.*(concrete record types:CustomerDetailsDbRecord,LabratoryDetailsDbRecord,TestEngineerDetailsDbRecord)
- System:
System.Data,System.Data.SqlClient,System.Diagnostics,System.Collections.Generic
Module Dependents:
- This module is consumed by higher-level components that require test metadata management (e.g., UI layers, test orchestration services).
- The interfaces (
ICustomerDetails, etc.) are likely consumed via dependency injection or factory patterns (not visible in source, but implied by interface design).
5. Gotchas
- Typo in Namespace/Class Names: The module consistently uses
Labratory(misspelled) instead ofLaboratory(e.g.,ILabratoryDetails,LabratoryDetailsDbRecord). This is preserved in the source and must be respected to avoid mismatches with database objects. - Inconsistent Parameter Usage in Delete:
CustomerDetailsDeletepasses@Namewithnullifnameis empty.TestEngineerDetailsDeletepasses@NamewithDBNull.Valueifnameis empty.LabratoryDetailsDeletepasses@LabratoryName(not@Name) withDBNull.Valueifnameis empty.
This suggests stored procedure parameter names may differ across entities—verify SP signatures.
- Missing
@LocalOnlyinTestEngineerDetailsUpdate: TheTestEngineerDetailsUpdatemethod has a commented-out line for@LocalOnly. This may be intentional (e.g., field not updatable) or accidental tech debt. - No Upsert Returns New ID:
UpdateInsertmethods forLabratoryDetailsandTestEngineerDetailsdo not output the new ID (unlikeInsert), even though the SPs define@new_id. This is inconsistent and may require future correction. - Error String Handling:
errorStringis only populated forInsert,Update, andDeletemethods when SP reports an error or an exception occurs.Getmethods do not populateerrorString—errors are logged andERROR_UNKNOWNis returned. - Null/Empty Name Handling:
GetandDeletemethods acceptnameas a filter.Deletemethods handle emptynamedifferently per entity (see above), butGetpassesnamedirectly to the SP (including empty string), which may have unintended behavior if SP does not guard against it. - No Concurrency Control: No versioning or timestamp checks are visible in the client-side code (though
@Version = 1is passed to SPs). Concurrency handling is entirely delegated to stored procedures.