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:   03-Oct-2014 21:20:15
  Branch: rpm-5_4                          Handle: 2014100319201004

  Added files:              (Branch: rpm-5_4)
    rpm/rpmio               tgfs.c
  Modified files:           (Branch: rpm-5_4)
    rpm                     CHANGES
    rpm/macros              macros.in
    rpm/rpmio               Makefile.am librpmio.vers rpmgfs.c rpmgfs.h

  Log:
    - rpmgfs: stub in macros and put/list/get/dump methods.
    - mongo: upgrade to mongo-c-driver 1.0.1

  Summary:
    Revision    Changes     Path
    1.3501.2.452+2  -0      rpm/CHANGES
    1.39.2.43   +13 -12     rpm/macros/macros.in
    1.293.2.42  +5  -2      rpm/rpmio/Makefile.am
    2.199.2.50  +4  -4      rpm/rpmio/librpmio.vers
    1.1.2.3     +371 -73    rpm/rpmio/rpmgfs.c
    1.1.2.2     +17 -4      rpm/rpmio/rpmgfs.h
    1.1.2.1     +144 -0     rpm/rpmio/tgfs.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3501.2.451 -r1.3501.2.452 CHANGES
  --- rpm/CHANGES       29 Sep 2014 22:15:02 -0000      1.3501.2.451
  +++ rpm/CHANGES       3 Oct 2014 19:20:10 -0000       1.3501.2.452
  @@ -1,4 +1,6 @@
   5.4.15 -> 5.4.16:
  +    - jbj: rpmgfs: stub in macros and put/list/get/dump methods.
  +    - jbj: mongo: upgrade to mongo-c-driver 1.0.1
       - jbj: mongo: resurrect unit tests.
       - jbj: rpmsq: add _rpm_{insque,remque} functions.
       - jbj: gcc: make peace with 4.8.2.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/macros/macros.in
  ============================================================================
  $ cvs diff -u -r1.39.2.42 -r1.39.2.43 macros.in
  --- rpm/macros/macros.in      8 Sep 2014 20:55:53 -0000       1.39.2.42
  +++ rpm/macros/macros.in      3 Oct 2014 19:20:11 -0000       1.39.2.43
  @@ -1,7 +1,7 @@
   #/*! \page config_macros Default configuration: @USRLIBRPM@/macros
   # \verbatim
   #
  -# $Id: macros.in,v 1.39.2.42 2014/09/08 20:55:53 jbj Exp $
  +# $Id: macros.in,v 1.39.2.43 2014/10/03 19:20:11 jbj Exp $
   #
   # This is a global RPM configuration file. All changes made here will
   # be lost when the rpm package is upgraded. Any per-system configuration
  @@ -289,18 +289,19 @@
   #%__sqldir   %{__varlibwdj}/sql
   #%__l10ndir  %{__varlibwdj}/l10n
   
  -#    Elements necessary to construct a mongodb:// URI configurably
  +#    Elements to construct a GridFS mongodb:/// URI configurably
   #
  -#%__mongodb_user             luser
  -#%__mongodb_password %{nil}
  -#%__mongodb_host             hw.jbj.org
  -#%__mongodb_port             10017
  -#%__mongodb_database cooker
  -#%_mongodb 
mongodb://%{__mongodb_user}:%{__mongodb_password}@%{__mongodb_host}:%{__mongodb_port}/%{__mongodb_database}
  -
  -#    Macros used for mongo shell import spewage templating
  -#    XXX non-functional atm, /usr/lib/rpm/qf *.mongo templates for now.
  -#%__mongodb_collection       packages
  +%_gfs_scheme mongodb
  +%__gfs_u     luser
  +%__gfs_pw    jasnl
  +%_gfs_user   %{__gfs_u}%{?__gfs_pw::%{__gfs_pw}}
  +%__gfs_h     localhost
  +%__gfs_p     27017
  +%_gfs_host   %{?_gfs_user:%{_gfs_user}@}%{__gfs_h}%{?__gfs_p::%{__gfs_p}}
  +%_gfs_db     gfs
  +%_gfs_coll   fs
  +%_gfs_opts   ?ssl=false
  +%_gfs_uri    %{_gfs_scheme}://%{_gfs_host}/%{_gfs_db}
   
   #
   # JVM options
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.293.2.41 -r1.293.2.42 Makefile.am
  --- rpm/rpmio/Makefile.am     1 Oct 2014 15:27:31 -0000       1.293.2.41
  +++ rpm/rpmio/Makefile.am     3 Oct 2014 19:20:14 -0000       1.293.2.42
  @@ -11,7 +11,7 @@
        fnmatch_loop.c getdate.y html-parse.c html-parse.h libsqlio.c \
        rpmcpio.c rpmcpio.h rpmgenbasedir.c rpmgenpkglist.c rpmgensrclist.c \
        rpmjsio.msg rpmtar.c rpmtar.h \
  -     tdir.c tfts.c tget.c tgit.c tglob.c thkp.c thtml.c tinv.c tkey.c \
  +     tdir.c tfts.c tget.c tgfs.c tgit.c tglob.c thkp.c thtml.c tinv.c tkey.c 
\
        tmire.c todbc.c tput.c tpython.c trpmio.c tsexp.c tsvn.c tsw.c tybi.c \
        lookup3.c testit.sh mongoc-counters.defs
   
  @@ -26,7 +26,7 @@
        tmire todbc toid tperl tpython tput trpmio tsexp tsvn tsw ttcl tybi \
        dumpasn1 lookup3 trel
   
  -noinst_PROGRAMS += b2sum tset tblake2b tblake2bp tblake2s tblake2sp
  +noinst_PROGRAMS += b2sum tset tblake2b tblake2bp tblake2s tblake2sp tgfs
   if WITH_LIBGIT2
   noinst_PROGRAMS += tgit
   else
  @@ -493,6 +493,9 @@
   tget_SOURCES = tget.c
   tget_LDADD = $(RPMIO_LDADD_COMMON)
   
  +tgfs_SOURCES = tgfs.c
  +tgfs_LDADD = $(RPMIO_LDADD_COMMON)
  +
   tgit_SOURCES = tgit.c
   tgit_LDADD = $(RPMIO_LDADD_COMMON)
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.199.2.49 -r2.199.2.50 librpmio.vers
  --- rpm/rpmio/librpmio.vers   1 Oct 2014 21:02:48 -0000       2.199.2.49
  +++ rpm/rpmio/librpmio.vers   3 Oct 2014 19:20:14 -0000       2.199.2.50
  @@ -433,11 +433,11 @@
       rpmGetPath;
       _rpmgfs_debug;
       _rpmgfsI;
  -    rpmgfsClose;
  +    rpmgfsDump;
  +    rpmgfsGet;
  +    rpmgfsList;
       rpmgfsNew;
  -    rpmgfsOpen;
  -    rpmgfsRead;
  -    rpmgfsWrite;
  +    rpmgfsPut;
       _rpmgit_debug;
       _rpmgit_dir;
       _rpmgit_tree;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmgfs.c
  ============================================================================
  $ cvs diff -u -r1.1.2.2 -r1.1.2.3 rpmgfs.c
  --- rpm/rpmio/rpmgfs.c        1 Oct 2014 21:02:50 -0000       1.1.2.2
  +++ rpm/rpmio/rpmgfs.c        3 Oct 2014 19:20:14 -0000       1.1.2.3
  @@ -2,6 +2,7 @@
   
   #include <rpmiotypes.h>
   #include <rpmio.h>
  +#include <rpmmacro.h>
   #include <rpmlog.h>
   #include <rpmurl.h>
   
  @@ -11,119 +12,364 @@
   #include "debug.h"
   
   int _rpmgfs_debug;
  +#define      SPEW(_list)     if (_rpmgfs_debug) fprintf _list
   
   rpmgfs _rpmgfsI;
   
   static int gfs_nopens;
   
   /*==============================================================*/
  -ssize_t rpmgfsRead(rpmgfs gfs, void * buf, size_t count)
  +static void rpmgfsSpew(rpmgfs gfs)
   {
  -    bson_error_t err;
  -    ssize_t rc = 0;
  +    if (_rpmgfs_debug == 0)
  +     return;
   
  -    gfs->iov.iov_base = buf;
  -    gfs->iov.iov_len = count;
  +    fprintf(stderr, "\t    fn: %s\n",        gfs->fn);
  +    fprintf(stderr, "\t flags: 0x%x\n",      gfs->flags);
  +    fprintf(stderr, "\t  mode: 0%06o\n",     gfs->mode);
  +    fprintf(stderr, "\tscheme: %s\n",        gfs->scheme);
  +    fprintf(stderr, "\t     u: %s\n",        gfs->u);
  +    fprintf(stderr, "\t    pw: %s\n",        gfs->pw);
  +    fprintf(stderr, "\t  user: %s\n",        gfs->user);
  +    fprintf(stderr, "\t     h: %s\n",        gfs->h);
  +    fprintf(stderr, "\t     p: %s\n",        gfs->p);
  +    fprintf(stderr, "\t  host: %s\n",        gfs->host);
  +    fprintf(stderr, "\t    db: %s\n",        gfs->db);
  +    fprintf(stderr, "\t  coll: %s\n",        gfs->coll);
  +    fprintf(stderr, "\t  opts: %s\n",        gfs->opts);
  +    fprintf(stderr, "\t   uri: %s\n",        gfs->uri);
  +
  +    fprintf(stderr, "\t     C: %p\n",        gfs->C);
  +    fprintf(stderr, "\t     S: %p\n",        gfs->S);
  +    fprintf(stderr, "\t     G: %p\n",        gfs->G);
  +    fprintf(stderr, "\t     F: %p\n",        gfs->F);
  +    fprintf(stderr, "\t     D: %p\n",        gfs->D);
  +    fprintf(stderr, "\t   iov: %p[%u]\n",gfs->iov.iov_base, 
(unsigned)gfs->iov.iov_len);
  +}
   
  -    if (gfs->S == NULL) {
  -     gfs->F = mongoc_gridfs_find_one_by_filename(gfs->G, gfs->fn, &err);
  -assert(gfs->F);
  +static int m2rlevel[] = {
  +    RPMLOG_ERR,              /* 0 MONGOC_LOG_LEVEL_ERROR */
  +    RPMLOG_CRIT,     /* 1 MONGOC_LOG_LEVEL_CRITICAL */
  +    RPMLOG_WARNING,  /* 2 MONGOC_LOG_LEVEL_WARNING */
  +    RPMLOG_NOTICE,   /* 3 MONGOC_LOG_LEVEL_MESSAGE */
  +    RPMLOG_INFO,     /* 4 MONGOC_LOG_LEVEL_INFO */
  +    RPMLOG_DEBUG,    /* 5 MONGOC_LOG_LEVEL_DEBUG */
  +    RPMLOG_DEBUG,    /* 6 MONGOC_LOG_LEVEL_TRACE */
  +    RPMLOG_DEBUG,    /* 7 unused */
  +};
   
  -     gfs->S = mongoc_stream_gridfs_new(gfs->F);
  -assert(gfs->S);
  -    }
  +static void rpmgfsLog(mongoc_log_level_t _level, const char * _domain,
  +             const char * _message, void * _gfs)
  +{
  +    rpmgfs gfs = (rpmgfs) _gfs;
   
  -    for (;;) {
  -     size_t _iovcnt = 1;
  -     size_t _min_bytes = -1;
  -     int32_t _timeout_msec = 0;
  +SPEW((stderr, "--> %s(%s(%d), %s, %p) %s\n", __FUNCTION__, 
mongoc_log_level_str(_level), _level, _domain, gfs, _message));
   
  -     rc = mongoc_stream_readv(gfs->S, &gfs->iov, _iovcnt,
  -                     _min_bytes, _timeout_msec);
  +    rpmlog(m2rlevel[_level & 0x7], "gfs %p %s: %s\n", gfs, _domain, 
_message);
   
  -     if (rc <= 0) {
  -         goto exit;
  -     }
  +}
   
  -     if (fwrite(gfs->iov.iov_base, rc, 1, stdout) != (size_t)rc) {
  -         rc = -1;
  +/*==============================================================*/
  +int rpmgfsGet(rpmgfs gfs, const char * sfn)
  +{
  +    char buf[BUFSIZ];
  +    bson_error_t berr;
  +    ssize_t nr;
  +    int rc = 1;              /* assume failure */
  +
  +    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);
  +     goto exit;
  +    }
  +
  +    gfs->S = mongoc_stream_gridfs_new(gfs->F);
  +    if (gfs->S == NULL)
  +     goto exit;
  +
  +    for (;;) {
  +     nr = mongoc_stream_readv(gfs->S, &gfs->iov, 1, -1, 0);
  +     if (nr < 0)
            goto exit;
  -     }
  +     if (nr == 0)
  +            break;
   
  -     break;
  +     if (fwrite(gfs->iov.iov_base, nr, 1, stdout) != (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;
  +    return rc;
  +}
  +
  +int rpmgfsPut(rpmgfs gfs, const char * dfn, const char * sfn)
  +{
  +    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)
  +     goto exit;
  +
  +    opt.filename = dfn;
  +
  +    gfs->F = mongoc_gridfs_create_file_from_stream(gfs->G, gfs->S, &opt);
  +    if (gfs->F == NULL)
  +     goto exit;
  +
  +    mongoc_gridfs_file_save(gfs->F);
  +    rc = 0;
   
   exit:
  -    if (rc <= 0) {
  -     if (gfs->S)
  -         mongoc_stream_destroy(gfs->S);
  -     gfs->S = NULL;
  +SPEW((stderr, "<-- %s(%p,%s,%s) rc %d\n", __FUNCTION__, gfs, dfn, 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;
  +    return rc;
  +}
  +
  +int rpmgfsList(rpmgfs gfs)
  +{
  +    bson_t query;
  +    bson_t child;
  +    int rc = 0;
  +
  +    bson_init(&query);
  +    bson_append_document_begin(&query, "$orderby", -1, &child);
  +    bson_append_int32(&child, "filename", -1, 1);
  +    bson_append_document_end(&query, &child);
  +    bson_append_document_begin(&query, "$query", -1, &child);
  +    bson_append_document_end(&query, &child);
  +
  +    gfs->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);
  +
  +     (void)aliases;
  +     (void)metadata;
  +     (void)upload_date;
  +     printf("%s %s\t%8lu(%uk)\t%s\n",
  +             (md5 ? md5 : ""), (content_type ? content_type : ""),
  +             (unsigned long)length, (unsigned)((chunk_size+1023)/1024),
  +             fn);
  +
  +     mongoc_gridfs_file_destroy(gfs->F);
  +     gfs->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;
       return rc;
   }
   
  -ssize_t rpmgfsWrite(rpmgfs gfs, const void * buf, size_t count)
  +static bool
  +mongoc_dump_mkdir_p(const char * dn, mode_t mode)
   {
  -    bson_error_t err;
  -    ssize_t rc = 0;
  +   if (access(dn, F_OK) && mkdir(dn, mode))
  +     return false;
  +   return true;
  +}
   
  -    gfs->iov.iov_base = (void *) buf;
  -    gfs->iov.iov_len = count;
  +static int
  +mongoc_dump_collection(rpmgfs gfs,
  +             const char * database, const char * collection)
  +{
  +    mongoc_collection_t * col = NULL;
  +    mongoc_cursor_t * cursor = NULL;
  +    const bson_t * doc = NULL;
  +    bson_error_t berr;
  +    bson_t query = BSON_INITIALIZER;
  +    FILE * fp = NULL;
  +    char * fn = NULL;
  +    int rc = EXIT_SUCCESS;
  +
  +    fn = bson_strdup_printf("dump/%s/%s.bson", database, collection);
  +    if (access(fn, F_OK))
  +     unlink(fn);
  +
  +    fp = fopen(fn, "w");
  +    if (fp == NULL) {
  +     fprintf (stderr, "Failed to open \"%s\", aborting.\n", fn);
  +     goto exit;
  +    }
   
  -    if (gfs->S == NULL) {
  -     gfs->F = mongoc_gridfs_find_one_by_filename(gfs->G, gfs->fn, &err);
  -assert(gfs->F);
  +    col = mongoc_client_get_collection(gfs->C, database, collection);
  +    if (col == NULL)
  +     goto exit;
  +
  +    cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE, 0, 0, 0,
  +                                    &query, NULL, NULL);
  +
  +    while (mongoc_cursor_next(cursor, &doc)) {
  +     size_t nw = fwrite(bson_get_data(doc), 1, doc->len, fp);
  +     if (BSON_UNLIKELY(doc->len != nw)) {
  +         fprintf(stderr, "Failed to write %u bytes to %s\n", doc->len, fn);
  +         goto exit;
  +     }
  +    }
   
  -     gfs->S = mongoc_stream_gridfs_new(gfs->F);
  -assert(gfs->S);
  +    if (mongoc_cursor_error(cursor, &berr)) {
  +fprintf(stderr, "*** %s: (%u.%u) %s\n", __FUNCTION__, berr.domain, 
berr.code, berr.message);
  +     goto exit;
       }
  +    rc = EXIT_SUCCESS;
   
  -    for (;;) {
  -     size_t _iovcnt = 1;
  -     int32_t _timeout_msec = 0;
  +exit:
  +SPEW((stderr, "<-- %s(%p,%s,%s) rc %d\n", __FUNCTION__, gfs, database, 
collection, rc));
  +    if (fn)
  +     bson_free(fn);
  +    if (fp)
  +     fclose(fp);
  +    if (cursor)
  +     mongoc_cursor_destroy(cursor);
  +    if (col)
  +     mongoc_collection_destroy(col);
   
  -     rc = mongoc_stream_writev(gfs->S, &gfs->iov, _iovcnt, _timeout_msec);
  -assert(rc >= 0);
  +   return rc;
  +}
   
  -     break;
  +static int
  +mongoc_dump_database (rpmgfs gfs,
  +             const char * database, const char * collection)
  +{
  +    mongoc_database_t * db = NULL;
  +    bson_error_t berr;
  +    char * dn = NULL;
  +    char ** str = NULL;
  +    int rc = EXIT_FAILURE;
  +    int i;
  +
  +    BSON_ASSERT (database);
  +
  +    dn = bson_strdup_printf ("dump/%s", database);
  +    if (!mongoc_dump_mkdir_p(dn, 0750)) {
  +     fprintf (stderr, "%s: failed to create directory \"%s\"", __FUNCTION__, 
dn);
  +     goto exit;
       }
   
  -    if (rc <= 0) {
  -     if (gfs->S)
  -         mongoc_stream_destroy(gfs->S);
  -     gfs->S = NULL;
  +    if (collection && *collection) {
  +     rc = mongoc_dump_collection(gfs, database, collection);
  +     goto exit;
       }
  -    return rc;
  +
  +    db = mongoc_client_get_database(gfs->C, database);
  +    if (db == NULL)
  +     goto exit;
  +
  +    str = mongoc_database_get_collection_names(db, &berr);
  +    if (str == NULL) {
  +fprintf(stderr, "*** %s: (%u.%u) %s\n", __FUNCTION__, berr.domain, 
berr.code, berr.message);
  +     goto exit;
  +    }
  +
  +    for (i = 0; str[i]; i++) {
  +     if (mongoc_dump_collection(gfs, database, str[i]) != EXIT_SUCCESS)
  +         goto exit;
  +    }
  +    rc = EXIT_SUCCESS;
  +
  +exit:
  +SPEW((stderr, "<-- %s(%p,%s,%s) rc %d\n", __FUNCTION__, gfs, database, 
collection, rc));
  +    if (dn)
  +     bson_free (dn);
  +    if (db)
  +     mongoc_database_destroy(db);
  +    if (str)
  +     bson_strfreev(str);
  +
  +   return rc;
   }
   
  -int rpmgfsClose(rpmgfs gfs)
  +static int
  +mongoc_dump (rpmgfs gfs)
   {
  -    int rc = 0;
  +    bson_error_t berr;
  +    char ** str = NULL;
  +    int rc = EXIT_FAILURE;
  +    int i;
  +
  +    if (!mongoc_dump_mkdir_p("dump", 0750)) {
  +     perror("Failed to create directory \"dump\"");
  +     goto exit;
  +    }
   
  -    gfs->fn = _free(gfs->fn);
  -    gfs->flags = 0;
  -    gfs->mode = 0;
  +    if (gfs->db && *gfs->db) {
  +     rc = mongoc_dump_database(gfs, gfs->db, gfs->coll);
  +     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);
  +     goto exit;
  +    }
  +
  +    for (i = 0; str[i]; i++) {
  +     if (mongoc_dump_database(gfs, str[i], NULL) != EXIT_SUCCESS)
  +         goto exit;
  +    }
  +    rc = EXIT_SUCCESS;
  +
  +exit:
  +SPEW((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, gfs, rc));
  +    if (str)
  +     bson_strfreev(str);
   
       return rc;
   }
   
  -int rpmgfsOpen(rpmgfs gfs, const char * fn, int flags, mode_t mode)
  +int rpmgfsDump(rpmgfs gfs)
   {
  -    int rc = 0;
  -
  -    gfs->fn = _free(gfs->fn);
  -    gfs->fn = xstrdup(fn);
  -    gfs->flags = flags;
  -    gfs->mode = mode;
  +    int rc = mongoc_dump(gfs);
   
  +SPEW((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, gfs, rc));
       return rc;
   }
   
   /*==============================================================*/
   
   static void rpmgfsFini(void * _gfs)
  -     /*@globals fileSystem @*/
  -     /*@modifies *_gfs, fileSystem @*/
   {
       rpmgfs gfs = (rpmgfs) _gfs;
   
  @@ -139,20 +385,30 @@
        mongoc_client_destroy(gfs->C);
       gfs->C = NULL;
   
  -    if (--gfs_nopens == 0)
  +    if (--gfs_nopens <= 0)
        mongoc_cleanup();
  +    gfs_nopens = 0;
  +
  +    gfs->scheme      = _free(gfs->scheme);
  +    gfs->u   = _free(gfs->u);
  +    gfs->pw  = _free(gfs->pw);
  +    gfs->user        = _free(gfs->user);
  +    gfs->h   = _free(gfs->h);
  +    gfs->p   = _free(gfs->p);
  +    gfs->host        = _free(gfs->host);
  +    gfs->db  = _free(gfs->db);
  +    gfs->coll        = _free(gfs->coll);
  +    gfs->opts        = _free(gfs->opts);
  +    gfs->uri = _free(gfs->uri);
   
       gfs->fn = _free(gfs->fn);
       gfs->flags = 0;
       gfs->mode = 0;
   }
   
  -/*@unchecked@*/ /*@only@*/ /*@null@*/
   rpmioPool _rpmgfsPool = NULL;
   
   static rpmgfs rpmgfsGetPool(/*@null@*/ rpmioPool pool)
  -     /*@globals _rpmgfsPool, fileSystem @*/
  -     /*@modifies pool, _rpmgfsPool, fileSystem @*/
   {
       rpmgfs gfs;
   
  @@ -168,23 +424,65 @@
   
   rpmgfs rpmgfsNew(const char * fn, int flags)
   {
  -    static const char * _Curi =              "mongodb://127.0.0.1:27017";
  -    static const char * _Gdb =               "test";
  -    static const char * _Gprefix =   "fs";
       rpmgfs gfs = rpmgfsGetPool(_rpmgfsPool);
  -    bson_error_t err;
  +    char * _Curi = NULL;
  +    char * _Gdb = NULL;
  +    char * _Gprefix = NULL;
  +    bson_error_t berr;
   
  +SPEW((stderr, "--> %s(%s,0x%x)\n", __FUNCTION__, fn, flags));
       if (fn)
        gfs->fn = xstrdup(fn);
   
  -    if (gfs_nopens++ == 0)
  +    gfs->scheme      = rpmExpand("%{?_gfs_scheme}", NULL);
  +    gfs->u   = rpmExpand("%{?__gfs_u}", NULL);
  +    gfs->pw  = rpmExpand("%{?__gfs_pw}", NULL);
  +    gfs->user        = rpmExpand("%{?_gfs_user}", NULL);
  +    gfs->h   = rpmExpand("%{?__gfs_h}", NULL);
  +    gfs->p   = rpmExpand("%{?__gfs_p}", NULL);
  +    gfs->host        = rpmExpand("%{?_gfs_host}", NULL);
  +    gfs->db  = rpmExpand("%{?_gfs_db}", NULL);
  +#ifdef       NOTYET
  +    gfs->coll        = rpmExpand("%{?_gfs_coll}", NULL);
  +#else
  +    gfs->coll        = NULL;         /* XXX rpmgfsDump() needs NULL here. */
  +#endif
  +    gfs->opts        = rpmExpand("%{?_gfs_opts}", NULL);
  +    gfs->uri = rpmExpand("%{?_gfs_uri}", NULL);
  +
  +rpmgfsSpew(gfs);
  +
  +    if (gfs_nopens++ == 0) {
  +     mongoc_log_set_handler(rpmgfsLog, (void *)gfs);
        mongoc_init();
  +    }
   
  +    _Curi = xstrdup(gfs->uri);
  +    _Gdb = strrchr(_Curi, '/');
  +    if (_Gdb) {
  +     *_Gdb++ = '\0';
  +     _Gprefix = strchr(_Gdb, '.');
  +     if (_Gprefix) {
  +         char * t;
  +         *_Gprefix++ = '\0';
  +         t = strchr(_Gprefix, '.');
  +         if (t)
  +             *t++ = '\0';
  +     }
  +    } else {
  +     _Gdb = (char *) (gfs->db ? gfs->db : "gfs");
  +     _Gprefix = "fs";
  +    }
       gfs->C = mongoc_client_new(_Curi);
   assert(gfs->C);
   
  -    gfs->G = mongoc_client_get_gridfs(gfs->C, _Gdb, _Gprefix, &err);
  +    gfs->G = mongoc_client_get_gridfs(gfs->C, _Gdb, _Gprefix, &berr);
  +    if (gfs->G == NULL) {
  +     fprintf(stderr, "*** %s: (%u.%u) %s\n", __FUNCTION__, berr.domain, 
berr.code, berr.message);
  +    }
   assert(gfs->G);
   
  +    _Curi = _free(_Curi);
  +
       return rpmgfsLink(gfs);
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmgfs.h
  ============================================================================
  $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmgfs.h
  --- rpm/rpmio/rpmgfs.h        1 Oct 2014 15:27:33 -0000       1.1.2.1
  +++ rpm/rpmio/rpmgfs.h        3 Oct 2014 19:20:14 -0000       1.1.2.2
  @@ -33,6 +33,18 @@
       int flags;
       mode_t mode;
   
  +    const char * scheme;
  +    const char * u;
  +    const char * pw;
  +    const char * user;
  +    const char * h;
  +    const char * p;
  +    const char * host;
  +    const char * db;
  +    const char * coll;
  +    const char * opts;
  +    const char * uri;
  +
       mongoc_client_t *C;
       mongoc_stream_t *S;
   
  @@ -98,13 +110,14 @@
        /*@globals fileSystem, internalState @*/
        /*@modifies fileSystem, internalState @*/;
   
  -ssize_t rpmgfsRead(rpmgfs gfs, void * buf, size_t count);
   
  -ssize_t rpmgfsWrite(rpmgfs gfs, const void * buf, size_t count);
  +int rpmgfsGet(rpmgfs gfs, const char * sfn);
  +
  +int rpmgfsPut(rpmgfs gfs, const char * dfn, const char * sfn);
   
  -int rpmgfsClose(rpmgfs gfs);
  +int rpmgfsList(rpmgfs gfs);
   
  -int rpmgfsOpen(rpmgfs gfs, const char * fn, int flags, mode_t mode);
  +int rpmgfsDump(rpmgfs gfs);
   
   #ifdef __cplusplus
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tgfs.c
  ============================================================================
  $ cvs diff -u -r0 -r1.1.2.1 tgfs.c
  --- /dev/null 2014-10-03 21:15:55.000000000 +0200
  +++ tgfs.c    2014-10-03 21:20:15.235782530 +0200
  @@ -0,0 +1,144 @@
  +#include "system.h"
  +
  +#include <rpmio.h>
  +#include <poptIO.h>
  +
  +#define      _RPMGFS_INTERNAL
  +#include <rpmgfs.h>
  +
  +#include "debug.h"
  +
  +#define      SPEW(_list)     if (_rpmgfs_debug) fprintf _list
  +
  +static char * _gfs_fn =              "/foo/bar/baz";
  +static int _gfs_flags =              0;
  +
  +static char * _gfs_scheme =  "mongodb";
  +static char * __gfs_u =              "luser";
  +static char * __gfs_pw =     "jasnl";
  +static char * _gfs_user =    "%{__gfs_u}%{?__gfs_pw::%{__gfs_pw}}";
  +static char * __gfs_h =              "localhost";
  +static char * __gfs_p =              "27017";
  +static char * _gfs_host =
  +     "%{?_gfs_user:%{_gfs_user}@}%{__gfs_h}%{?__gfs_p::%{__gfs_p}}";
  +static char * _gfs_db =              "gfs";
  +static char * _gfs_coll =    "fs";
  +static char * _gfs_opts =    "?ssl=false";
  +static char * _gfs_uri =
  +     "%{_gfs_scheme}://%{_gfs_host}/%{_gfs_db}";
  +
  +/*==============================================================*/
  +static int doit(rpmgfs gfs, int ac, ARGV_t av)
  +{
  +    int rc = 1;              /* assume failure */
  +
  +    if (ac < 1 || av[0] == NULL) {
  +     /* XXX usage */
  +     goto exit;
  +    } else if (strcmp(av[0], "get") == 0) {
  +     if (ac != 2) {
  +         fprintf(stderr, "usage - %s get filename\n", __progname);
  +         goto exit;
  +     }
  +     rc = rpmgfsGet(gfs, 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], "list") == 0) {
  +     rc = rpmgfsList(gfs);
  +    } else if (strcmp(av[0], "dump") == 0) {
  +     rc = rpmgfsDump(gfs);
  +    } else {
  +     fprintf(stderr, "Unknown command: %s\n", av[0]);
  +     goto exit;
  +    }
  +
  +exit:
  +    return rc;
  +}
  +
  +/*==============================================================*/
  +
  +static struct poptOption rpmgfsOptionsTable[] = {
  +
  + { "scheme", 'S', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &_gfs_scheme, 0,
  +     N_("Set the GridFS SCHEME"),    N_("SCHEME") },
  +
  + { "u", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,     &__gfs_u, 0,
  +     N_("Set the GridFS U"), N_("U") },
  + { "pw", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,    &__gfs_pw, 0,
  +     N_("Set the GridFS PW"),        N_("PW") },
  + { "user", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,  &_gfs_user, 0,
  +     N_("Set the GridFS USER"),      N_("USER") },
  +
  + { "h", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,     &__gfs_h, 0,
  +     N_("Set the GridFS H"), N_("H") },
  + { "p", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,     &__gfs_p, 0,
  +     N_("Set the GridFS P"), N_("P") },
  + { "host", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,  &_gfs_host, 0,
  +     N_("Set the GridFS HOST"),      N_("HOST") },
  +
  + { "db", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,    &_gfs_db, 0,
  +     N_("Set the GridFS DB"),        N_("DB") },
  + { "coll", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,  &_gfs_coll, 0,
  +     N_("Set the GridFS COLL"),      N_("COLL") },
  + { "opts", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,  &_gfs_opts, 0,
  +     N_("Set the GridFS OPTS"),      N_("OPTS") },
  + { "uri", '\0', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,   &_gfs_uri, 0,
  +     N_("Set the GridFS URI"),       N_("URI") },
  +
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0,
  +     N_(" Common options for all rpmio executables:"), NULL },
  +
  +  POPT_AUTOALIAS
  +  POPT_AUTOHELP
  +
  +  { NULL, (char)-1, POPT_ARG_INCLUDE_TABLE, NULL, 0,
  +        N_("\
  +"), NULL },
  +
  +  POPT_TABLEEND
  +};
  +
  +int
  +main(int argc, char *argv[])
  +{
  +    poptContext con = rpmioInit(argc, argv, rpmgfsOptionsTable);
  +    rpmgfs gfs;
  +    ARGV_t av = poptGetArgs(con);
  +    int ac = argvCount(av);;
  +    int ec = -1;     /* assume failure */
  +
  +    /* XXX no macros are loaded if using poptIO. */
  +    addMacro(NULL, "_gfs_scheme",    NULL, _gfs_scheme, -1);
  +    addMacro(NULL, "__gfs_u",                NULL, __gfs_u, -1);
  +    addMacro(NULL, "__gfs_pw",               NULL, __gfs_pw, -1);
  +    addMacro(NULL, "_gfs_user",              NULL, _gfs_user, -1);
  +
  +    addMacro(NULL, "__gfs_h",                NULL, __gfs_h, -1);
  +    addMacro(NULL, "__gfs_p",                NULL, __gfs_p, -1);
  +    addMacro(NULL, "_gfs_host",              NULL, _gfs_host, -1);
  +
  +    if (_gfs_db)
  +     addMacro(NULL, "_gfs_db",               NULL, _gfs_db, -1);
  +    if (_gfs_coll)
  +     addMacro(NULL, "_gfs_coll",             NULL, _gfs_coll, -1);
  +    if (_gfs_opts)
  +     addMacro(NULL, "_gfs_opts",             NULL, _gfs_opts, -1);
  +    addMacro(NULL, "_gfs_uri",               NULL, _gfs_uri, -1);
  +
  +    gfs = rpmgfsNew(_gfs_fn, _gfs_flags);
  +
  +    ec = doit(gfs, ac, av);
  +
  +    gfs = rpmgfsFree(gfs);
  +
  +    con = rpmioFini(con);
  +
  +    rpmioClean();
  +
  +    return ec;
  +}
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to