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: 01-Oct-2014 17:27:34 Branch: rpm-5_4 Handle: 2014100115273102 Added files: (Branch: rpm-5_4) rpm/rpmio rpmgfs.c rpmgfs.h Modified files: (Branch: rpm-5_4) rpm/rpmio Makefile.am librpmio.vers poptIO.c rpmio.c Log: - gfs: stub in a gridfs object with file I/O. Summary: Revision Changes Path 1.293.2.41 +3 -1 rpm/rpmio/Makefile.am 2.199.2.48 +7 -0 rpm/rpmio/librpmio.vers 1.94.2.18 +3 -7 rpm/rpmio/poptIO.c 1.1.2.1 +190 -0 rpm/rpmio/rpmgfs.c 1.1.2.1 +113 -0 rpm/rpmio/rpmgfs.h 1.230.2.27 +4 -10 rpm/rpmio/rpmio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/Makefile.am ============================================================================ $ cvs diff -u -r1.293.2.40 -r1.293.2.41 Makefile.am --- rpm/rpmio/Makefile.am 30 Sep 2014 22:31:42 -0000 1.293.2.40 +++ rpm/rpmio/Makefile.am 1 Oct 2014 15:27:31 -0000 1.293.2.41 @@ -128,7 +128,8 @@ radiogatun.h \ salsa10.h salsa20.h shabal.h shavite3.h simd.h skein.h tib3.h tiger.h \ pcrs.h poptIO.h rpmacl.h rpmasn.h rpmaug.h rpmbag.h rpmbc.h rpmbz.h \ - rpmcdsa.h rpmct.h rpmcudf.h rpmcvs.h rpmdate.h rpmdav.h rpmdir.h rpmficl.h rpmgc.h rpmgit.h rpmhash.h \ + rpmcdsa.h rpmct.h rpmcudf.h rpmcvs.h rpmdate.h rpmdav.h rpmdir.h \ + rpmficl.h rpmgc.h rpmgfs.h rpmgit.h rpmhash.h \ rpmhkp.h rpmhook.h rpmio_internal.h rpmjni.h rpmjs.h rpmjsio.h \ rpmkeyring.h \ rpmku.h rpmltc.h rpmlua.h rpmmg.h rpmmrb.h rpmnix.h rpmnss.h \ @@ -185,6 +186,7 @@ rpmdir.c \ rpmficl.c \ rpmgc.c \ + rpmgfs.c \ rpmhash.c \ rpmhkp.c \ rpmhook.c \ @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/librpmio.vers ============================================================================ $ cvs diff -u -r2.199.2.47 -r2.199.2.48 librpmio.vers --- rpm/rpmio/librpmio.vers 30 Sep 2014 22:31:43 -0000 2.199.2.47 +++ rpm/rpmio/librpmio.vers 1 Oct 2014 15:27:31 -0000 2.199.2.48 @@ -431,6 +431,13 @@ rpmGenPath; rpmGetMacroEntries; rpmGetPath; + _rpmgfs_debug; + _rpmgfsI; + rpmgfsClose; + rpmgfsNew; + rpmgfsOpen; + rpmgfsRead; + rpmgfsWrite; _rpmgit_debug; _rpmgit_dir; _rpmgit_tree; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/poptIO.c ============================================================================ $ cvs diff -u -r1.94.2.17 -r1.94.2.18 poptIO.c --- rpm/rpmio/poptIO.c 30 Sep 2014 22:31:43 -0000 1.94.2.17 +++ rpm/rpmio/poptIO.c 1 Oct 2014 15:27:33 -0000 1.94.2.18 @@ -28,9 +28,7 @@ #include <rpmasn.h> #include <rpmtpm.h> -#ifdef NOTYET -#include <mongo.h> -#endif +#include <rpmgfs.h> #include <rpmaug.h> #include <rpmbag.h> @@ -697,10 +695,8 @@ N_("Debug rpmmg magic"), NULL}, { "rpmmrbdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmrb_debug, -1, N_("Debug embedded MRuby interpreter"), NULL}, -#ifdef NOTYET - { "mongodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmgo_debug, -1, - N_("Debug Mongo DB connection"), NULL}, -#endif + { "rpmgfsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmgfs_debug, -1, + N_("Debug Mongo DB gridfs connection"), NULL}, { "nixdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmnix_debug, -1, N_("Debug embedded Nix interpreter"), NULL}, { "odbcdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_odbc_debug, -1, @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmgfs.c ============================================================================ $ cvs diff -u -r0 -r1.1.2.1 rpmgfs.c --- /dev/null 2014-10-01 17:22:00.000000000 +0200 +++ rpmgfs.c 2014-10-01 17:27:34.354348790 +0200 @@ -0,0 +1,190 @@ +#include "system.h" + +#include <rpmiotypes.h> +#include <rpmio.h> +#include <rpmlog.h> +#include <rpmurl.h> + +#define _RPMGFS_INTERNAL +#include <rpmgfs.h> + +#include "debug.h" + +int _rpmgfs_debug; + +rpmgfs _rpmgfsI; + +static int gfs_opens; + +/*==============================================================*/ +ssize_t rpmgfsRead(rpmgfs gfs, void * buf, size_t count) +{ + bson_error_t err; + ssize_t rc = 0; + + gfs->iov.iov_base = buf; + gfs->iov.iov_len = count; + + if (gfs->S == NULL) { + gfs->F = mongoc_gridfs_find_one_by_filename(gfs->G, gfs->fn, &err); +assert(gfs->F); + + gfs->S = mongoc_stream_gridfs_new(gfs->F); +assert(gfs->S); + } + + for (;;) { + size_t _iovcnt = 1; + size_t _min_bytes = -1; + int32_t _timeout_msec = 0; + + rc = mongoc_stream_readv(gfs->S, &gfs->iov, _iovcnt, + _min_bytes, _timeout_msec); + + if (rc <= 0) { + goto exit; + } + + if (fwrite(gfs->iov.iov_base, rc, 1, stdout) != (size_t)rc) { + rc = -1; + goto exit; + } + + break; + } + +exit: + if (rc <= 0) { + if (gfs->S) + mongoc_stream_destroy(gfs->S); + gfs->S = NULL; + } + return rc; +} + +ssize_t rpmgfsWrite(rpmgfs gfs, const void * buf, size_t count) +{ + bson_error_t err; + ssize_t rc = 0; + + gfs->iov.iov_base = (void *) buf; + gfs->iov.iov_len = count; + + if (gfs->S == NULL) { + gfs->F = mongoc_gridfs_find_one_by_filename(gfs->G, gfs->fn, &err); +assert(gfs->F); + + gfs->S = mongoc_stream_gridfs_new(gfs->F); +assert(gfs->S); + } + + for (;;) { + size_t _iovcnt = 1; + int32_t _timeout_msec = 0; + + rc = mongoc_stream_writev(gfs->S, &gfs->iov, _iovcnt, _timeout_msec); +assert(rc >= 0); + + break; + } + + if (rc <= 0) { + if (gfs->S) + mongoc_stream_destroy(gfs->S); + gfs->S = NULL; + } + return rc; +} + +int rpmgfsClose(rpmgfs gfs) +{ + int rc = 0; + + gfs->fn = _free(gfs->fn); + gfs->flags = 0; + gfs->mode = 0; + + return rc; +} + +int rpmgfsOpen(rpmgfs gfs, const char * fn, int flags, mode_t mode) +{ + int rc = 0; + + gfs->fn = _free(gfs->fn); + gfs->fn = xstrdup(fn); + gfs->flags = flags; + gfs->mode = mode; + + return rc; +} + +/*==============================================================*/ + +static void rpmgfsFini(void * _gfs) + /*@globals fileSystem @*/ + /*@modifies *_gfs, fileSystem @*/ +{ + rpmgfs gfs = (rpmgfs) _gfs; + + if (gfs->S) + mongoc_stream_destroy(gfs->S); + gfs->S = NULL; + + if (gfs->G) + mongoc_gridfs_destroy(gfs->G); + gfs->G = NULL; + + if (gfs->C) + mongoc_client_destroy(gfs->C); + gfs->C = NULL; + + if (--gfs_opens == 0) + mongoc_cleanup(); + + 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; + + if (_rpmgfsPool == NULL) { + _rpmgfsPool = rpmioNewPool("gfs", sizeof(*gfs), -1, _rpmgfs_debug, + NULL, NULL, rpmgfsFini); + pool = _rpmgfsPool; + } + gfs = (rpmgfs) rpmioGetPool(pool, sizeof(*gfs)); + memset(((char *)gfs)+sizeof(gfs->_item), 0, sizeof(*gfs)-sizeof(gfs->_item)); + return gfs; +} + +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; + + if (fn) + gfs->fn = xstrdup(fn); + + if (gfs_opens++ == 0) + mongoc_init(); + + gfs->C = mongoc_client_new(_Curi); +assert(gfs->C); + + gfs->G = mongoc_client_get_gridfs(gfs->C, _Gdb, _Gprefix, &err); +assert(gfs->G); + + return rpmgfsLink(gfs); +} @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmgfs.h ============================================================================ $ cvs diff -u -r0 -r1.1.2.1 rpmgfs.h --- /dev/null 2014-10-01 17:22:00.000000000 +0200 +++ rpmgfs.h 2014-10-01 17:27:34.414353099 +0200 @@ -0,0 +1,113 @@ +#ifndef H_RPMGFS +#define H_RPMGFS + +/** \ingroup rpmio + * \file rpmio/rpmgfs.h + */ + +/** \ingroup rpmio + */ +typedef /*@refcounted@*/ struct rpmgfs_s * rpmgfs; + +/** \ingroup rpmgo + */ +/*@unchecked@*/ +extern int _rpmgfs_debug; + +/*@unchecked@*/ /*@relnull@*/ +extern rpmgfs _rpmgfsI; + +/*==============================================================*/ + +#if defined(_RPMGFS_INTERNAL) + +#include <bson.h> +#include <mongoc.h> + +/** \ingroup rpmio + */ +struct rpmgfs_s { + struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */ + + const char * fn; + int flags; + mode_t mode; + + mongoc_client_t *C; + mongoc_stream_t *S; + + mongoc_gridfs_t *G; + mongoc_gridfs_file_t *F; + mongoc_gridfs_file_list_t *D; + + mongoc_iovec_t iov; + +#if defined(__LCLINT__) +/*@refs@*/ + int nrefs; /*!< (unused) keep splint happy */ +#endif +}; +#endif /* _RPMGFS_INTERNAL */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Unreference a mongo wrapper instance. + * @param mgo mongo wrapper + * @return NULL on last dereference + */ +/*@unused@*/ /*@null@*/ +rpmgfs rpmgfsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmgfs mgo) + /*@modifies mgo @*/; +#define rpmgfsUnlink(_mgo) \ + ((rpmgfs)rpmioUnlinkPoolItem((rpmioItem)(_mgo), __FUNCTION__, __FILE__, __LINE__)) + +/** + * Reference a mongo wrapper instance. + * @param mgo mongo wrapper + * @return new mongo wrapper reference + */ +/*@unused@*/ /*@newref@*/ /*@null@*/ +rpmgfs rpmgfsLink (/*@null@*/ rpmgfs mgo) + /*@modifies mgo @*/; +#define rpmgfsLink(_mgo) \ + ((rpmgfs)rpmioLinkPoolItem((rpmioItem)(_mgo), __FUNCTION__, __FILE__, __LINE__)) + +/** + * Destroy a mongo wrapper. + * @param mgo mongo wrapper + * @return NULL on last dereference + */ +/*@null@*/ +rpmgfs rpmgfsFree(/*@killref@*/ /*@null@*/rpmgfs mgo) + /*@globals fileSystem @*/ + /*@modifies mgo, fileSystem @*/; +#define rpmgfsFree(_mgo) \ + ((rpmgfs)rpmioFreePoolItem((rpmioItem)(_mgo), __FUNCTION__, __FILE__, __LINE__)) + +/** + * Create and load a mongo wrapper. + * @param fn mongo file + * @param flags mongo flags + * @return new mongo wrapper + */ +/*@newref@*/ /*@null@*/ +rpmgfs rpmgfsNew(const char * fn, int flags) + /*@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 rpmgfsClose(rpmgfs gfs); + +int rpmgfsOpen(rpmgfs gfs, const char * fn, int flags, mode_t mode); + +#ifdef __cplusplus +} +#endif + +#endif /* H_RPMGFS */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmio.c ============================================================================ $ cvs diff -u -r1.230.2.26 -r1.230.2.27 rpmio.c --- rpm/rpmio/rpmio.c 30 Sep 2014 22:31:43 -0000 1.230.2.26 +++ rpm/rpmio/rpmio.c 1 Oct 2014 15:27:33 -0000 1.230.2.27 @@ -65,9 +65,7 @@ #include <rpmiotypes.h> #include <rpmmacro.h> /* XXX rpmioAccess needs rpmCleanPath() */ -#ifdef NOTYET -#include <mongo.h> -#endif +#include <rpmgfs.h> #include <rpmaug.h> #include <rpmct.h> @@ -3306,9 +3304,7 @@ extern rpmioPool _rpmluavPool; extern rpmioPool _rpmluaPool; extern rpmioPool _rpmmgPool; -#ifdef NOTYET - extern rpmioPool _rpmmgoPool; -#endif + extern rpmioPool _rpmgfsPool; extern rpmioPool _rpmmrbPool; #ifdef NOTYET extern rpmioPool _rpmnixPool; @@ -3370,10 +3366,8 @@ _rpmaugI = rpmaugFree(_rpmaugI); _rpmaugPool = rpmioFreePool(_rpmaugPool); -#ifdef NOTYET - _rpmmgoI = rpmmgoFree(_rpmmgoI); - _rpmmgoPool = rpmioFreePool(_rpmmgoPool); -#endif + _rpmgfsI = rpmgfsFree(_rpmgfsI); + _rpmgfsPool = rpmioFreePool(_rpmgfsPool); _rpmasnPool = rpmioFreePool(_rpmasnPool); _rpmbagPool = rpmioFreePool(_rpmbagPool); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org