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