Evgeny Kotkov <evgeny.kot...@visualsvn.com> writes:

> 1) We cannot really use svn_stream_flush(TRUE) + svn_stream_close() with
>    a compressed stream that is chained over a file stream or a stream that we
>    expect to be consistent with the underlying device.  A compressed stream
>    writes the final data chunk in close_handler_gz() and calls deflate() with
>    Z_FINISH.  In this case, closing the compressed stream would require a
>    full flush of the underlying stream in order to guarantee consistency.
>    Leaving the compressed streams without a flush handler implementation is
>    also a poor choice because the caller of svn_stream_flush() would have to
>    know the details about the given stream in order to avoid receiving the
>    SVN_ERR_STREAM_NOT_SUPPORTED error.
>
>    I believe that this is an example where achieving the proper behavior with
>    files is simple, but abstracting it with streams is a challenge.

I still prefer the stream patch I posted earlier, and it can be extended
to support compressed streams.  Something like:

svn_error_t *
svn_stream_flush_to_disk_on_close(svn_stream_t *stream)
{
  if (stream->close_fn == close_handler_apr)
    {
      svn_stream_set_close(stream, close_handler_flush);
    }
  else if (stream->close_fn == close_handler_gz)
    {
      struct zbaton *zbaton = stream->baton;
      SVN_ERR(svn_stream_flush_to_disk_on_close(zbaton->substream));
    }
  else if (stream->close_fn != close_handler_flush)
    {
      return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED, NULL,
                              _("No closing file to flush"));
    }

  return SVN_NO_ERROR;
}

That only allows flushing the stream on close but I do not see any need
at present to support flushing at arbitrary positions.

I don't insist on this solution, if people think the file code is better
that is OK.

-- 
Philip Martin | Subversion Committer
WANdisco // *Non-Stop Data*

Reply via email to