| /* |
| * Copyright (c) 2011, Google Inc. |
| */ |
| #ifndef STREAMING_H |
| #define STREAMING_H 1 |
| |
| #include "object.h" |
| #include "odb.h" |
| |
| struct object_database; |
| struct odb_stream; |
| struct stream_filter; |
| |
| typedef int (*odb_stream_close_fn)(struct odb_stream *); |
| typedef ssize_t (*odb_stream_read_fn)(struct odb_stream *, char *, size_t); |
| |
| /* |
| * A stream that can be used to read an object from or write an object into the |
| * object database without loading all of it into memory. |
| */ |
| struct odb_stream { |
| odb_stream_close_fn close; |
| odb_stream_read_fn read; |
| enum object_type type; |
| size_t size; /* inflated size of full object */ |
| }; |
| |
| /* |
| * Create a new object stream for the given object. An optional filter can be |
| * used to transform the object's content. |
| * |
| * Returns the stream on success, a `NULL` pointer otherwise. |
| */ |
| struct odb_stream *odb_stream_from_object(struct object_database *odb, |
| const struct object_id *oid, |
| struct stream_filter *filter); |
| |
| /* |
| * Create a new object stream for the given file descriptor. This can be used |
| * to, for example, stream an object into the object database. This function |
| * does _not_ take ownership of the file descriptor. It's the responsibility of |
| * the caller to close it after the stream has been closed. |
| */ |
| struct odb_stream *odb_stream_from_fd(int fd, size_t size, enum object_type type); |
| |
| /* |
| * Close the given object stream and release all resources associated with it. |
| * Returns 0 on success, a negative error code otherwise. |
| */ |
| int odb_stream_close(struct odb_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_stream_read(struct odb_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 */ |