RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   04-Oct-2014 19:21:57
  Branch: rpm-5_4                          Handle: 2014100417215601

  Modified files:           (Branch: rpm-5_4)
    rpm/rpmio               librpmio.vers rpmgfs.c rpmgfs.h tgfs.c

  Log:
    - rpmgfs: add rpmgfsDel.

  Summary:
    Revision    Changes     Path
    2.199.2.51  +1  -0      rpm/rpmio/librpmio.vers
    1.1.2.4     +106 -68    rpm/rpmio/rpmgfs.c
    1.1.2.3     +34 -3      rpm/rpmio/rpmgfs.h
    1.1.2.2     +7  -1      rpm/rpmio/tgfs.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.199.2.50 -r2.199.2.51 librpmio.vers
  --- rpm/rpmio/librpmio.vers   3 Oct 2014 19:20:14 -0000       2.199.2.50
  +++ rpm/rpmio/librpmio.vers   4 Oct 2014 17:21:56 -0000       2.199.2.51
  @@ -433,6 +433,7 @@
       rpmGetPath;
       _rpmgfs_debug;
       _rpmgfsI;
  +    rpmgfsDel;
       rpmgfsDump;
       rpmgfsGet;
       rpmgfsList;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmgfs.c
  ============================================================================
  $ cvs diff -u -r1.1.2.3 -r1.1.2.4 rpmgfs.c
  --- rpm/rpmio/rpmgfs.c        3 Oct 2014 19:20:14 -0000       1.1.2.3
  +++ rpm/rpmio/rpmgfs.c        4 Oct 2014 17:21:56 -0000       1.1.2.4
  @@ -69,89 +69,128 @@
   
   }
   
  +static void * rpmgfsChk(rpmgfs gfs, const char * msg,
  +             bson_error_t * bep, void * p)
  +{
  +    if (p == NULL) {
  +fprintf(stderr, "*** %s: (%u.%u) %s\n", msg, bep->domain, bep->code, 
bep->message);
  +    }
  +    return p;
  +}
  +
   /*==============================================================*/
  -int rpmgfsGet(rpmgfs gfs, const char * sfn)
  +int rpmgfsGet(rpmgfs gfs, const char * dfn, const char * sfn)
   {
  +    mongoc_stream_t *S = NULL;
  +    mongoc_gridfs_file_t *F = NULL;
       char buf[BUFSIZ];
       bson_error_t berr;
  +    FD_t fd = NULL;
       ssize_t nr;
       int rc = 1;              /* assume failure */
   
  +    if (dfn == NULL)
  +     dfn = "-";
  +    fd = Fopen(dfn, "w");
  +    if (fd == NULL || Ferror(fd))
  +     goto exit;
  +
       gfs->iov.iov_base = (void *)buf;
       gfs->iov.iov_len = sizeof buf;
   
  -    gfs->F = mongoc_gridfs_find_one_by_filename(gfs->G, sfn, &berr);
  -    if (gfs->F == NULL) {
  -fprintf(stderr, "*** %s: (%u.%u) %s\n", __FUNCTION__, berr.domain, 
berr.code, berr.message);
  +    F = rpmgfsChk(gfs, __FUNCTION__, &berr,
  +             mongoc_gridfs_find_one_by_filename(gfs->G, sfn, &berr));
  +    if (F == NULL)
        goto exit;
  -    }
   
  -    gfs->S = mongoc_stream_gridfs_new(gfs->F);
  -    if (gfs->S == NULL)
  +    S = mongoc_stream_gridfs_new(F);
  +    if (S == NULL)
        goto exit;
   
       for (;;) {
  -     nr = mongoc_stream_readv(gfs->S, &gfs->iov, 1, -1, 0);
  +     nr = mongoc_stream_readv(S, &gfs->iov, 1, -1, 0);
        if (nr < 0)
            goto exit;
        if (nr == 0)
               break;
   
  -     if (fwrite(gfs->iov.iov_base, nr, 1, stdout) != (size_t)nr)
  +     if (Fwrite(gfs->iov.iov_base, nr, 1, fd) != (size_t)nr)
            goto exit;
       }
       rc = 0;
   
   exit:
   SPEW((stderr, "<-- %s(%p,%s) rc %d\n", __FUNCTION__, gfs, sfn, rc));
  -#ifdef       NOTYET
  -    if (gfs->S)
  -     mongoc_stream_destroy(gfs->S);
  -#endif
  -    gfs->S = NULL;
  -#ifdef       NOTYET
  -    if (gfs->F)
  -     mongoc_gridfs_file_destroy(gfs->F);
  -#endif
  -    gfs->F = NULL;
  +    if (fd)
  +     (void) Fclose(fd);
  +    if (S)
  +     mongoc_stream_destroy(S);
  +    if (F)
  +     mongoc_gridfs_file_destroy(F);
       return rc;
   }
   
   int rpmgfsPut(rpmgfs gfs, const char * dfn, const char * sfn)
   {
  +    mongoc_stream_t *S = NULL;
  +    mongoc_gridfs_file_t *F = NULL;
       mongoc_gridfs_file_opt_t opt = { 0 };
       int rc = 1;              /* assume failure */
   
  -    gfs->S = mongoc_stream_file_new_for_path(sfn, O_RDONLY, 0);
  -    if (gfs->S == NULL)
  +    S = mongoc_stream_file_new_for_path(sfn, O_RDONLY, 0);
  +    if (S == NULL)
        goto exit;
   
  +    /* XXX fill in other fields */
       opt.filename = dfn;
   
  -    gfs->F = mongoc_gridfs_create_file_from_stream(gfs->G, gfs->S, &opt);
  -    if (gfs->F == NULL)
  +    F = mongoc_gridfs_create_file_from_stream(gfs->G, S, &opt);
  +    if (F == NULL)
        goto exit;
   
  -    mongoc_gridfs_file_save(gfs->F);
  +    mongoc_gridfs_file_save(F);
       rc = 0;
   
   exit:
   SPEW((stderr, "<-- %s(%p,%s,%s) rc %d\n", __FUNCTION__, gfs, dfn, sfn, rc));
  -#ifdef       NOTYET
  -    if (gfs->S)
  -     mongoc_stream_destroy(gfs->S);
  +#ifdef       SEGFAULT
  +    if (S)
  +     mongoc_stream_destroy(S);
   #endif
  -    gfs->S = NULL;
  -#ifdef       NOTYET
  -    if (gfs->F)
  -     mongoc_gridfs_file_destroy(gfs->F);
  -#endif
  -    gfs->F = NULL;
  +    if (F)
  +     mongoc_gridfs_file_destroy(F);
  +    return rc;
  +}
  +
  +int rpmgfsDel(rpmgfs gfs, const char * sfn)
  +{
  +    bson_error_t berr;
  +    mongoc_gridfs_file_t *F = NULL;
  +    int rc = 1;              /* assume failure */
  +
  +    F = rpmgfsChk(gfs, __FUNCTION__, &berr,
  +             mongoc_gridfs_find_one_by_filename(gfs->G, sfn, &berr));
  +    if (F == NULL)
  +     goto exit;
  +
  +    if (!mongoc_gridfs_file_remove(F, &berr)) {
  +     (void) rpmgfsChk(gfs, __FUNCTION__, &berr, NULL);
  +     goto exit;
  +    }
  +
  +    rc = 0;
  +
  +exit:
  +SPEW((stderr, "<-- %s(%p,%s) rc %d\n", __FUNCTION__, gfs, sfn, rc));
  +    if (F)
  +     mongoc_gridfs_file_destroy(F);
       return rc;
   }
   
   int rpmgfsList(rpmgfs gfs)
   {
  +    mongoc_gridfs_file_t *F = NULL;
  +    mongoc_gridfs_file_list_t *D = NULL;
       bson_t query;
       bson_t child;
       int rc = 0;
  @@ -163,43 +202,43 @@
       bson_append_document_begin(&query, "$query", -1, &child);
       bson_append_document_end(&query, &child);
   
  -    gfs->D = mongoc_gridfs_find(gfs->G, &query);
  +    D = mongoc_gridfs_find(gfs->G, &query);
   
       bson_destroy (&query);
   
  -    while ((gfs->F = mongoc_gridfs_file_list_next(gfs->D))) {
  -     const char * md5 = mongoc_gridfs_file_get_md5(gfs->F);
  -     const char * fn = mongoc_gridfs_file_get_filename(gfs->F);
  -     const char * content_type = mongoc_gridfs_file_get_content_type(gfs->F);
  -     const bson_t * aliases =  mongoc_gridfs_file_get_aliases(gfs->F);
  -     const bson_t * metadata =  mongoc_gridfs_file_get_metadata(gfs->F);
  -     uint64_t length = mongoc_gridfs_file_get_length(gfs->F);
  -     uint32_t chunk_size = mongoc_gridfs_file_get_chunk_size(gfs->F);
  -     time_t upload_date = mongoc_gridfs_file_get_upload_date(gfs->F);
  +    while ((F = mongoc_gridfs_file_list_next(D))) {
  +     const char * md5 = mongoc_gridfs_file_get_md5(F);
  +     const char * fn = mongoc_gridfs_file_get_filename(F);
  +     const char * content_type = mongoc_gridfs_file_get_content_type(F);
  +     const bson_t * aliases =  mongoc_gridfs_file_get_aliases(F);
  +     const bson_t * metadata =  mongoc_gridfs_file_get_metadata(F);
  +     uint64_t length = mongoc_gridfs_file_get_length(F);
  +     uint32_t chunk_size = mongoc_gridfs_file_get_chunk_size(F);
  +     int64_t upload_msecs = mongoc_gridfs_file_get_upload_date(F);
  +     time_t secs = (time_t) (upload_msecs/1000);
  +     struct tm _tm;
  +     struct tm *tm = gmtime_r(&secs, &_tm);
  +     char _iso[64];
   
        (void)aliases;
        (void)metadata;
  -     (void)upload_date;
  -     printf("%s %s\t%8lu(%uk)\t%s\n",
  +
  +     (void) strftime(_iso, sizeof(_iso), "%FT%T", tm);
  +
  +     printf("%s %s\t%8lu(%uk) %s\t%s\n",
                (md5 ? md5 : ""), (content_type ? content_type : ""),
                (unsigned long)length, (unsigned)((chunk_size+1023)/1024),
  -             fn);
  +             _iso, fn);
   
  -     mongoc_gridfs_file_destroy(gfs->F);
  -     gfs->F = NULL;
  +     mongoc_gridfs_file_destroy(F);
  +     F = NULL;
       }
   
   SPEW((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, gfs, rc));
  -#ifdef       NOTYET
  -    if (gfs->F)
  -     mongoc_gridfs_file_destroy(gfs->F);
  -#endif
  -    gfs->F = NULL;
  -#ifdef       NOTYET
  -    if (gfs->D)
  -     mongoc_gridfs_file_list_destroy(gfs->D);
  -#endif
  -    gfs->D = NULL;
  +    if (F)
  +     mongoc_gridfs_file_destroy(F);
  +    if (D)
  +     mongoc_gridfs_file_list_destroy(D);
       return rc;
   }
   
  @@ -220,7 +259,7 @@
       const bson_t * doc = NULL;
       bson_error_t berr;
       bson_t query = BSON_INITIALIZER;
  -    FILE * fp = NULL;
  +    FD_t fd = NULL;
       char * fn = NULL;
       int rc = EXIT_SUCCESS;
   
  @@ -228,8 +267,8 @@
       if (access(fn, F_OK))
        unlink(fn);
   
  -    fp = fopen(fn, "w");
  -    if (fp == NULL) {
  +    fd = Fopen(fn, "w");
  +    if (fd == NULL || Ferror(fd)) {
        fprintf (stderr, "Failed to open \"%s\", aborting.\n", fn);
        goto exit;
       }
  @@ -242,7 +281,7 @@
                                       &query, NULL, NULL);
   
       while (mongoc_cursor_next(cursor, &doc)) {
  -     size_t nw = fwrite(bson_get_data(doc), 1, doc->len, fp);
  +     size_t nw = Fwrite(bson_get_data(doc), 1, doc->len, fd);
        if (BSON_UNLIKELY(doc->len != nw)) {
            fprintf(stderr, "Failed to write %u bytes to %s\n", doc->len, fn);
            goto exit;
  @@ -259,8 +298,8 @@
   SPEW((stderr, "<-- %s(%p,%s,%s) rc %d\n", __FUNCTION__, gfs, database, 
collection, rc));
       if (fn)
        bson_free(fn);
  -    if (fp)
  -     fclose(fp);
  +    if (fd)
  +     (void) Fclose(fd);
       if (cursor)
        mongoc_cursor_destroy(cursor);
       if (col)
  @@ -339,11 +378,10 @@
        goto exit;
       }
   
  -    str = mongoc_client_get_database_names(gfs->C, &berr);
  -    if (str == NULL) {
  -fprintf(stderr, "*** %s: (%u.%u) %s\n", __FUNCTION__, berr.domain, 
berr.code, berr.message);
  +    str = rpmgfsChk(gfs, __FUNCTION__, &berr,
  +             mongoc_client_get_database_names(gfs->C, &berr));
  +    if (str == NULL)
        goto exit;
  -    }
   
       for (i = 0; str[i]; i++) {
        if (mongoc_dump_database(gfs, str[i], NULL) != EXIT_SUCCESS)
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmgfs.h
  ============================================================================
  $ cvs diff -u -r1.1.2.2 -r1.1.2.3 rpmgfs.h
  --- rpm/rpmio/rpmgfs.h        3 Oct 2014 19:20:14 -0000       1.1.2.2
  +++ rpm/rpmio/rpmgfs.h        4 Oct 2014 17:21:57 -0000       1.1.2.3
  @@ -110,13 +110,44 @@
        /*@globals fileSystem, internalState @*/
        /*@modifies fileSystem, internalState @*/;
   
  -
  -int rpmgfsGet(rpmgfs gfs, const char * sfn);
  -
  +/**
  + * Copy a file from GridFS.
  + * @param gfs                mongo wrapper
  + * @param dfn                local file name (NULL prints to stdout)
  + * @param sfn                GridFS file name
  + * @return           0 on success
  + */
  +int rpmgfsGet(rpmgfs gfs, const char * dfn, const char * sfn);
  +
  +/**
  + * Copy a file into GridFS.
  + * @param gfs                mongo wrapper
  + * @param dfn                GridFS file name
  + * @param sfn                local file name
  + * @return           0 on success
  + */
   int rpmgfsPut(rpmgfs gfs, const char * dfn, const char * sfn);
   
  +/**
  + * Delete a file in GridFS.
  + * @param gfs                mongo wrapper
  + * @param sfn                file name
  + * @return           0 on success
  + */
  +int rpmgfsDel(rpmgfs gfs, const char * fn);
  +
  +/**
  + * List files in GridFS.
  + * @param gfs                mongo wrapper
  + * @return           0 on success
  + */
   int rpmgfsList(rpmgfs gfs);
   
  +/**
  + * Dump gfs database.
  + * @param gfs                mongo wrapper
  + * @return           0 on success
  + */
   int rpmgfsDump(rpmgfs gfs);
   
   #ifdef __cplusplus
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tgfs.c
  ============================================================================
  $ cvs diff -u -r1.1.2.1 -r1.1.2.2 tgfs.c
  --- rpm/rpmio/tgfs.c  3 Oct 2014 19:20:14 -0000       1.1.2.1
  +++ rpm/rpmio/tgfs.c  4 Oct 2014 17:21:57 -0000       1.1.2.2
  @@ -40,13 +40,19 @@
            fprintf(stderr, "usage - %s get filename\n", __progname);
            goto exit;
        }
  -     rc = rpmgfsGet(gfs, av[1]);
  +     rc = rpmgfsGet(gfs, NULL, av[1]);
       } else if (strcmp(av[0], "put") == 0) {
        if (ac != 3) {
            fprintf(stderr, "usage - %s put filename input_file\n", __progname);
            goto exit;
        }
        rc = rpmgfsPut(gfs, av[1], av[2]);
  +    } else if (strcmp(av[0], "del") == 0) {
  +     if (ac != 2) {
  +         fprintf(stderr, "usage - %s del filename\n", __progname);
  +         goto exit;
  +     }
  +     rc = rpmgfsDel(gfs, av[1]);
       } else if (strcmp(av[0], "list") == 0) {
        rc = rpmgfsList(gfs);
       } else if (strcmp(av[0], "dump") == 0) {
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to