in src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/DataFileReader.cs [325:517]
private DataSet LoadData(ISystemContext context, DateTime baseline, StreamReader reader)
{
var dataset = CreateDataSet();
var messageContext = new ServiceMessageContext();
if (context != null)
{
messageContext.NamespaceUris = context.NamespaceUris;
messageContext.ServerUris = context.ServerUris;
messageContext.Factory = context.EncodeableFactory;
}
else
{
messageContext.NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris;
messageContext.ServerUris = ServiceMessageContext.GlobalContext.ServerUris;
messageContext.Factory = ServiceMessageContext.GlobalContext.Factory;
}
var valueType = BuiltInType.String;
var value = Variant.Null;
var annotationTimeOffet = 0;
var annotationUser = string.Empty;
var annotationMessage = string.Empty;
var lineCount = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
// check for end or error.
if (line == null)
{
break;
}
// ignore blank lines.
line = line.Trim();
lineCount++;
if (string.IsNullOrEmpty(line))
{
continue;
}
// ignore commented out lines.
if (line.StartsWith("//", StringComparison.CurrentCulture))
{
continue;
}
// get source time.
if (!ExtractField(lineCount, ref line, out int sourceTimeOffset))
{
continue;
}
// get server time.
if (!ExtractField(lineCount, ref line, out int serverTimeOffset))
{
continue;
}
// get status code.
if (!ExtractField(lineCount, ref line, out StatusCode status))
{
continue;
}
// get modification type.
if (!ExtractField(lineCount, ref line, out
int recordType))
{
continue;
}
// get modification time.
if (!ExtractField(lineCount, ref line, out
int modificationTimeOffet))
{
continue;
}
// get modification user.
if (!ExtractField(ref line, out var modificationUser))
{
continue;
}
if (recordType >= 0)
{
// get value type.
if (!ExtractField(lineCount, ref line, out valueType))
{
continue;
}
// get value.
if (!ExtractField(lineCount, ref line, messageContext, valueType, out value))
{
continue;
}
}
else
{
// get annotation time.
if (!ExtractField(lineCount, ref line, out annotationTimeOffet))
{
continue;
}
// get annotation user.
if (!ExtractField(ref line, out annotationUser))
{
continue;
}
// get annotation message.
if (!ExtractField(ref line, out annotationMessage))
{
continue;
}
}
// add values to data table.
var dataValue = new DataValue
{
WrappedValue = value,
SourceTimestamp = baseline.AddMilliseconds(sourceTimeOffset),
ServerTimestamp = baseline.AddMilliseconds(serverTimeOffset),
StatusCode = status
};
DataRow row;
if (recordType == 0)
{
row = dataset.Tables[0].NewRow();
row[0] = dataValue.SourceTimestamp;
row[1] = dataValue.ServerTimestamp;
row[2] = dataValue;
row[3] = valueType;
row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;
dataset.Tables[0].Rows.Add(row);
}
else if (recordType > 0)
{
row = dataset.Tables[1].NewRow();
row[0] = dataValue.SourceTimestamp;
row[1] = dataValue.ServerTimestamp;
row[2] = dataValue;
row[3] = valueType;
row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;
row[5] = recordType;
row[6] = new ModificationInfo
{
UpdateType = (HistoryUpdateType)recordType,
ModificationTime = baseline.AddMilliseconds(modificationTimeOffet),
UserName = modificationUser
};
dataset.Tables[1].Rows.Add(row);
}
else if (recordType < 0)
{
row = dataset.Tables[2].NewRow();
var annotation = new Annotation
{
AnnotationTime = baseline.AddMilliseconds(annotationTimeOffet),
UserName = annotationUser,
Message = annotationMessage
};
dataValue.WrappedValue = new ExtensionObject(annotation);
row[0] = dataValue.SourceTimestamp;
row[1] = dataValue.ServerTimestamp;
row[2] = dataValue;
row[3] = valueType;
row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;
row[5] = annotation;
dataset.Tables[2].Rows.Add(row);
}
dataset.AcceptChanges();
}
return dataset;
}