There's more todo++ here figgering out how Distepoch:/Disttag:
SHOULD be represented in a MongoDB store.

The input I'm currently testing with is this:

        rpm -qa --wnh:primary.mongo

I haven't the foggies idea where Distepoch:/Disttag: fit
into the the MongoDB JSON/BSON analogue of repo-md primary.xml

Nor do I care that much because:

1) the template is trivially altered to include (or not) Distepoch:/Disttag:

2) whatever I am shoving into a MongoDB has diddly squat to do with repo-md
primary.xml.

But perhaps someone else wishes consistency/compatibility with the "de facto"
existing repo-md XML/SQLITE markup.

I personally stopped caring about repo-md years ago because of the
lack of anything but "de facto" markup that can never be meaningfully
changed by anyone not part of Fedorable.

73 de Jeff
On Apr 7, 2011, at 6:02 PM, Jeff Johnson wrote:

>  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:   08-Apr-2011 00:02:10
>  Branch: HEAD                             Handle: 2011040722020901
> 
>  Modified files:
>    rpm                     CHANGES
>    rpm/rpmdb               hdrfmt.c
> 
>  Log:
>    - spewage: fix: rework sql/json markup to use the EVRD parser.
> 
>  Summary:
>    Revision    Changes     Path
>    1.3605      +1  -0      rpm/CHANGES
>    1.153       +71 -44     rpm/rpmdb/hdrfmt.c
>  ____________________________________________________________________________
> 
>  patch -p0 <<'@@ .'
>  Index: rpm/CHANGES
>  ============================================================================
>  $ cvs diff -u -r1.3604 -r1.3605 CHANGES
>  --- rpm/CHANGES      6 Apr 2011 23:33:17 -0000       1.3604
>  +++ rpm/CHANGES      7 Apr 2011 22:02:09 -0000       1.3605
>  @@ -1,4 +1,5 @@
>   5.4.0 -> 5.4.1:
>  +    - jbj: spewage: fix: rework sql/json markup to use the EVRD parser.
>       - jbj: build: fix: resurrect %description -l XY yet again.
>       - jbj: build: fix: attempt arbitrary '%foo' tag iff '%' is seen.
>       - jbj: mongo: drag-in the test suite. grdfs/replica_sets todo++.
>  @@ .
>  patch -p0 <<'@@ .'
>  Index: rpm/rpmdb/hdrfmt.c
>  ============================================================================
>  $ cvs diff -u -r1.152 -r1.153 hdrfmt.c
>  --- rpm/rpmdb/hdrfmt.c       25 Jan 2011 18:11:53 -0000      1.152
>  +++ rpm/rpmdb/hdrfmt.c       7 Apr 2011 22:02:10 -0000       1.153
>  @@ -527,7 +527,8 @@
>   /*@unchecked@*/ /*@observer@*/ 
>   static const struct spew_s _json_spew = {
>       .spew_name              = "json",
>  -    .spew_init              = "db.Packages.save({\n",
>  +    /* XXX non-functional atm, /usr/lib/rpm/qf *.mongo template for now. */
>  +    .spew_init              = 
> "db.%{?__mongodb_collection}%{!?__mongodb_collection:packages}.save({\n",
>       .spew_fini              = "});\n",
>       .spew_strlen    = jsonstrlen,
>       .spew_strcpy    = jsonstrcpy
>  @@ -3284,19 +3285,20 @@
>   }
> 
>   static int PRCOSkip(rpmTag tag, rpmTagData N, rpmTagData EVR, rpmTagData F,
>  -            rpmuint32_t i)
>  +            uint32_t i)
>       /*@*/
>   {
>       int a = -2, b = -2;
>  +    int rc = 0;
>  +
>  +assert(N.argv[i] != NULL && *N.argv[i] != '\0');
> 
>  -    if (N.argv[i] == NULL || *N.argv[i] == '\0')
>  -    return 1;
>       if (tag == RPMTAG_REQUIRENAME && i > 0
>        && !(a=strcmp(N.argv[i], N.argv[i-1]))
>        && !(b=strcmp(EVR.argv[i], EVR.argv[i-1]))
>        && (F.ui32p[i] & 0x4e) == ((F.ui32p[i-1] & 0x4e)))
>  -    return 1;
>  -    return 0;
>  +    rc = 1;
>  +    return rc;
>   }
> 
>   static int PRCOxmlTag(Header h, HE_t he, rpmTag EVRtag, rpmTag Ftag)
>  @@ -3308,9 +3310,9 @@
>       rpmTagData EVR = { .ptr = NULL };
>       rpmTagData F = { .ptr = NULL };
>       size_t nb;
>  -    rpmuint32_t ac;
>  -    rpmuint32_t c;
>  -    rpmuint32_t i;
>  +    uint32_t ac;
>  +    uint32_t c;
>  +    uint32_t i;
>       char *t;
>       int rc = 1;             /* assume failure */
>       int xx;
>  @@ -3520,10 +3522,10 @@
>       rpmTagData F = { .ptr = NULL };
>       char instance[64];
>       size_t nb;
>  -    rpmuint32_t ac;
>  -    rpmuint32_t c;
>  -    rpmuint32_t i;
>  -    char *t;
>  +    uint32_t ac;
>  +    uint32_t c;
>  +    uint32_t i;
>  +    char *te;
>       int rc = 1;             /* assume failure */
>       int xx;
> 
>  @@ -3544,7 +3546,7 @@
>       F.ui32p = he->p.ui32p;
> 
>       xx = snprintf(instance, sizeof(instance), "'%u'", 
> (unsigned)headerGetInstance(h));
>  -    nb = sizeof(*he->p.argv);
>  +    nb = 0;
>       ac = 0;
>       for (i = 0; i < c; i++) {
>   /*@-nullstate@*/    /* EVR.argv might be NULL */
>  @@ -3552,63 +3554,88 @@
>           continue;
>   /*@=nullstate@*/
>       ac++;
>  -    nb += sizeof(*he->p.argv);
>  -    nb += strlen(instance) + sizeof(", '', '', '', '', ''");
>  +    nb += strlen(instance) + sizeof(", '', '', '', '', ''") - 1;
>       if (tag == RPMTAG_REQUIRENAME)
>           nb += sizeof(", ''") - 1;
>       nb += strlen(N.argv[i]);
>       if (EVR.argv != NULL && EVR.argv[i] != NULL && *EVR.argv[i] != '\0') {
>  -        nb += strlen(EVR.argv[i]);
>  -        nb += sizeof("EQ0") - 1;
>  +        uint32_t Fx = ((F.ui32p[i] >> 1) & 0x7);
>  +        EVR_t Revr = rpmEVRnew(Fx, 1);
>  +        int xx = rpmEVRparse(xstrdup(EVR.argv[i]), Revr);
>  +        const char * E = Revr->F[RPMEVR_E];
>  +        const char * V = Revr->F[RPMEVR_V];
>  +        const char * R = Revr->F[RPMEVR_R];
>  +#ifdef      NOTYET  /* XXX turning this on breaks rpmrepo */
>  +        const char * D = Revr->F[RPMEVR_D];
>  +#endif
>  +        xx = xx;
>  +        nb += (sizeof(", 'EQ'")-1);
>  +        nb += (sizeof(", ''")-1) + strlen(E);
>  +        nb += (sizeof(", ''")-1) + strlen(V);
>  +        nb += (sizeof(", ''")-1) + strlen(R);
>  +#ifdef      NOTYET  /* XXX turning this on breaks rpmrepo */
>  +        nb += (sizeof(", ''")-1) + strlen(D);
>  +#endif
>  +        Revr = rpmEVRfree(Revr);
>       }
>   #ifdef      NOTNOW
>       if (tag == RPMTAG_REQUIRENAME && (F.ui32p[i] & 0x40))
>           nb += sizeof("1") - 1;
>   #endif
>  +    nb++;
>       }
> 
>  +    nb += (ac + 1) * sizeof(*he->p.argv);
>  +
>       he->t = RPM_STRING_ARRAY_TYPE;
>       he->c = ac;
>       he->freeData = 1;
>  -    he->p.argv = xmalloc(nb + BUFSIZ);      /* XXX hack: leave slop */
>  -    t = (char *) &he->p.argv[he->c + 1];
>  +    he->p.argv = xmalloc(nb);
>  +    te = (char *) &he->p.argv[ac + 1];
>  +    *te = '\0';
>       ac = 0;
>       for (i = 0; i < c; i++) {
>   /*@-nullstate@*/    /* EVR.argv might be NULL */
>       if (PRCOSkip(tag, N, EVR, F, i))
>           continue;
>   /*@=nullstate@*/
>  -    he->p.argv[ac++] = t;
>  -    t = stpcpy(t, instance);
>  -    t = stpcpy( stpcpy( stpcpy(t, ", '"), N.argv[i]), "'");
>  +    he->p.argv[ac++] = te;
>  +    te = stpcpy(te, instance);
>  +    te = stpcpy(te, ", '");
>  +    te = stpcpy(te, N.argv[i]);
>  +    te = stpcpy(te, "'");
>   /*@-readonlytrans@*/
>       if (EVR.argv != NULL && EVR.argv[i] != NULL && *EVR.argv[i] != '\0') {
>  -        static char *Fstr[] = { "?0","LT","GT","?3","EQ","LE","GE","?7" };
>  -        rpmuint32_t Fx = ((F.ui32p[i] >> 1) & 0x7);
>  -        const char *E, *V, *R;
>  -        char *f, *fe;
>  -        t = stpcpy( stpcpy( stpcpy(t, ", '"), Fstr[Fx]), "'");
>  -        f = (char *) EVR.argv[i];
>  -        for (fe = f; *fe != '\0' && *fe >= '0' && *fe <= '9'; fe++)
>  -            {};
>  -        if (*fe == ':') { *fe++ = '\0'; E = f; f = fe; } else E = NULL;
>  -        V = f;
>  -        for (fe = f; *fe != '\0' && *fe != '-'; fe++)
>  -            {};
>  -        if (*fe == '-') { *fe++ = '\0'; R = fe; } else R = NULL;
>  -        t = stpcpy( stpcpy( stpcpy(t, ", '"), (E && *E ? E : "0")), "'");
>  -        t = stpcpy( stpcpy( stpcpy(t, ", '"), V), "'");
>  -        t = stpcpy( stpcpy( stpcpy(t, ", '"), (R ? R : "")), "'");
>  -    } else
>  -        t = stpcpy(t, ", '', '', '', ''");
>  +        static const char *Fstr[] = { 
> "?0","LT","GT","?3","EQ","LE","GE","?7" };
>  +        uint32_t Fx = ((F.ui32p[i] >> 1) & 0x7);
>  +        EVR_t Revr = rpmEVRnew(Fx, 1);
>  +        int xx = rpmEVRparse(xstrdup(EVR.argv[i]), Revr);
>  +        const char * E = Revr->F[RPMEVR_E];
>  +        const char * V = Revr->F[RPMEVR_V];
>  +        const char * R = Revr->F[RPMEVR_R];
>  +#ifdef      NOTYET  /* XXX turning this on breaks rpmrepo */
>  +        const char * D = Revr->F[RPMEVR_D];
>  +#endif
>  +        xx = xx;
>  +        te = stpcpy( stpcpy( stpcpy(te, ", '"), Fstr[Fx]), "'");
>  +        te = stpcpy( stpcpy( stpcpy(te, ", '"), E), "'");
>  +        te = stpcpy( stpcpy( stpcpy(te, ", '"), V), "'");
>  +        te = stpcpy( stpcpy( stpcpy(te, ", '"), R), "'");
>  +#ifdef      NOTYET  /* XXX turning this on breaks rpmrepo */
>  +        te = stpcpy( stpcpy( stpcpy(te, ", '"), D), "'");
>  +#endif
>  +        Revr = rpmEVRfree(Revr);
>  +    } else {
>  +        te = stpcpy(te, ", '', '', '', ''");
>  +    }
>   /*@=readonlytrans@*/
>   #ifdef      NOTNOW
>       if (tag == RPMTAG_REQUIRENAME)
>  -        t = stpcpy(stpcpy(stpcpy(t, ", '"),(F.ui32p[i] & 0x40) ? "1" : 
> "0"), "'");
>  +        te = stpcpy(stpcpy(stpcpy(te, ", '"),(F.ui32p[i] & 0x40) ? "1" : 
> "0"), "'");
>   #endif
>  -    *t++ = '\0';
>  +    *te++ = '\0';
>       }
>  -    he->p.argv[he->c] = NULL;
>  +    he->p.argv[ac] = NULL;
>   /*@=compmempass@*/
>       rc = 0;
> 
>  @@ .
> ______________________________________________________________________
> RPM Package Manager                                    http://rpm5.org
> CVS Sources Repository                                rpm-...@rpm5.org

______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
Developer Communication List                        rpm-devel@rpm5.org

Reply via email to