feat(sql): SqlProvider/SqlTagModel enums + SqlDriverConfigDto
Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
namespace ZB.MOM.WW.OtOpcUa.Driver.Sql.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// The <c>DriverConfig</c> blob shape for a <c>Sql</c> driver instance (design §5.1). Deserialised by the
|
||||
/// driver factory, which applies the documented defaults for every absent (null) field and maps the result
|
||||
/// onto the driver's typed options.
|
||||
/// <para><b>No connection string lives here.</b> Only <see cref="ConnectionStringRef"/> — a name resolved at
|
||||
/// Initialize from the environment / secret store (e.g. <c>Sql__ConnectionStrings__MesStaging</c>) — so a
|
||||
/// deployed artifact never carries database credentials.</para>
|
||||
/// <para>Enum-valued fields are enum-typed (not strings) so a <c>JsonStringEnumConverter</c> round-trips
|
||||
/// their <em>names</em> rather than their ordinals. The converter is applied by the factory's
|
||||
/// <c>JsonSerializerOptions</c> (Task 9), not by an attribute on this DTO — mirroring the driver
|
||||
/// enum-serialization trap that bit the AdminUI driver pages.</para>
|
||||
/// </summary>
|
||||
public sealed class SqlDriverConfigDto
|
||||
{
|
||||
/// <summary>Which ADO.NET provider/dialect backs this instance. Defaults to <see cref="SqlProvider.SqlServer"/> — the only provider v1 constructs.</summary>
|
||||
public SqlProvider Provider { get; init; } = SqlProvider.SqlServer;
|
||||
|
||||
/// <summary>
|
||||
/// Name of the connection string to resolve from the environment / secret store at Initialize —
|
||||
/// <b>never</b> the connection string itself.
|
||||
/// </summary>
|
||||
public string? ConnectionStringRef { get; init; }
|
||||
|
||||
/// <summary>Poll interval applied to groups that do not carry their own. Absent ⇒ the factory default.</summary>
|
||||
public TimeSpan? DefaultPollInterval { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Per-query wall-clock deadline enforced client-side (a breach surfaces <c>BadTimeout</c>). Must be
|
||||
/// greater than <see cref="CommandTimeout"/>, which is only the server-side backstop (design §8.3).
|
||||
/// </summary>
|
||||
public TimeSpan? OperationTimeout { get; init; }
|
||||
|
||||
/// <summary>ADO.NET <c>CommandTimeout</c> backstop (seconds granularity server-side).</summary>
|
||||
public TimeSpan? CommandTimeout { get; init; }
|
||||
|
||||
/// <summary>Cap on concurrently executing group queries — the connection-pool guard.</summary>
|
||||
public int? MaxConcurrentGroups { get; init; }
|
||||
|
||||
/// <summary>When <see langword="true"/>, a NULL cell publishes Bad rather than the default Uncertain.</summary>
|
||||
public bool? NullIsBad { get; init; }
|
||||
|
||||
/// <summary>Master write kill-switch. <b>v1 is read-only</b> — writes stay disabled regardless.</summary>
|
||||
public bool? AllowWrites { get; init; }
|
||||
|
||||
/// <summary>Background connectivity-probe settings. Absent ⇒ the factory default.</summary>
|
||||
public SqlProbeDto? Probe { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>Background connectivity-probe settings inside a <see cref="SqlDriverConfigDto"/> (design §5.1).</summary>
|
||||
public sealed class SqlProbeDto
|
||||
{
|
||||
/// <summary>Whether the driver runs its background connectivity probe.</summary>
|
||||
public bool? Enabled { get; init; }
|
||||
|
||||
/// <summary>Interval between probe attempts.</summary>
|
||||
public TimeSpan? Interval { get; init; }
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
namespace ZB.MOM.WW.OtOpcUa.Driver.Sql.Contracts;
|
||||
|
||||
/// <summary>Which ADO.NET provider/dialect backs a Sql driver instance. v1 constructs only SqlServer.</summary>
|
||||
public enum SqlProvider
|
||||
{
|
||||
/// <summary>Microsoft SQL Server via <c>Microsoft.Data.SqlClient</c> — the only provider v1 constructs.</summary>
|
||||
SqlServer,
|
||||
|
||||
/// <summary>PostgreSQL (Npgsql) — reserved for P2; not constructed in v1.</summary>
|
||||
Postgres,
|
||||
|
||||
/// <summary>MySQL / MariaDB — reserved; not constructed in v1.</summary>
|
||||
MySql,
|
||||
|
||||
/// <summary>Generic ODBC — reserved for P2; not constructed in v1.</summary>
|
||||
Odbc,
|
||||
|
||||
/// <summary>Oracle — reserved; not constructed in v1.</summary>
|
||||
Oracle,
|
||||
}
|
||||
|
||||
/// <summary>Tag→value mapping model. v1 ships KeyValue + WideRow; Query is deferred (design §5.4 / P3).</summary>
|
||||
public enum SqlTagModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Key-value (EAV) table: one row per tag, selected by <c>keyColumn = keyValue</c>, value read from
|
||||
/// <c>valueColumn</c>.
|
||||
/// </summary>
|
||||
KeyValue,
|
||||
|
||||
/// <summary>
|
||||
/// Wide row: one row holds many signals as columns; the tag names its <c>columnName</c> and the row is
|
||||
/// picked by a row selector (a <c>whereColumn</c>/<c>whereValue</c> pair, or newest-by-timestamp).
|
||||
/// </summary>
|
||||
WideRow,
|
||||
|
||||
/// <summary>Named arbitrary-SELECT query (design §5.4). <b>Deferred to P3 — not accepted by v1's parser.</b></summary>
|
||||
Query,
|
||||
}
|
||||
Reference in New Issue
Block a user