public ODocument Response(Response response)
{
ODocument responseDocument = new ODocument();
if (response == null)
{
return responseDocument;
}
var reader = response.Reader;
// operation specific fields
PayloadStatus payloadStatus = (PayloadStatus)reader.ReadByte();
responseDocument.SetField("PayloadStatus", payloadStatus);
if (OperationMode == OperationMode.Asynchronous)
{
List<ODocument> documents = new List<ODocument>();
while (payloadStatus != PayloadStatus.NoRemainingRecords)
{
ODocument document = ParseDocument(reader);
switch (payloadStatus)
{
case PayloadStatus.ResultSet:
documents.Add(document);
break;
case PayloadStatus.PreFetched:
//client cache
response.Connection.Database.ClientCache[document.ORID] = document;
break;
default:
break;
}
payloadStatus = (PayloadStatus)reader.ReadByte();
}
responseDocument.SetField("Content", documents);
}
else
{
int contentLength;
switch (payloadStatus)
{
case PayloadStatus.NullResult: // 'n'
// nothing to do
break;
case PayloadStatus.SingleRecord: // 'r'
ODocument document = ParseDocument(reader);
responseDocument.SetField("Content", document);
break;
case PayloadStatus.SerializedResult: // 'a'
// TODO: how to parse result - string?
contentLength = reader.ReadInt32EndianAware();
string serialized = System.Text.Encoding.Default.GetString(reader.ReadBytes(contentLength));
responseDocument.SetField("Content", serialized);
break;
case PayloadStatus.RecordCollection: // 'l'
List<ODocument> documents = new List<ODocument>();
int recordsCount = reader.ReadInt32EndianAware();
for (int i = 0; i < recordsCount; i++)
{
documents.Add(ParseDocument(reader));
}
responseDocument.SetField("Content", documents);
break;
default:
break;
}
if (OClient.ProtocolVersion >= 17)
{
//Load the fetched records in cache
while ((payloadStatus = (PayloadStatus)reader.ReadByte()) != PayloadStatus.NoRemainingRecords)
{
ODocument document = ParseDocument(reader);
if (document != null && payloadStatus == PayloadStatus.PreFetched)
{
//Put in the client local cache
response.Connection.Database.ClientCache[document.ORID] = document;
}
}
}
}
return responseDocument;
}