| /* | |
| * 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 */ |