//******************************************************************************************************
// MetadataUpdater.cs - Gbtc
//
// Copyright © 2012, Grid Protection Alliance. All Rights Reserved.
//
// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
// the NOTICE file distributed with this work for additional information regarding copyright ownership.
// The GPA licenses this file to you under the MIT License (MIT), the "License"; you may
// not use this file except in compliance with the License. You may obtain a copy of the License at:
//
// http://www.opensource.org/licenses/MIT
//
// Unless agreed to in writing, the subject software distributed under the License is distributed on an
// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
// License for the specific language governing permissions and limitations.
//
// Code Modification History:
// ----------------------------------------------------------------------------------------------------
// 08/07/2009 - Pinal C. Patel
// Generated original version of source code.
// 08/21/2009 - Pinal C. Patel
// Removed ExtractMetadata() method as this can be achived using Serialization.Serialize() method.
// Modified UpdateMetadata() overload for processing web service data to use Serialization class.
// 09/15/2009 - Stephen C. Wills
// Added new header and license agreement.
// 09/16/2009 - Pinal C. Patel
// Modified UpdateMetadata() overloads to save the metadata file upon update.
// 12/18/2009 - Pinal C. Patel
// Updated UpdateMetadata() overloads to check for DBNull values.
// 10/11/2010 - Mihir Brahmbhatt
// Updated header and license agreement.
// 12/14/2012 - Starlynn Danyelle Gilliam
// Modified Header.
//
//******************************************************************************************************
using System;
using System.Data;
using System.IO;
using GSF.Historian.DataServices;
using GSF.Historian.Files;
namespace GSF.Historian.MetadataProviders
{
///
/// A class that can update data in a .
///
///
public class MetadataUpdater
{
#region [ Members ]
// Fields
private readonly MetadataFile m_metadata;
#endregion
#region [ Constructors ]
///
/// Initializes a new instance of the class.
///
/// that is to be updated.
/// is null
public MetadataUpdater(MetadataFile metadata)
{
m_metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
}
#endregion
#region [ Properties ]
///
/// Gets the to be updated.
///
public MetadataFile Metadata => m_metadata;
#endregion
#region [ Methods ]
///
/// Updates the from
///
/// containing the new metadata.
/// is null.
/// does not contain 43 columns.
public void UpdateMetadata(DataTable tableData)
{
if (tableData is null)
throw new ArgumentNullException(nameof(tableData));
if (tableData.Rows[0].ItemArray.Length != 43)
throw new ArgumentException("tableData must contain 43 columns");
// Column 00: HistorianID
// Column 01: DataType
// Column 02: Name
// Column 03: Synonym1
// Column 04: Synonym2
// Column 05: Synonym3
// Column 06: Description
// Column 07: HardwareInfo
// Column 08: Remarks
// Column 09: PlantCode
// Column 10: UnitNumber
// Column 11: SystemName
// Column 12: SourceID
// Column 13: Enabled
// Column 14: ScanRate
// Column 15: CompressionMinTime
// Column 16: CompressionMaxTime
// Column 17: EngineeringUnits
// Column 18: LowWarning
// Column 19: HighWarning
// Column 20: LowAlarm
// Column 21: HighAlarm
// Column 22: LowRange
// Column 23: HighRange
// Column 24: CompressionLimit
// Column 25: ExceptionLimit
// Column 26: DisplayDigits
// Column 27: SetDescription
// Column 28: ClearDescription
// Column 29: AlarmState
// Column 30: ChangeSecurity
// Column 31: AccessSecurity
// Column 32: StepCheck
// Column 33: AlarmEnabled
// Column 34: AlarmFlags
// Column 35: AlarmDelay
// Column 36: AlarmToFile
// Column 37: AlarmByEmail
// Column 38: AlarmByPager
// Column 39: AlarmByPhone
// Column 40: AlarmEmails
// Column 41: AlarmPagers
// Column 42: AlarmPhones
MetadataRecord newMetadataRecord;
foreach (MetadataRecord existingMetadataRecord in m_metadata.Read())
existingMetadataRecord.GeneralFlags.Enabled = false;
foreach (DataRow row in tableData.Rows)
{
newMetadataRecord = new MetadataRecord(Convert.ToInt32(row[0]), MetadataFileLegacyMode.Enabled);
if (!Convert.IsDBNull(row[1]))
newMetadataRecord.GeneralFlags.DataType = (DataType)Convert.ToInt32(row[1]);
if (!Convert.IsDBNull(row[2]))
newMetadataRecord.Name = Convert.ToString(row[2]);
if (!Convert.IsDBNull(row[3]))
newMetadataRecord.Synonym1 = Convert.ToString(row[3]);
if (!Convert.IsDBNull(row[4]))
newMetadataRecord.Synonym2 = Convert.ToString(row[4]);
if (!Convert.IsDBNull(row[5]))
newMetadataRecord.Synonym3 = Convert.ToString(row[5]);
if (!Convert.IsDBNull(row[6]))
newMetadataRecord.Description = Convert.ToString(row[6]);
if (!Convert.IsDBNull(row[7]))
newMetadataRecord.HardwareInfo = Convert.ToString(row[7]);
if (!Convert.IsDBNull(row[8]))
newMetadataRecord.Remarks = Convert.ToString(row[8]);
if (!Convert.IsDBNull(row[9]))
newMetadataRecord.PlantCode = Convert.ToString(row[9]);
if (!Convert.IsDBNull(row[10]))
newMetadataRecord.UnitNumber = Convert.ToInt32(row[10]);
if (!Convert.IsDBNull(row[11]))
newMetadataRecord.SystemName = Convert.ToString(row[11]);
if (!Convert.IsDBNull(row[12]))
newMetadataRecord.SourceID = Convert.ToInt32(row[12]);
if (!Convert.IsDBNull(row[13]))
newMetadataRecord.GeneralFlags.Enabled = Convert.ToBoolean(row[13]);
if (!Convert.IsDBNull(row[14]))
newMetadataRecord.ScanRate = Convert.ToSingle(row[14]);
if (!Convert.IsDBNull(row[15]))
newMetadataRecord.CompressionMinTime = Convert.ToInt32(row[15]);
if (!Convert.IsDBNull(row[16]))
newMetadataRecord.CompressionMaxTime = Convert.ToInt32(row[16]);
if (!Convert.IsDBNull(row[30]))
newMetadataRecord.SecurityFlags.ChangeSecurity = Convert.ToInt32(row[30]);
if (!Convert.IsDBNull(row[31]))
newMetadataRecord.SecurityFlags.AccessSecurity = Convert.ToInt32(row[31]);
if (!Convert.IsDBNull(row[32]))
newMetadataRecord.GeneralFlags.StepCheck = Convert.ToBoolean(row[32]);
if (!Convert.IsDBNull(row[33]))
newMetadataRecord.GeneralFlags.AlarmEnabled = Convert.ToBoolean(row[33]);
if (!Convert.IsDBNull(row[34]))
newMetadataRecord.AlarmFlags.Value = Convert.ToInt32(row[34]);
if (!Convert.IsDBNull(row[36]))
newMetadataRecord.GeneralFlags.AlarmToFile = Convert.ToBoolean(row[36]);
if (!Convert.IsDBNull(row[37]))
newMetadataRecord.GeneralFlags.AlarmByEmail = Convert.ToBoolean(row[37]);
if (!Convert.IsDBNull(row[38]))
newMetadataRecord.GeneralFlags.AlarmByPager = Convert.ToBoolean(row[38]);
if (!Convert.IsDBNull(row[39]))
newMetadataRecord.GeneralFlags.AlarmByPhone = Convert.ToBoolean(row[39]);
if (!Convert.IsDBNull(row[40]))
newMetadataRecord.AlarmEmails = Convert.ToString(row[40]);
if (!Convert.IsDBNull(row[41]))
newMetadataRecord.AlarmPagers = Convert.ToString(row[41]);
if (!Convert.IsDBNull(row[42]))
newMetadataRecord.AlarmPhones = Convert.ToString(row[42]);
if (newMetadataRecord.GeneralFlags.DataType == DataType.Analog)
{
if (!Convert.IsDBNull(row[17]))
newMetadataRecord.AnalogFields.EngineeringUnits = Convert.ToString(row[17]);
if (!Convert.IsDBNull(row[18]))
newMetadataRecord.AnalogFields.LowWarning = Convert.ToSingle(row[18]);
if (!Convert.IsDBNull(row[19]))
newMetadataRecord.AnalogFields.HighWarning = Convert.ToSingle(row[19]);
if (!Convert.IsDBNull(row[20]))
newMetadataRecord.AnalogFields.LowAlarm = Convert.ToSingle(row[20]);
if (!Convert.IsDBNull(row[21]))
newMetadataRecord.AnalogFields.HighAlarm = Convert.ToSingle(row[21]);
if (!Convert.IsDBNull(row[22]))
newMetadataRecord.AnalogFields.LowRange = Convert.ToSingle(row[22]);
if (!Convert.IsDBNull(row[23]))
newMetadataRecord.AnalogFields.HighRange = Convert.ToSingle(row[23]);
if (!Convert.IsDBNull(row[24]))
newMetadataRecord.AnalogFields.CompressionLimit = Convert.ToSingle(row[24]);
if (!Convert.IsDBNull(row[25]))
newMetadataRecord.AnalogFields.ExceptionLimit = Convert.ToSingle(row[25]);
if (!Convert.IsDBNull(row[26]))
newMetadataRecord.AnalogFields.DisplayDigits = Convert.ToInt32(row[26]);
if (!Convert.IsDBNull(row[35]))
newMetadataRecord.AnalogFields.AlarmDelay = Convert.ToSingle(row[35]);
}
else if (newMetadataRecord.GeneralFlags.DataType == DataType.Digital)
{
if (!Convert.IsDBNull(row[27]))
newMetadataRecord.DigitalFields.SetDescription = Convert.ToString(row[27]);
if (!Convert.IsDBNull(row[28]))
newMetadataRecord.DigitalFields.ClearDescription = Convert.ToString(row[28]);
if (!Convert.IsDBNull(row[29]))
newMetadataRecord.DigitalFields.AlarmState = Convert.ToInt32(row[29]);
if (!Convert.IsDBNull(row[35]))
newMetadataRecord.DigitalFields.AlarmDelay = Convert.ToSingle(row[35]);
}
m_metadata.Write(newMetadataRecord.HistorianID, newMetadataRecord);
}
m_metadata.Save();
}
///
/// Updates the from
///
/// providing the new metadata.
/// is null.
/// does not contain 43 columns.
public void UpdateMetadata(IDataReader readerData)
{
if (readerData is null)
throw new ArgumentNullException(nameof(readerData));
if (readerData.FieldCount != 43)
throw new ArgumentException("readerData must contain 43 columns");
foreach (MetadataRecord existingMetadataRecord in m_metadata.Read())
existingMetadataRecord.GeneralFlags.Enabled = false;
while (readerData.Read())
{
MetadataRecord newMetadataRecord = new MetadataRecord(Convert.ToInt32(readerData[0]), m_metadata.LegacyMode);
if (!Convert.IsDBNull(readerData[1]))
newMetadataRecord.GeneralFlags.DataType = (DataType)Convert.ToInt32(readerData[1]);
if (!Convert.IsDBNull(readerData[2]))
newMetadataRecord.Name = Convert.ToString(readerData[2]);
if (!Convert.IsDBNull(readerData[3]))
newMetadataRecord.Synonym1 = Convert.ToString(readerData[3]);
if (!Convert.IsDBNull(readerData[4]))
newMetadataRecord.Synonym2 = Convert.ToString(readerData[4]);
if (!Convert.IsDBNull(readerData[5]))
newMetadataRecord.Synonym3 = Convert.ToString(readerData[5]);
if (!Convert.IsDBNull(readerData[6]))
newMetadataRecord.Description = Convert.ToString(readerData[6]);
if (!Convert.IsDBNull(readerData[7]))
newMetadataRecord.HardwareInfo = Convert.ToString(readerData[7]);
if (!Convert.IsDBNull(readerData[8]))
newMetadataRecord.Remarks = Convert.ToString(readerData[8]);
if (!Convert.IsDBNull(readerData[9]))
newMetadataRecord.PlantCode = Convert.ToString(readerData[9]);
if (!Convert.IsDBNull(readerData[10]))
newMetadataRecord.UnitNumber = Convert.ToInt32(readerData[10]);
if (!Convert.IsDBNull(readerData[11]))
newMetadataRecord.SystemName = Convert.ToString(readerData[11]);
if (!Convert.IsDBNull(readerData[12]))
newMetadataRecord.SourceID = Convert.ToInt32(readerData[12]);
if (!Convert.IsDBNull(readerData[13]))
newMetadataRecord.GeneralFlags.Enabled = Convert.ToBoolean(readerData[13]);
if (!Convert.IsDBNull(readerData[14]))
newMetadataRecord.ScanRate = Convert.ToSingle(readerData[14]);
if (!Convert.IsDBNull(readerData[15]))
newMetadataRecord.CompressionMinTime = Convert.ToInt32(readerData[15]);
if (!Convert.IsDBNull(readerData[16]))
newMetadataRecord.CompressionMaxTime = Convert.ToInt32(readerData[16]);
if (!Convert.IsDBNull(readerData[30]))
newMetadataRecord.SecurityFlags.ChangeSecurity = Convert.ToInt32(readerData[30]);
if (!Convert.IsDBNull(readerData[31]))
newMetadataRecord.SecurityFlags.AccessSecurity = Convert.ToInt32(readerData[31]);
if (!Convert.IsDBNull(readerData[32]))
newMetadataRecord.GeneralFlags.StepCheck = Convert.ToBoolean(readerData[32]);
if (!Convert.IsDBNull(readerData[33]))
newMetadataRecord.GeneralFlags.AlarmEnabled = Convert.ToBoolean(readerData[33]);
if (!Convert.IsDBNull(readerData[34]))
newMetadataRecord.AlarmFlags.Value = Convert.ToInt32(readerData[34]);
if (!Convert.IsDBNull(readerData[36]))
newMetadataRecord.GeneralFlags.AlarmToFile = Convert.ToBoolean(readerData[36]);
if (!Convert.IsDBNull(readerData[37]))
newMetadataRecord.GeneralFlags.AlarmByEmail = Convert.ToBoolean(readerData[37]);
if (!Convert.IsDBNull(readerData[38]))
newMetadataRecord.GeneralFlags.AlarmByPager = Convert.ToBoolean(readerData[38]);
if (!Convert.IsDBNull(readerData[39]))
newMetadataRecord.GeneralFlags.AlarmByPhone = Convert.ToBoolean(readerData[39]);
if (!Convert.IsDBNull(readerData[40]))
newMetadataRecord.AlarmEmails = Convert.ToString(readerData[40]);
if (!Convert.IsDBNull(readerData[41]))
newMetadataRecord.AlarmPagers = Convert.ToString(readerData[41]);
if (!Convert.IsDBNull(readerData[42]))
newMetadataRecord.AlarmPhones = Convert.ToString(readerData[42]);
if (newMetadataRecord.GeneralFlags.DataType == DataType.Analog)
{
if (!Convert.IsDBNull(readerData[17]))
newMetadataRecord.AnalogFields.EngineeringUnits = Convert.ToString(readerData[17]);
if (!Convert.IsDBNull(readerData[18]))
newMetadataRecord.AnalogFields.LowWarning = Convert.ToSingle(readerData[18]);
if (!Convert.IsDBNull(readerData[19]))
newMetadataRecord.AnalogFields.HighWarning = Convert.ToSingle(readerData[19]);
if (!Convert.IsDBNull(readerData[20]))
newMetadataRecord.AnalogFields.LowAlarm = Convert.ToSingle(readerData[20]);
if (!Convert.IsDBNull(readerData[21]))
newMetadataRecord.AnalogFields.HighAlarm = Convert.ToSingle(readerData[21]);
if (!Convert.IsDBNull(readerData[22]))
newMetadataRecord.AnalogFields.LowRange = Convert.ToSingle(readerData[22]);
if (!Convert.IsDBNull(readerData[23]))
newMetadataRecord.AnalogFields.HighRange = Convert.ToSingle(readerData[23]);
if (!Convert.IsDBNull(readerData[24]))
newMetadataRecord.AnalogFields.CompressionLimit = Convert.ToSingle(readerData[24]);
if (!Convert.IsDBNull(readerData[25]))
newMetadataRecord.AnalogFields.ExceptionLimit = Convert.ToSingle(readerData[25]);
if (!Convert.IsDBNull(readerData[26]))
newMetadataRecord.AnalogFields.DisplayDigits = Convert.ToInt32(readerData[26]);
if (!Convert.IsDBNull(readerData[35]))
newMetadataRecord.AnalogFields.AlarmDelay = Convert.ToSingle(readerData[35]);
}
else if (newMetadataRecord.GeneralFlags.DataType == DataType.Digital)
{
if (!Convert.IsDBNull(readerData[27]))
newMetadataRecord.DigitalFields.SetDescription = Convert.ToString(readerData[27]);
if (!Convert.IsDBNull(readerData[28]))
newMetadataRecord.DigitalFields.ClearDescription = Convert.ToString(readerData[28]);
if (!Convert.IsDBNull(readerData[29]))
newMetadataRecord.DigitalFields.AlarmState = Convert.ToInt32(readerData[29]);
if (!Convert.IsDBNull(readerData[35]))
newMetadataRecord.DigitalFields.AlarmDelay = Convert.ToSingle(readerData[35]);
}
m_metadata.Write(newMetadataRecord.HistorianID, newMetadataRecord);
}
m_metadata.Save();
}
///
/// Updates the from
///
/// containing serialized .
/// in which the was serialized to .
public void UpdateMetadata(Stream streamData, SerializationFormat dataFormat)
{
// Deserialize serialized metadata.
SerializableMetadata deserializedMetadata = Serialization.Deserialize(streamData, dataFormat);
// Update metadata from the deserialized metadata.
foreach (SerializableMetadataRecord deserializedMetadataRecord in deserializedMetadata.MetadataRecords)
m_metadata.Write(deserializedMetadataRecord.HistorianID, deserializedMetadataRecord.Deflate());
m_metadata.Save();
}
#endregion
}
}