# mongoc_gridfs_bucket_t

## Synopsis

    #include <mongoc/mongoc.h>

    typedef struct _mongoc_gridfs_bucket_t mongoc_gridfs_bucket_t;

## Description

`mongoc_gridfs_bucket_t` provides a spec-compliant MongoDB GridFS implementation, superseding mongoc_gridfs_t. See the GridFS MongoDB documentation.

## Thread Safety

mongoc_gridfs_bucket_t is NOT thread-safe and should only be used in the same thread as the owning mongoc_client_t.

## Lifecycle

It is an error to free a mongoc_gridfs_bucket_t before freeing all derived instances of mongoc_stream_t. The owning mongoc_client_t must outlive the mongoc_gridfs_bucket_t.

## Example

example-gridfs-bucket.c

    #include <stdio.h>
    #include <stdlib.h>

    #include <mongoc/mongoc.h>

    int
    main (int argc, char *argv[])
    {
       const char *uri_string =
          "mongodb://localhost:27017/?appname=new-gridfs-example";
       mongoc_client_t *client;
       mongoc_database_t *db;
       mongoc_stream_t *file_stream;
       mongoc_gridfs_bucket_t *bucket;
       mongoc_cursor_t *cursor;
       bson_t filter;
       bool res;
       bson_value_t file_id;
       bson_error_t error;
       const bson_t *doc;
       char *str;
       mongoc_init ();

       if (argc != 3) {
          fprintf (stderr, "usage: %s SOURCE_FILE_PATH FILE_COPY_PATH\n", argv[0]);
          return EXIT_FAILURE;
       }

       /* 1. Make a bucket. */
       client = mongoc_client_new (uri_string);
       db = mongoc_client_get_database (client, "test");
       bucket = mongoc_gridfs_bucket_new (db, NULL, NULL, &error);
       if (!bucket) {
          printf ("Error creating gridfs bucket: %s\n", error.message);
          return EXIT_FAILURE;
       }

       /* 2. Insert a file.  */
       file_stream = mongoc_stream_file_new_for_path (argv[1], O_RDONLY, 0);
       res = mongoc_gridfs_bucket_upload_from_stream (
          bucket, "my-file", file_stream, NULL, &file_id, &error);
       if (!res) {
          printf ("Error uploading file: %s\n", error.message);
          return EXIT_FAILURE;
       }

       mongoc_stream_close (file_stream);
       mongoc_stream_destroy (file_stream);

       /* 3. Download the file in GridFS to a local file. */
       file_stream = mongoc_stream_file_new_for_path (argv[2], O_CREAT | O_RDWR, 0);
       if (!file_stream) {
          perror ("Error opening file stream");
          return EXIT_FAILURE;
       }

       res = mongoc_gridfs_bucket_download_to_stream (
          bucket, &file_id, file_stream, &error);
       if (!res) {
          printf ("Error downloading file to stream: %s\n", error.message);
          return EXIT_FAILURE;
       }
       mongoc_stream_close (file_stream);
       mongoc_stream_destroy (file_stream);

       /* 4. List what files are available in GridFS. */
       bson_init (&filter);
       cursor = mongoc_gridfs_bucket_find (bucket, &filter, NULL);

       while (mongoc_cursor_next (cursor, &doc)) {
          str = bson_as_canonical_extended_json (doc, NULL);
          printf ("%s\n", str);
          bson_free (str);
       }

       /* 5. Delete the file that we added. */
       res = mongoc_gridfs_bucket_delete_by_id (bucket, &file_id, &error);
       if (!res) {
          printf ("Error deleting the file: %s\n", error.message);
          return EXIT_FAILURE;
       }

       /* 6. Cleanup. */
       mongoc_stream_close (file_stream);
       mongoc_stream_destroy (file_stream);
       mongoc_cursor_destroy (cursor);
       bson_destroy (&filter);
       mongoc_gridfs_bucket_destroy (bucket);
       mongoc_database_destroy (db);
       mongoc_client_destroy (client);
       mongoc_cleanup ();

       return EXIT_SUCCESS;
    }

## See also

- The MongoDB GridFS specification.
- The non spec-compliant mongoc_gridfs_t.

## Functions

- mongoc_gridfs_bucket_abort_upload()
- mongoc_gridfs_bucket_delete_by_id()
- mongoc_gridfs_bucket_destroy()
- mongoc_gridfs_bucket_download_to_stream()
- mongoc_gridfs_bucket_find()
- mongoc_gridfs_bucket_new()
- mongoc_gridfs_bucket_open_download_stream()
- mongoc_gridfs_bucket_open_upload_stream()
- mongoc_gridfs_bucket_open_upload_stream_with_id()
- mongoc_gridfs_bucket_stream_error()
- mongoc_gridfs_bucket_upload_from_stream()
- mongoc_gridfs_bucket_upload_from_stream_with_id()