Represents a record in the MetadataFile that contains the various attributes associates to a HistorianID.
Inheritance: ISupportBinaryImage, IComparable
Exemple #1
0
 public Metadata(MetadataRecord metadata)
 {
     MetadataRecord = metadata;
     Instance = metadata.PlantCode;
     PointID = metadata.HistorianID;
     PointName = metadata.Name;
     PointDescription = metadata.Description;
 }
Exemple #2
0
        /// <summary>
        /// Compares the current <see cref="MetadataRecord"/> object to <paramref name="obj"/>.
        /// </summary>
        /// <param name="obj">Object against which the current <see cref="MetadataRecord"/> object is to be compared.</param>
        /// <returns>
        /// Negative value if the current <see cref="MetadataRecord"/> object is less than <paramref name="obj"/>,
        /// Zero if the current <see cref="MetadataRecord"/> object is equal to <paramref name="obj"/>,
        /// Positive value if the current <see cref="MetadataRecord"/> object is greater than <paramref name="obj"/>.
        /// </returns>
        public virtual int CompareTo(object obj)
        {
            MetadataRecord other = obj as MetadataRecord;

            if (other == null)
            {
                return(1);
            }

            return(m_historianID.CompareTo(other.HistorianID));
        }
Exemple #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MetadataRecordSummary"/> class.
 /// </summary>
 /// <param name="record">A <see cref="MetadataRecord"/> object.</param>
 public MetadataRecordSummary(MetadataRecord record)
 {
     HistorianID = record.HistorianID;
     ExceptionLimit = record.AnalogFields.ExceptionLimit;
     Enabled = record.GeneralFlags.Enabled;
     HighWarning = record.AnalogFields.HighWarning;
     LowWarning = record.AnalogFields.LowWarning;
     HighAlarm = record.AnalogFields.HighAlarm;
     LowAlarm = record.AnalogFields.LowAlarm;
     HighRange = record.AnalogFields.HighRange;
     LowRange = record.AnalogFields.LowRange;
 }
        /// <summary>
        /// Returns an <see cref="MetadataRecord"/> object for this <see cref="SerializableMetadataRecord"/>.
        /// </summary>
        /// <returns>An <see cref="MetadataRecord"/> object.</returns>
        public MetadataRecord Deflate()
        {
            MetadataRecord metadataRecord = new MetadataRecord(HistorianID, MetadataFileLegacyMode.Enabled);
            metadataRecord.GeneralFlags.DataType = (DataType)DataType;
            metadataRecord.Name = Name;
            metadataRecord.Synonym1 = Synonym1;
            metadataRecord.Synonym2 = Synonym2;
            metadataRecord.Synonym3 = Synonym3;
            metadataRecord.Description = Description;
            metadataRecord.HardwareInfo = HardwareInfo;
            metadataRecord.Remarks = Remarks;
            metadataRecord.PlantCode = PlantCode;
            metadataRecord.UnitNumber = UnitNumber;
            metadataRecord.SystemName = SystemName;
            metadataRecord.SourceID = SourceID;
            metadataRecord.GeneralFlags.Enabled = Enabled;
            metadataRecord.ScanRate = ScanRate;
            metadataRecord.CompressionMinTime = CompressionMinTime;
            metadataRecord.CompressionMaxTime = CompressionMaxTime;
            metadataRecord.SecurityFlags.ChangeSecurity = ChangeSecurity;
            metadataRecord.SecurityFlags.AccessSecurity = AccessSecurity;
            metadataRecord.GeneralFlags.StepCheck = StepCheck;
            metadataRecord.GeneralFlags.AlarmEnabled = AlarmEnabled;
            metadataRecord.AlarmFlags.Value = AlarmFlags;
            metadataRecord.GeneralFlags.AlarmToFile = AlarmToFile;
            metadataRecord.GeneralFlags.AlarmByEmail = AlarmByEmail;
            metadataRecord.GeneralFlags.AlarmByPager = AlarmByPager;
            metadataRecord.GeneralFlags.AlarmByPhone = AlarmByPhone;
            metadataRecord.AlarmEmails = AlarmEmails;
            metadataRecord.AlarmPagers = AlarmPagers;
            metadataRecord.AlarmPhones = AlarmPhones;
            if (DataType == 0)
            {
                // Analog properties.
                metadataRecord.AnalogFields.EngineeringUnits = EngineeringUnits;
                metadataRecord.AnalogFields.LowWarning = LowWarning;
                metadataRecord.AnalogFields.HighWarning = HighWarning;
                metadataRecord.AnalogFields.LowAlarm = LowAlarm;
                metadataRecord.AnalogFields.HighAlarm = HighAlarm;
                metadataRecord.AnalogFields.LowRange = LowRange;
                metadataRecord.AnalogFields.HighRange = HighRange;
                metadataRecord.AnalogFields.CompressionLimit = CompressionLimit;
                metadataRecord.AnalogFields.ExceptionLimit = ExceptionLimit;
                metadataRecord.AnalogFields.DisplayDigits = DisplayDigits;
                metadataRecord.AnalogFields.AlarmDelay = AlarmDelay;
            }
            else if (DataType == 1)
            {
                // Digital properties.
                metadataRecord.DigitalFields.SetDescription = SetDescription;
                metadataRecord.DigitalFields.ClearDescription = ClearDescription;
                metadataRecord.DigitalFields.AlarmState = AlarmState;
                metadataRecord.DigitalFields.AlarmDelay = AlarmDelay;
            }

            return metadataRecord;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SerializableMetadataRecord"/> class.
        /// </summary>
        /// <param name="metadataRecord"><see cref="MetadataRecord"/> from which <see cref="SerializableMetadataRecord"/> is to be initialized.</param>
        /// <exception cref="ArgumentNullException"><paramref name="metadataRecord"/> is null.</exception>
        public SerializableMetadataRecord(MetadataRecord metadataRecord)
            : this()
        {
            if (metadataRecord == null)
                throw new ArgumentNullException("metadataRecord");

            HistorianID = metadataRecord.HistorianID;
            DataType = (int)metadataRecord.GeneralFlags.DataType;
            Name = metadataRecord.Name;
            Synonym1 = metadataRecord.Synonym1;
            Synonym2 = metadataRecord.Synonym2;
            Synonym3 = metadataRecord.Synonym3;
            Description = metadataRecord.Description;
            HardwareInfo = metadataRecord.HardwareInfo;
            Remarks = metadataRecord.Remarks;
            PlantCode = metadataRecord.PlantCode;
            UnitNumber = metadataRecord.UnitNumber;
            SystemName = metadataRecord.SystemName;
            SourceID = metadataRecord.SourceID;
            Enabled = metadataRecord.GeneralFlags.Enabled;
            ScanRate = metadataRecord.ScanRate;
            CompressionMinTime = metadataRecord.CompressionMinTime;
            CompressionMaxTime = metadataRecord.CompressionMaxTime;
            ChangeSecurity = metadataRecord.SecurityFlags.ChangeSecurity;
            AccessSecurity = metadataRecord.SecurityFlags.AccessSecurity;
            StepCheck = metadataRecord.GeneralFlags.StepCheck;
            AlarmEnabled = metadataRecord.GeneralFlags.AlarmEnabled;
            AlarmFlags = metadataRecord.AlarmFlags.Value;
            AlarmToFile = metadataRecord.GeneralFlags.AlarmToFile;
            AlarmByEmail = metadataRecord.GeneralFlags.AlarmByEmail;
            AlarmByPager = metadataRecord.GeneralFlags.AlarmByPager;
            AlarmByPhone = metadataRecord.GeneralFlags.AlarmByPhone;
            AlarmEmails = metadataRecord.AlarmEmails;
            AlarmPagers = metadataRecord.AlarmPagers;
            AlarmPhones = metadataRecord.AlarmPhones;
            if (DataType == 0)
            {
                // Analog properties.
                EngineeringUnits = metadataRecord.AnalogFields.EngineeringUnits;
                LowWarning = metadataRecord.AnalogFields.LowWarning;
                HighWarning = metadataRecord.AnalogFields.HighWarning;
                LowAlarm = metadataRecord.AnalogFields.LowAlarm;
                HighAlarm = metadataRecord.AnalogFields.HighAlarm;
                LowRange = metadataRecord.AnalogFields.LowRange;
                HighRange = metadataRecord.AnalogFields.HighRange;
                CompressionLimit = metadataRecord.AnalogFields.CompressionLimit;
                ExceptionLimit = metadataRecord.AnalogFields.ExceptionLimit;
                DisplayDigits = metadataRecord.AnalogFields.DisplayDigits;
                AlarmDelay = metadataRecord.AnalogFields.AlarmDelay;
            }
            else if (DataType == 1)
            {
                // Digital properties.
                SetDescription = metadataRecord.DigitalFields.SetDescription;
                ClearDescription = metadataRecord.DigitalFields.ClearDescription;
                AlarmState = metadataRecord.DigitalFields.AlarmState;
                AlarmDelay = metadataRecord.DigitalFields.AlarmDelay;
            }
        }
 private string GetDeviceName(MetadataRecord record)
 {
     string signalReference = record.Synonym1;
     return signalReference.Remove(signalReference.LastIndexOf('!')).Replace("LOCAL$", "");
 }
Exemple #7
0
        /// <summary>
        /// Processes <see cref="PacketType4"/>.
        /// </summary>
        /// <returns>An <see cref="IEnumerable{T}"/> object containing the binary images of <see cref="MetadataRecord.Summary"/> for the <see cref="QueryPacketBase.RequestIDs"/>.</returns>
        protected virtual IEnumerable<byte[]> Process()
        {
            if (Archive == null)
                yield break;

            byte[] data;
            MetadataRecord record;
            if (RequestIDs.Count == 0 || (RequestIDs.Count == 1 && RequestIDs[0] == -1))
            {
                // Information for all defined records is requested.
                int id = 0;
                while (true)
                {
                    data = Archive.ReadMetaData(++id);
                    if (data == null)
                    {
                        // No more records.
                        break;
                    }

                    record = new MetadataRecord(id, MetadataFileLegacyMode.Enabled, data, 0, data.Length);

                    // Only send information that has changed.
                    if (record.GeneralFlags.Changed)
                    {
                        // Reset the "changed" field.
                        record.GeneralFlags.Changed = false;
                        Archive.WriteMetaData(id, record.BinaryImage());

                        yield return record.Summary.BinaryImage();
                    }
                }
            }
            else
            {
                // Information for specific records is requested.
                foreach (int id in RequestIDs)
                {
                    data = Archive.ReadMetaData(id);
                    if (data == null)
                    {
                        // ID is invalid.
                        continue;
                    }

                    record = new MetadataRecord(id, MetadataFileLegacyMode.Enabled, data, 0, data.Length);

                    // Only send information that has changed.
                    if (record.GeneralFlags.Changed)
                    {
                        // Reset the "changed" field.
                        record.GeneralFlags.Changed = false;
                        Archive.WriteMetaData(id, record.BinaryImage());

                        yield return record.Summary.BinaryImage();
                    }
                }
            }
            yield return new MetadataRecord(-1, MetadataFileLegacyMode.Enabled).Summary.BinaryImage();    // To indicate EOT.
        }
        /// <summary>
        /// Updates the <see cref="Metadata"/> from <paramref name="tableData"/>
        /// </summary>
        /// <param name="tableData"><see cref="DataTable"/> containing the new metadata.</param>
        /// <exception cref="ArgumentNullException"><paramref name="tableData"/> is null.</exception>
        /// <exception cref="ArgumentException"><paramref name="tableData"/> does not contain 43 columns.</exception>
        public void UpdateMetadata(DataTable tableData)
        {
            if (tableData == 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();
        }
        /// <summary>
        /// Updates the <see cref="Metadata"/> from <paramref name="readerData"/>
        /// </summary>
        /// <param name="readerData"><see cref="IDataReader"/> providing the new metadata.</param>
        /// <exception cref="ArgumentNullException"><paramref name="readerData"/> is null.</exception>
        /// <exception cref="ArgumentException"><paramref name="readerData"/> does not contain 43 columns.</exception>
        public void UpdateMetadata(IDataReader readerData)
        {
            if (readerData == null)
                throw new ArgumentNullException(nameof(readerData));

            if (readerData.FieldCount != 43)
                throw new ArgumentException("readerData must contain 43 columns");

            MetadataRecord newMetadataRecord;

            foreach (MetadataRecord existingMetadataRecord in m_metadata.Read())
                existingMetadataRecord.GeneralFlags.Enabled = false;

            while (readerData.Read())
            {
                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();
        }
        // openHistorian 2.0 currently uses the database for its metadata repository - so we just expose the metadata record
        // as read from the database for exposure via metadata web service interface
        private MetadataRecord ReadMetadataRecord(int historianID)
        {
            MetadataRecord record = new MetadataRecord(historianID, MetadataFileLegacyMode.Enabled);

            using (AdoDataConnection database = new AdoDataConnection("systemSettings"))
            {
                IDbConnection connection = database.Connection;

                string query = string.Format("SELECT * FROM HistorianMetadata WHERE HistorianID = {0}", historianID);

                DataRow row = connection.RetrieveRow(database.AdapterType, query);

                // Make sure record exists for this point ID
                if (Convert.IsDBNull(row[0]) || Convert.ToInt32(row[0]) != historianID)
                    return null;

                if (!Convert.IsDBNull(row[1]))
                    record.GeneralFlags.DataType = (DataType)Convert.ToInt32(row[1]);

                if (!Convert.IsDBNull(row[2]))
                    record.Name = Convert.ToString(row[2]);

                if (!Convert.IsDBNull(row[3]))
                    record.Synonym1 = Convert.ToString(row[3]);

                if (!Convert.IsDBNull(row[4]))
                    record.Synonym2 = Convert.ToString(row[4]);

                if (!Convert.IsDBNull(row[5]))
                    record.Synonym3 = Convert.ToString(row[5]);

                if (!Convert.IsDBNull(row[6]))
                    record.Description = Convert.ToString(row[6]);

                if (!Convert.IsDBNull(row[7]))
                    record.HardwareInfo = Convert.ToString(row[7]);

                if (!Convert.IsDBNull(row[8]))
                    record.Remarks = Convert.ToString(row[8]);

                if (!Convert.IsDBNull(row[9]))
                    record.PlantCode = Convert.ToString(row[9]);

                if (!Convert.IsDBNull(row[10]))
                    record.UnitNumber = Convert.ToInt32(row[10]);

                if (!Convert.IsDBNull(row[11]))
                    record.SystemName = Convert.ToString(row[11]);

                if (!Convert.IsDBNull(row[12]))
                    record.SourceID = Convert.ToInt32(row[12]);

                if (!Convert.IsDBNull(row[13]))
                    record.GeneralFlags.Enabled = Convert.ToBoolean(row[13]);

                if (!Convert.IsDBNull(row[14]))
                    record.ScanRate = Convert.ToSingle(row[14]);

                if (!Convert.IsDBNull(row[15]))
                    record.CompressionMinTime = Convert.ToInt32(row[15]);

                if (!Convert.IsDBNull(row[16]))
                    record.CompressionMaxTime = Convert.ToInt32(row[16]);

                if (!Convert.IsDBNull(row[30]))
                    record.SecurityFlags.ChangeSecurity = Convert.ToInt32(row[30]);

                if (!Convert.IsDBNull(row[31]))
                    record.SecurityFlags.AccessSecurity = Convert.ToInt32(row[31]);

                if (!Convert.IsDBNull(row[32]))
                    record.GeneralFlags.StepCheck = Convert.ToBoolean(row[32]);

                if (!Convert.IsDBNull(row[33]))
                    record.GeneralFlags.AlarmEnabled = Convert.ToBoolean(row[33]);

                if (!Convert.IsDBNull(row[34]))
                    record.AlarmFlags.Value = Convert.ToInt32(row[34]);

                if (!Convert.IsDBNull(row[36]))
                    record.GeneralFlags.AlarmToFile = Convert.ToBoolean(row[36]);

                if (!Convert.IsDBNull(row[37]))
                    record.GeneralFlags.AlarmByEmail = Convert.ToBoolean(row[37]);

                if (!Convert.IsDBNull(row[38]))
                    record.GeneralFlags.AlarmByPager = Convert.ToBoolean(row[38]);

                if (!Convert.IsDBNull(row[39]))
                    record.GeneralFlags.AlarmByPhone = Convert.ToBoolean(row[39]);

                if (!Convert.IsDBNull(row[40]))
                    record.AlarmEmails = Convert.ToString(row[40]);

                if (!Convert.IsDBNull(row[41]))
                    record.AlarmPagers = Convert.ToString(row[41]);

                if (!Convert.IsDBNull(row[42]))
                    record.AlarmPhones = Convert.ToString(row[42]);

                if (record.GeneralFlags.DataType == DataType.Analog)
                {
                    if (!Convert.IsDBNull(row[17]))
                        record.AnalogFields.EngineeringUnits = Convert.ToString(row[17]);

                    if (!Convert.IsDBNull(row[18]))
                        record.AnalogFields.LowWarning = Convert.ToSingle(row[18]);

                    if (!Convert.IsDBNull(row[19]))
                        record.AnalogFields.HighWarning = Convert.ToSingle(row[19]);

                    if (!Convert.IsDBNull(row[20]))
                        record.AnalogFields.LowAlarm = Convert.ToSingle(row[20]);

                    if (!Convert.IsDBNull(row[21]))
                        record.AnalogFields.HighAlarm = Convert.ToSingle(row[21]);

                    if (!Convert.IsDBNull(row[22]))
                        record.AnalogFields.LowRange = Convert.ToSingle(row[22]);

                    if (!Convert.IsDBNull(row[23]))
                        record.AnalogFields.HighRange = Convert.ToSingle(row[23]);

                    if (!Convert.IsDBNull(row[24]))
                        record.AnalogFields.CompressionLimit = Convert.ToSingle(row[24]);

                    if (!Convert.IsDBNull(row[25]))
                        record.AnalogFields.ExceptionLimit = Convert.ToSingle(row[25]);

                    if (!Convert.IsDBNull(row[26]))
                        record.AnalogFields.DisplayDigits = Convert.ToInt32(row[26]);

                    if (!Convert.IsDBNull(row[35]))
                        record.AnalogFields.AlarmDelay = Convert.ToSingle(row[35]);
                }
                else if (record.GeneralFlags.DataType == DataType.Digital)
                {
                    if (!Convert.IsDBNull(row[27]))
                        record.DigitalFields.SetDescription = Convert.ToString(row[27]);

                    if (!Convert.IsDBNull(row[28]))
                        record.DigitalFields.ClearDescription = Convert.ToString(row[28]);

                    if (!Convert.IsDBNull(row[29]))
                        record.DigitalFields.AlarmState = Convert.ToInt32(row[29]);

                    if (!Convert.IsDBNull(row[35]))
                        record.DigitalFields.AlarmDelay = Convert.ToSingle(row[35]);
                }
            }

            return record;
        }
        // openHistorian 2.0 currently uses the database for its metadata repository - so we just update the database using the
        // provided metadata record as received from the metadata web service interface
        void IArchive.WriteMetaData(int historianID, byte[] metadata)
        {
            MetadataRecord record = new MetadataRecord(historianID, MetadataFileLegacyMode.Enabled, metadata, 0, metadata.Length);

            using (AdoDataConnection database = new AdoDataConnection("systemSettings"))
            {
                IDbConnection connection = database.Connection;

                // TODO: To enable update signal type, associated device, destination historian, etc. - look up key ID values in advance of measurement record update

                // Only updating readily available fields - to make this more useful in the future, will need to update (or add a new) web service metadata format...
                string query = database.ParameterizedQueryString("UPDATE Measurement SET PointTag={0}, SignalReference={1}, AlternateTag={2}, Enabled={3} WHERE HistorianID = {4}", "pointTag", "signalReference", "alternateTag", "enabled", "historianID");

                // Update metadata fields
                connection.ExecuteNonQuery(query, record.Name, record.Synonym1, record.Synonym3, record.GeneralFlags.Enabled, historianID);
            }
        }