using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using ZB.MOM.WW.OtOpcUa.Core.Abstractions; using ZB.MOM.WW.OtOpcUa.Core.AlarmHistorian; using ZB.MOM.WW.OtOpcUa.Runtime.Historian; namespace ZB.MOM.WW.OtOpcUa.Driver.Historian.SqlServer; /// /// for the SQL Server historian. Supports every /// and HistoryUpdate. All seams share ONE connection helper, ONE schema /// bootstrapper and ONE tag catalog, so the schema is ensured once and tag ids are cached once. /// public sealed class SqlServerHistorianProvider : IHistorianBackendProvider { private static readonly IReadOnlySet Kinds = new HashSet(Enum.GetValues()); private readonly SqlHistorianConnection _conn; private readonly SqlServerSchemaBootstrapper _bootstrap; private readonly SqlServerTagCatalog _catalog; /// Creates the provider over validated options. /// The ServerHistorian:SqlServer options. public SqlServerHistorianProvider(SqlServerHistorianOptions options) { ArgumentNullException.ThrowIfNull(options); _conn = new SqlHistorianConnection(options); _bootstrap = new SqlServerSchemaBootstrapper(_conn, options); _catalog = new SqlServerTagCatalog(_conn, _bootstrap); } /// public string Name => "SqlServer"; /// public IReadOnlySet SupportedKinds => Kinds; private static ILogger Log(IServiceProvider sp) => ((sp.GetService(typeof(ILoggerFactory)) as ILoggerFactory) ?? NullLoggerFactory.Instance).CreateLogger(); /// public IHistorianDataSource CreateDataSource(IServiceProvider sp) => new SqlServerHistorianDataSource(_conn, _bootstrap, _catalog, Log(sp)); /// public IHistorianValueWriter CreateValueWriter(IServiceProvider sp) => new SqlServerHistorianValueWriter(_conn, _bootstrap, _catalog, Log(sp)); /// public IAlarmHistorianWriter CreateAlarmWriter(IServiceProvider sp) => new SqlServerAlarmHistorianWriter(_conn, _bootstrap, Log(sp)); /// public IHistorianProvisioning CreateProvisioning(IServiceProvider sp) => new SqlServerTagProvisioner(_conn, _bootstrap, Log(sp)); /// public IHistorianDataUpdater? CreateUpdater(IServiceProvider sp) => new SqlServerHistorianDataUpdater(_conn, _catalog); }