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