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-cvs@rpm5.org

Reply via email to