#pragma warning disable RECS0154 // Parameter is never used #pragma warning disable IDE0060 // Remove unused parameter /// <summary> /// Updates the history. /// </summary> public uint UpdateAnnotations(SystemContext context, Annotation annotation, DataValue value, PerformUpdateType performUpdateType) #pragma warning restore IDE0060 // Remove unused parameter #pragma warning restore RECS0154 // Parameter is never used { var replaced = false; var filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, "SourceTimestamp = #{0}#", value.SourceTimestamp); var view = new DataView( ArchiveItem.DataSet.Tables[2], filter, null, DataViewRowState.CurrentRows); DataRow row = null; for (var ii = 0; ii < view.Count; ii++) { var current = (Annotation)view[ii].Row[5]; replaced = current.UserName == annotation.UserName; if (performUpdateType == PerformUpdateType.Insert) { if (replaced) { return(StatusCodes.BadEntryExists); } } if (replaced) { row = view[ii].Row; break; } } // add record indicating it was inserted. if (!replaced) { if (performUpdateType == PerformUpdateType.Replace || performUpdateType == PerformUpdateType.Remove) { return(StatusCodes.BadNoEntryExists); } row = ArchiveItem.DataSet.Tables[2].NewRow(); } // add/update new record. if (performUpdateType != PerformUpdateType.Remove) { row[0] = value.SourceTimestamp; row[1] = value.ServerTimestamp; row[2] = new DataValue(new ExtensionObject(annotation), StatusCodes.Good, value.SourceTimestamp, value.ServerTimestamp); row[3] = BuiltInType.ExtensionObject; row[4] = ValueRanks.Scalar; row[5] = annotation; if (!replaced) { ArchiveItem.DataSet.Tables[2].Rows.Add(row); } } // delete record. else { row.Delete(); } // accept all changes. ArchiveItem.DataSet.AcceptChanges(); return(StatusCodes.Good); }
/// <summary> /// Update data /// </summary> private StatusCode UpdateData( HdaItem item, PerformUpdateType updateType, DataValueCollection values, out int[] errors) { errors = null; string methodName = "IOPCHDA_SyncUpdate.Insert"; int dwNumItems = values.Count; int[] phServer = new int[dwNumItems]; System.Runtime.InteropServices.ComTypes.FILETIME[] ftTimeStamps = new System.Runtime.InteropServices.ComTypes.FILETIME[dwNumItems]; object[] vDataValues = new object[dwNumItems]; int[] pdwQualities = new int[dwNumItems]; for (int ii = 0; ii < dwNumItems; ii++) { DataValue value = values[ii]; phServer[ii] = item.ServerHandle; vDataValues[ii] = ComUtils.GetVARIANT(value.WrappedValue); pdwQualities[ii] = Utils.ToInt32(ComUtils.GetHdaQualityCode(value.StatusCode)); ftTimeStamps[ii] = ComUtils.GetFILETIME(value.SourceTimestamp); } IntPtr ppErrors = IntPtr.Zero; try { IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true); switch (updateType) { case PerformUpdateType.Insert: { server.Insert( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } case PerformUpdateType.Update: { server.InsertReplace( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } case PerformUpdateType.Replace: { server.Replace( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } } // check for error. errors = ComUtils.GetInt32s(ref ppErrors, dwNumItems, true); } catch (Exception e) { ComCallError(methodName, e); return StatusCodes.BadUnexpectedError; } finally { EndComCall(methodName); } return StatusCodes.Good; }
public HistoryUpdateData(NodeId NodeId, PerformUpdateType PerformUpdate, DataValue[] Value) { this.NodeId = NodeId; this.PerformUpdate = PerformUpdate; this.Value = Value; }
/// <summary> /// Updates the history. /// </summary> public uint UpdateHistory(SystemContext context, DataValue value, PerformUpdateType performUpdateType) { var replaced = false; if (performUpdateType == PerformUpdateType.Remove) { return(StatusCodes.BadNotSupported); } if (StatusCode.IsNotBad(value.StatusCode)) { var typeInfo = value.WrappedValue.TypeInfo; if (typeInfo == null) { typeInfo = TypeInfo.Construct(value.Value); } if (typeInfo == null || typeInfo.BuiltInType != ArchiveItem.DataType || typeInfo.ValueRank != ValueRanks.Scalar) { return(StatusCodes.BadTypeMismatch); } } var filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, "SourceTimestamp = #{0}#", value.SourceTimestamp); var view = new DataView( ArchiveItem.DataSet.Tables[0], filter, null, DataViewRowState.CurrentRows); DataRow row = null; var ii = 0; for (; ii < view.Count;) { if (performUpdateType == PerformUpdateType.Insert) { return(StatusCodes.BadEntryExists); } // add record indicating it was replaced. var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow(); modifiedRow[0] = view[ii].Row[0]; modifiedRow[1] = view[ii].Row[1]; modifiedRow[2] = view[ii].Row[2]; modifiedRow[3] = view[ii].Row[3]; modifiedRow[4] = view[ii].Row[4]; modifiedRow[5] = HistoryUpdateType.Replace; modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Replace); ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow); replaced = true; row = view[ii].Row; break; } // add record indicating it was inserted. if (!replaced) { if (performUpdateType == PerformUpdateType.Replace) { return(StatusCodes.BadNoEntryExists); } var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow(); modifiedRow[0] = value.SourceTimestamp; modifiedRow[1] = value.ServerTimestamp; modifiedRow[2] = value; if (value.WrappedValue.TypeInfo != null) { modifiedRow[3] = value.WrappedValue.TypeInfo.BuiltInType; modifiedRow[4] = value.WrappedValue.TypeInfo.ValueRank; } else { modifiedRow[3] = BuiltInType.Variant; modifiedRow[4] = ValueRanks.Scalar; } modifiedRow[5] = HistoryUpdateType.Insert; modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Insert); ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow); row = ArchiveItem.DataSet.Tables[0].NewRow(); } // add/update new record. row[0] = value.SourceTimestamp; row[1] = value.ServerTimestamp; row[2] = value; if (value.WrappedValue.TypeInfo != null) { row[3] = value.WrappedValue.TypeInfo.BuiltInType; row[4] = value.WrappedValue.TypeInfo.ValueRank; } else { row[3] = BuiltInType.Variant; row[4] = ValueRanks.Scalar; } if (!replaced) { ArchiveItem.DataSet.Tables[0].Rows.Add(row); } // accept all changes. ArchiveItem.DataSet.AcceptChanges(); return(StatusCodes.Good); }
/// <summary> /// Updates the history. /// </summary> public int[] UpdateRaw( int transactionId, PerformUpdateType updateType, int[] serverHandles, DaValue[] values, out int cancelId) { Session session = ThrowIfNotConnected(); // create the update requests. List<HdaUpdateRequest> requests = CreateUpdateRequests( session, updateType, serverHandles, values); // queue the transaction. int[] errors = CreateTransaction( TransationType.Update, transactionId, requests, out cancelId); // return the initial results. return errors; }
/// <summary> /// Creates the update requests. /// </summary> private List<HdaUpdateRequest> CreateUpdateRequests( Session session, PerformUpdateType updateType, int[] serverHandles, DaValue[] values) { List<HdaUpdateRequest> requests = new List<HdaUpdateRequest>(); for (int ii = 0; ii < serverHandles.Length; ii++) { HdaUpdateRequest request = new HdaUpdateRequest(); requests.Add(request); // find handle. request.Handle = m_itemManager.LookupHandle(serverHandles[ii]); if (request.Handle == null) { request.Error = ResultIds.E_INVALIDHANDLE; continue; } request.ClientHandle = request.Handle.ClientHandle; // check if nothing to do. DaValue value = values[ii]; if (value == null) { request.Error = ResultIds.E_FAIL; continue; } // specify the parameters for the request. UpdateDataDetails details = new UpdateDataDetails(); details.NodeId = request.Handle.NodeId; details.PerformInsertReplace = updateType; DataValue value2 = m_mapper.GetRemoteDataValue(value, m_itemManager.GetRemoteDataType(request.Handle)); value2.SourceTimestamp = value.Timestamp; value2.StatusCode = ComUtils.GetHdaQualityCode(value.HdaQuality); details.UpdateValues.Add(value2); request.Details = new ExtensionObject(details); } return requests; }
/// <summary> /// Updates the history. /// </summary> public int[] UpdateRaw( PerformUpdateType updateType, int[] serverHandles, DaValue[] values) { Session session = ThrowIfNotConnected(); // create the update requests. List<HdaUpdateRequest> requests = CreateUpdateRequests( session, updateType, serverHandles, values); // update the server. return UpdateHistory(session, requests, true); }
/// <summary> /// Updates the history. /// </summary> public uint UpdateAnnotations(SystemContext context, Annotation annotation, DataValue value, PerformUpdateType performUpdateType) { bool replaced = false; string filter = String.Format(System.Globalization.CultureInfo.InvariantCulture, "SourceTimestamp = #{0}#", value.SourceTimestamp); DataView view = new DataView( m_archiveItem.DataSet.Tables[2], filter, null, DataViewRowState.CurrentRows); DataRow row = null; for (int ii = 0; ii < view.Count; ii++) { Annotation current = (Annotation)view[ii].Row[5]; replaced = (current.UserName == annotation.UserName); if (performUpdateType == PerformUpdateType.Insert) { if (replaced) { return StatusCodes.BadEntryExists; } } if (replaced) { row = view[ii].Row; break; } } // add record indicating it was inserted. if (!replaced) { if (performUpdateType == PerformUpdateType.Replace || performUpdateType == PerformUpdateType.Remove) { return StatusCodes.BadNoEntryExists; } row = m_archiveItem.DataSet.Tables[2].NewRow(); } // add/update new record. if (performUpdateType != PerformUpdateType.Remove) { row[0] = value.SourceTimestamp; row[1] = value.ServerTimestamp; row[2] = new DataValue(new ExtensionObject(annotation), StatusCodes.Good, value.SourceTimestamp, value.ServerTimestamp); row[3] = BuiltInType.ExtensionObject; row[4] = ValueRanks.Scalar; row[5] = annotation; if (!replaced) { m_archiveItem.DataSet.Tables[2].Rows.Add(row); } } // delete record. else { row.Delete(); } // accept all changes. m_archiveItem.DataSet.AcceptChanges(); return StatusCodes.Good; }
/// <summary> /// Updates the history. /// </summary> public uint UpdateHistory(SystemContext context, DataValue value, PerformUpdateType performUpdateType) { bool replaced = false; if (performUpdateType == PerformUpdateType.Remove) { return StatusCodes.BadNotSupported; } if (StatusCode.IsNotBad(value.StatusCode)) { TypeInfo typeInfo = value.WrappedValue.TypeInfo; if (typeInfo == null) { typeInfo = TypeInfo.Construct(value.Value); } if (typeInfo == null || typeInfo.BuiltInType != m_archiveItem.DataType || typeInfo.ValueRank != ValueRanks.Scalar) { return StatusCodes.BadTypeMismatch; } } string filter = String.Format(System.Globalization.CultureInfo.InvariantCulture, "SourceTimestamp = #{0}#", value.SourceTimestamp); DataView view = new DataView( m_archiveItem.DataSet.Tables[0], filter, null, DataViewRowState.CurrentRows); DataRow row = null; for (int ii = 0; ii < view.Count;) { if (performUpdateType == PerformUpdateType.Insert) { return StatusCodes.BadEntryExists; } // add record indicating it was replaced. DataRow modifiedRow = m_archiveItem.DataSet.Tables[1].NewRow(); modifiedRow[0] = view[ii].Row[0]; modifiedRow[1] = view[ii].Row[1]; modifiedRow[2] = view[ii].Row[2]; modifiedRow[3] = view[ii].Row[3]; modifiedRow[4] = view[ii].Row[4]; modifiedRow[5] = HistoryUpdateType.Replace; modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Replace); m_archiveItem.DataSet.Tables[1].Rows.Add(modifiedRow); replaced = true; row = view[ii].Row; break; } // add record indicating it was inserted. if (!replaced) { if (performUpdateType == PerformUpdateType.Replace) { return StatusCodes.BadNoEntryExists; } DataRow modifiedRow = m_archiveItem.DataSet.Tables[1].NewRow(); modifiedRow[0] = value.SourceTimestamp; modifiedRow[1] = value.ServerTimestamp; modifiedRow[2] = value; if (value.WrappedValue.TypeInfo != null) { modifiedRow[3] = value.WrappedValue.TypeInfo.BuiltInType; modifiedRow[4] = value.WrappedValue.TypeInfo.ValueRank; } else { modifiedRow[3] = BuiltInType.Variant; modifiedRow[4] = ValueRanks.Scalar; } modifiedRow[5] = HistoryUpdateType.Insert; modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Insert); m_archiveItem.DataSet.Tables[1].Rows.Add(modifiedRow); row = m_archiveItem.DataSet.Tables[0].NewRow(); } // add/update new record. row[0] = value.SourceTimestamp; row[1] = value.ServerTimestamp; row[2] = value; if (value.WrappedValue.TypeInfo != null) { row[3] = value.WrappedValue.TypeInfo.BuiltInType; row[4] = value.WrappedValue.TypeInfo.ValueRank; } else { row[3] = BuiltInType.Variant; row[4] = ValueRanks.Scalar; } if (!replaced) { m_archiveItem.DataSet.Tables[0].Rows.Add(row); } // accept all changes. m_archiveItem.DataSet.AcceptChanges(); return StatusCodes.Good; }
/// <summary> /// Updates the history. /// </summary> private HistoryUpdateResultCollection InsertReplace(NodeId nodeId, PerformUpdateType updateType, bool isStructure, IList<DataValue> values) { HistoryUpdateDetails details = null; if (isStructure) { UpdateStructureDataDetails details2 = new UpdateStructureDataDetails(); details2.NodeId = nodeId; details2.PerformInsertReplace = updateType; details2.UpdateValues.AddRange(values); details = details2; } else { UpdateDataDetails details2 = new UpdateDataDetails(); details2.NodeId = nodeId; details2.PerformInsertReplace = updateType; details2.UpdateValues.AddRange(values); details = details2; } ExtensionObjectCollection nodesToUpdate = new ExtensionObjectCollection(); nodesToUpdate.Add(new ExtensionObject(details)); HistoryUpdateResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryUpdate( null, nodesToUpdate, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToUpdate); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToUpdate); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } return results; }
/// <summary> /// Updates the history. /// </summary> private void InsertReplace(PerformUpdateType updateType) { DataValueCollection values = new DataValueCollection(); foreach (DataRowView row in m_dataset.Tables[0].DefaultView) { DataValue value = (DataValue)row.Row[9]; values.Add(value); } bool isStructured = false; PropertyWithHistory property = PropertyCB.SelectedItem as PropertyWithHistory; if (property != null && property.BrowseName == Opc.Ua.BrowseNames.Annotations) { isStructured = true; } HistoryUpdateResultCollection results = InsertReplace(GetSelectedNode(), updateType, isStructured, values); ResultsDV.Columns[ResultsDV.Columns.Count - 1].Visible = true; for (int ii = 0; ii < m_dataset.Tables[0].DefaultView.Count; ii++) { m_dataset.Tables[0].DefaultView[ii].Row[10] = results[0].OperationResults[ii]; } m_dataset.AcceptChanges(); }