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);
}