bool WriteParameters(WriteBuffer buf, ref DirectBuffer directBuf)
{
for (; _paramIndex < InputParameters.Count; _paramIndex++)
{
var param = InputParameters[_paramIndex];
if (!_wroteParamLen)
{
if (param.Value is DBNull)
{
if (buf.WriteSpaceLeft < 4) { return false; }
buf.WriteInt32(-1);
continue;
}
param.LengthCache?.Rewind();
}
var handler = param.Handler;
var asChunkingWriter = handler as IChunkingTypeHandler;
if (asChunkingWriter != null)
{
if (!_wroteParamLen)
{
if (buf.WriteSpaceLeft < 4) { return false; }
buf.WriteInt32(param.ValidateAndGetLength());
asChunkingWriter.PrepareWrite(param.Value, buf, param.LengthCache, param);
_wroteParamLen = true;
}
if (!asChunkingWriter.Write(ref directBuf)) {
return false;
}
_wroteParamLen = false;
continue;
}
var len = param.ValidateAndGetLength();
var asSimpleWriter = (ISimpleTypeHandler)handler;
if (buf.WriteSpaceLeft < len + 4)
{
Contract.Assume(buf.Size >= len + 4);
return false;
}
buf.WriteInt32(len);
asSimpleWriter.Write(param.Value, buf, param);
}
return true;
}