private DataSet LoadData(ISystemContext context, DateTime baseline, StreamReader reader)
{
DataSet dataset = CreateDataSet();
ServiceMessageContext 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;
}
int sourceTimeOffset = 0;
int serverTimeOffset = 0;
StatusCode status = StatusCodes.Good;
int recordType = 0;
int modificationTimeOffet = 0;
string modificationUser = String.Empty;
BuiltInType valueType = BuiltInType.String;
Variant value = Variant.Null;
int annotationTimeOffet = 0;
string annotationUser = String.Empty;
string annotationMessage = String.Empty;
int lineCount = 0;
while (!reader.EndOfStream)
{
string 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("//"))
{
continue;
}
// get source time.
if (!ExtractField(lineCount, ref line, out sourceTimeOffset))
{
continue;
}
// get server time.
if (!ExtractField(lineCount, ref line, out serverTimeOffset))
{
continue;
}
// get status code.
if (!ExtractField(lineCount, ref line, out status))
{
continue;
}
// get modification type.
if (!ExtractField(lineCount, ref line, out recordType))
{
continue;
}
// get modification time.
if (!ExtractField(lineCount, ref line, out modificationTimeOffet))
{
continue;
}
// get modification user.
if (!ExtractField(lineCount, ref line, out 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(lineCount, ref line, out annotationUser))
{
continue;
}
// get annotation message.
if (!ExtractField(lineCount, ref line, out annotationMessage))
{
continue;
}
}
// add values to data table.
DataValue dataValue = new DataValue();
dataValue.WrappedValue = value;
dataValue.SourceTimestamp = baseline.AddMilliseconds(sourceTimeOffset);
dataValue.ServerTimestamp = baseline.AddMilliseconds(serverTimeOffset);
dataValue.StatusCode = status;
DataRow row = null;
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;
ModificationInfo info = new ModificationInfo();
info.UpdateType = (HistoryUpdateType)recordType;
info.ModificationTime = baseline.AddMilliseconds(modificationTimeOffet);
info.UserName = modificationUser;
row[6] = info;
dataset.Tables[1].Rows.Add(row);
}
else if (recordType < 0)
{
row = dataset.Tables[2].NewRow();
Annotation annotation = new Annotation();
annotation.AnnotationTime = baseline.AddMilliseconds(annotationTimeOffet);
annotation.UserName = annotationUser;
annotation.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;
}