/* * Copyright (c) 2011, Google Inc. */ #ifndef STREAMING_H #define STREAMING_H 1 #include "object.h" struct object_database; struct odb_read_stream; struct stream_filter; typedef int (*odb_read_stream_close_fn)(struct odb_read_stream *); typedef ssize_t (*odb_read_stream_read_fn)(struct odb_read_stream *, char *, size_t); /* * A stream that can be used to read an object from the object database without * loading all of it into memory. */ struct odb_read_stream { odb_read_stream_close_fn close; odb_read_stream_read_fn read; enum object_type type; unsigned long size; /* inflated size of full object */ }; /* * Create a new object stream for the given object database. An optional filter * can be used to transform the object's content. * * Returns the stream on success, a `NULL` pointer otherwise. */ struct odb_read_stream *odb_read_stream_open(struct object_database *odb, const struct object_id *oid, struct stream_filter *filter); /* * Close the given read stream and release all resources associated with it. * Returns 0 on success, a negative error code otherwise. */ int odb_read_stream_close(struct odb_read_stream *stream); /* * Read data from the stream into the buffer. Returns 0 on EOF and the number * of bytes read on success. Returns a negative error code in case reading from * the stream fails. */ ssize_t odb_read_stream_read(struct odb_read_stream *stream, void *buf, size_t len); /* * Look up the object by its ID and write the full contents to the file * descriptor. The object must be a blob, or the function will fail. When * provided, the filter is used to transform the blob contents. * * `can_seek` should be set to 1 in case the given file descriptor can be * seek(3p)'d on. This is used to support files with holes in case a * significant portion of the blob contains NUL bytes. * * Returns a negative error code on failure, 0 on success. */ int odb_stream_blob_to_fd(struct object_database *odb, int fd, const struct object_id *oid, struct stream_filter *filter, int can_seek); #endif /* STREAMING_H */