//****************************************************************************************************** // 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 } }