There is a case when mongoc_gridfs_file_readv() returns -1 (failure), but the subsequent call to mongoc_gridfs_file_error() returns false indicating that there is no actual error.
This seems to contradict with what the manual states about mongoc_gridfs_file_readv():
Returns the number of bytes read, or -1 on failure. Use mongoc_gridfs_file_error to retrieve error details.
Interestingly, but for mongoc_gridfs_file_writev(), it states that errno will be set:
Returns the number of bytes written or -1 upon error and errno is set.
Not sure how potential database failures will be propagated via errno, but at least I can't blame this one for now albeit it looks a bit inconsistent.
Please see the example below.
#include <mongoc.h> int main() { mongoc_client_t *client; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; bson_error_t error; ssize_t n; char buf[] = "Some content for a new file"; mongoc_iovec_t iov = { .iov_base = buf, .iov_len = sizeof buf }; mongoc_init(); client = mongoc_client_new("mongodb://127.0.0.1"); BSON_ASSERT(client); gridfs = mongoc_client_get_gridfs(client, "test-gridfs", 0, &error); BSON_ASSERT(gridfs); file = mongoc_gridfs_create_file(gridfs, 0); // Create file BSON_ASSERT(file); BSON_ASSERT(mongoc_gridfs_file_writev(file, &iov, 1, 0) == sizeof buf); // Write contents BSON_ASSERT(mongoc_gridfs_file_seek(file, 0, SEEK_SET) == 0); // Set position to 0 BSON_ASSERT(mongoc_gridfs_file_save(file)); // Save file BSON_ASSERT(mongoc_gridfs_file_remove(file, &error)); // Remove file // Now the issue .... // mongoc_gridfs_file_readv() fails as expected BSON_ASSERT(mongoc_gridfs_file_readv(file, &iov, 1, sizeof buf, 0) == -1); // Now it's time to check for the actual error, right? // But the following will fail ... BSON_ASSERT(mongoc_gridfs_file_error(file, &error)); // Similarly, mongoc_gridfs_file_writev() fails as expected BSON_ASSERT(mongoc_gridfs_file_writev(file, &iov, 1, 0) == -1); // The following will fail if uncommented. Maybe that's expected though. // BSON_ASSERT(mongoc_gridfs_file_error(file, &error)); mongoc_gridfs_file_destroy(file); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); mongoc_cleanup(); return 0; }
The output:
$ ./a.out libmongoc3.c:34 main(): precondition failed: mongoc_gridfs_file_error(file, &error)
- related to
-
CDRIVER-2006 mongoc_gridfs_find_one_with_opts(): the error parameter is not initialized on failure
- Closed
-
CDRIVER-895 Review GridFS errno behavior/documentation
- Closed