Pietro Cerutti created AVRO-3710: ------------------------------------ Summary: C++ - don't take ownership of I/OStream in DataFile Key: AVRO-3710 URL: https://issues.apache.org/jira/browse/AVRO-3710 Project: Apache Avro Issue Type: Improvement Components: c++ Reporter: Pietro Cerutti
In AVRO-2014, I raised concerns regarding how DataFile(Reader|Writer)[Base] take their streams by unique_ptr. Here, I would like to propose a fix. The problem is that, because streams are taken by unique_ptr, caller code doesn't have access to the streams after the construction of the DataFile* object. This makes it impossible to use custom streams, or even the built-in memory streams: {code:cpp} auto schema{ giveMeMySchema(); } auto os{ avro::memoryOutputStream() }; DataFileWriter w{ os, schema }; auto is{ memoryInputStream(*os) }; // ouch: os is gone doSomethingWithTheAvroStream(is); {code} I am proposing an almost backwards-compatible change, which is to change the DataFile classes to take and hold the streams by shared_ptr. The semantics for client code don't change: you can still move a unique_ptr<Stream> into the DataFile constructor, and in that case the DataFile will be the only owner. But this enable a client from doing something like this: {code:cpp} auto schema{ giveMeMySchema(); } auto os{ avro::memoryOutputStream() }; std::shared_ptr<OutputStream> shared_os{ os.get(), boost::null_deleter{} }; DataFileWriter w{ shared_os, schema }; auto is{ memoryInputStream(*os) }; // good: os is alive doSomethingWithTheAvroStream(is); {code} I will submit a PR if this is accepted -- This message was sent by Atlassian Jira (v8.20.10#820010)