RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Anders F. Björklund
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   27-May-2011 08:57:19
  Branch: HEAD                             Handle: 2011052706571801

  Modified files:
    rpm                     rpmpopt.in
    rpm/rpmdb               hdrfmt.c
    rpm/scripts             wnh_filelists_mongo wnh_other_mongo
                            wnh_primary_mongo
    rpm/tests               Makefile.am

  Log:
    json: chomp trailing commas, quote keys, split off --mongo

  Summary:
    Revision    Changes     Path
    1.168       +69 -2      rpm/rpmdb/hdrfmt.c
    2.96        +4  -2      rpm/rpmpopt.in
    1.8         +6  -6      rpm/scripts/wnh_filelists_mongo
    1.9         +7  -7      rpm/scripts/wnh_other_mongo
    1.9         +19 -19     rpm/scripts/wnh_primary_mongo
    1.99        +1  -1      rpm/tests/Makefile.am
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.167 -r1.168 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c        27 May 2011 06:29:15 -0000      1.167
  +++ rpm/rpmdb/hdrfmt.c        27 May 2011 06:57:18 -0000      1.168
  @@ -346,6 +346,7 @@
       const char * spew_name;
       const char * spew_init;
       const char * spew_fini;
  +    char         spew_chomp;
       size_t (*spew_strlen) (const char * s, int lvl)
        /*@*/;
       char * (*spew_strcpy) (/*@returned@*/ char * t, const char * s, int lvl)
  @@ -407,6 +408,7 @@
       .spew_name               = "xml",
       .spew_init               = "<rpmHeader>\n",
       .spew_fini               = "</rpmHeader>\n",
  +    .spew_chomp              = 0,
       .spew_strlen     = xmlstrlen,
       .spew_strcpy     = xmlstrcpy
   };
  @@ -476,6 +478,7 @@
       .spew_name               = "yaml",
       .spew_init               = "-\n",
       .spew_fini               = "\n",
  +    .spew_chomp              = 0,
       .spew_strlen     = yamlstrlen,
       .spew_strcpy     = yamlstrcpy
   };
  @@ -544,9 +547,19 @@
   /*@unchecked@*/ /*@observer@*/ 
   static const struct spew_s _json_spew = {
       .spew_name               = "json",
  -    /* XXX non-functional atm, /usr/lib/rpm/qf *.mongo template for now. */
  +    .spew_init               = "{",
  +    .spew_fini               = "}\n",
  +    .spew_chomp              = ',',
  +    .spew_strlen     = jsonstrlen,
  +    .spew_strcpy     = jsonstrcpy
  +};
  +
  +/*@unchecked@*/ /*@observer@*/ 
  +static const struct spew_s _mongo_spew = {
  +    .spew_name               = "mongo",
       .spew_init               = 
"db.%{?__mongodb_collection}%{!?__mongodb_collection:packages}.save({\n",
       .spew_fini               = "});\n",
  +    .spew_chomp              = ',',
       .spew_strlen     = jsonstrlen,
       .spew_strcpy     = jsonstrcpy
   };
  @@ -603,6 +616,7 @@
       .spew_name               = "sql",
       .spew_init               = "",
       .spew_fini               = "",
  +    .spew_chomp              = 0,
       .spew_strlen     = sqlstrlen,
       .spew_strcpy     = sqlstrcpy
   };
  @@ -1345,7 +1359,6 @@
        te += strlen(te);
       }
       if (c != '\0') *te++ = c;
  -    *te++ = ',';
       *te = '\0';
   
       val = xstrdup(t);
  @@ -5279,6 +5292,8 @@
       { HEADER_EXT_FORMAT, "jsonescape",
        { .fmtFunction = jsonescapeFormat } },
   #endif
  +    { HEADER_EXT_FORMAT, "mongo",
  +     { .fmtFunction = jsonFormat } },
       { HEADER_EXT_FORMAT, "perms",
        { .fmtFunction = permsFormat } },
       { HEADER_EXT_FORMAT, "permissions",      
  @@ -6605,6 +6620,9 @@
            if (spft->type == PTOK_TAG && tag->av != NULL
             && tag->av[0] != NULL && !strcmp(tag->av[0]+1, "json"))
                spew = &_json_spew;
  +         if (spft->type == PTOK_TAG && tag->av != NULL
  +          && tag->av[0] != NULL && !strcmp(tag->av[0]+1, "mongo"))
  +             spew = &_mongo_spew;
   
            if (spew == &_xml_spew) {
   assert(tag->tagno != NULL);
  @@ -6650,6 +6668,32 @@
                    tagN = "_id";       /* XXX mongo primary key name */
                } else
                    tagN = myTagName(hsa->tags, tag->tagno[0], &tagT);
  +             need = sizeof(" \"\": [ ") + strlen(tagN);
  +             te = t = hsaReserve(hsa, need);
  +             te = stpcpy(te, " ");
  +             *te++ = '"';
  +             te = stpcpy( te, tagN);
  +             *te++ = '"';
  +             *te++ = ':';
  +             *te++ = ' ';
  +             if ((tagT & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE)
  +                 te = stpcpy(te, "[ ");
  +             *te = '\0';
  +             hsa->vallen += (te - t);
  +         }
  +
  +         if (spew == &_mongo_spew) {
  +assert(tag->tagno != NULL);
  +             /* XXX display "Tag_0x01234567" for arbitrary tags. */
  +             if (tag->tagno[0] & 0x40000000) {
  +                 tagN = myTagName(hsa->tags, tag->tagno[0], NULL);
  +                 tagT = numElements > 1
  +                     ?  RPM_ARRAY_RETURN_TYPE : RPM_SCALAR_RETURN_TYPE;
  +             } else
  +             if (tag->tagno[0] == RPMTAG_HDRID) {    /* RPMTAG_SHA1HEADER */
  +                 tagN = "_id";       /* XXX mongo primary key name */
  +             } else
  +                 tagN = myTagName(hsa->tags, tag->tagno[0], &tagT);
                need = sizeof("  : [ ") + strlen(tagN);
                te = t = hsaReserve(hsa, need);
                te = stpcpy( stpcpy( stpcpy(te, "  "), tagN), ":");
  @@ -6671,6 +6715,13 @@
                }
            }
   
  +         if (spew && spew->spew_chomp) {
  +             if ((tagT & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE) {
  +                 if (hsa->val[hsa->vallen - 1] == spew->spew_chomp)
  +                     hsa->vallen--;
  +             }
  +         }
  +
            if (spew == &_xml_spew) {
                need = sizeof("  </rpmTag>\n") - 1;
                te = t = hsaReserve(hsa, need);
  @@ -6679,6 +6730,14 @@
            }
            if (spew == &_json_spew) {
                if ((tagT & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE) {
  +                 need = sizeof(" ],") - 1;
  +                 te = t = hsaReserve(hsa, need);
  +                 te = stpcpy(te, " ],");
  +                 hsa->vallen += (te - t);
  +             }
  +         }
  +         if (spew == &_mongo_spew) {
  +             if ((tagT & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE) {
                    need = sizeof("  ],\n") - 1;
                    te = t = hsaReserve(hsa, need);
                    te = stpcpy(te, "  ],\n");
  @@ -6806,6 +6865,9 @@
       if (tag != NULL && tag->tagno != NULL && tag->tagno[0] == (rpmTag)-2
        && tag->av != NULL && tag->av[0] != NULL && !strcmp(tag->av[0]+1, 
"json"))
        spew = &_json_spew;
  +    if (tag != NULL && tag->tagno != NULL && tag->tagno[0] == (rpmTag)-2
  +     && tag->av != NULL && tag->av[0] != NULL && !strcmp(tag->av[0]+1, 
"mongo"))
  +     spew = &_mongo_spew;
   
       if (spew && spew->spew_init && spew->spew_init[0]) {
        char * spew_init = rpmExpand(spew->spew_init, NULL);
  @@ -6828,6 +6890,11 @@
       }
       hsa = hsaFini(hsa);
   
  +    if (spew && spew->spew_chomp) {
  +     if (hsa->val[hsa->vallen - 1] == spew->spew_chomp)
  +         hsa->vallen--;
  +    }
  +
       if (spew && spew->spew_fini && spew->spew_fini[0]) {
        char * spew_fini = rpmExpand(spew->spew_fini, NULL);
        need = strlen(spew_fini);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmpopt.in
  ============================================================================
  $ cvs diff -u -r2.95 -r2.96 rpmpopt.in
  --- rpm/rpmpopt.in    20 Apr 2011 06:09:41 -0000      2.95
  +++ rpm/rpmpopt.in    27 May 2011 06:57:18 -0000      2.96
  @@ -2,7 +2,7 @@
   # \verbatim
   #
   # @USRLIBRPM@/@configure_input@
  -# $Id: rpmpopt.in,v 2.95 2011/04/20 06:09:41 jbj Exp $
  +# $Id: rpmpopt.in,v 2.96 2011/05/27 06:57:18 afb Exp $
   #
   # This file *should not be modified*. Local customizations
   # belong in /etc/popt, not here. This file will be replaced
  @@ -130,8 +130,10 @@
        --POPTdesc=$"list metadata in XML"
   rpm  alias --yaml --qf '[%{*:yaml}\n]' \
        --POPTdesc=$"list metadata in YAML"
  -rpm  alias --json --qf '[%{*:json}]' \
  +rpm  alias --json --qf '[%{*:json},]' \
        --POPTdesc=$"list metadata in JSON"
  +rpm  alias --mongo --qf '[%{*:mongo},]' \
  +     --POPTdesc=$"list metadata in MongoDB JavaScript"
   rpm  alias --whatneeds -q --qf '[%{whatneeds}\n]' \
        --POPTdesc=$"list packages that depend on args"
   rpm  alias --needswhat -q --qf '[%{needswhat}\n]' \
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/scripts/wnh_filelists_mongo
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 wnh_filelists_mongo
  --- rpm/scripts/wnh_filelists_mongo   26 May 2011 09:11:55 -0000      1.7
  +++ rpm/scripts/wnh_filelists_mongo   27 May 2011 06:57:19 -0000      1.8
  @@ -1,12 +1,12 @@
   "\
   db.filelists.save(\{\
  -\n  _id:     %|HDRID?{%{HDRID:json}}:{null,}|\
  -\n  Name:    %{NAME:json}\
  -\n  Arch:    %{ARCH:json}\
  -\n  Epoch:   %|EPOCH?{%{EPOCH}}:{0}|\
  +\n  _id:     %|HDRID?{%{HDRID:json}}:{null}|\
  +,\n  Name:    %{NAME:json}\
  +,\n  Arch:    %{ARCH:json}\
  +,\n  Epoch:   %|EPOCH?{%{EPOCH}}:{0}|\
   ,\n  Version: %{VERSION:json}\
  -\n  Release: %{RELEASE:json}\
  -\n  Files:  \[
  +,\n  Release: %{RELEASE:json}\
  +,\n  Files:  \[
   %|basenames?{\
   [\
       \[ %{filesjsonentry2} \],\n\
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/scripts/wnh_other_mongo
  ============================================================================
  $ cvs diff -u -r1.8 -r1.9 wnh_other_mongo
  --- rpm/scripts/wnh_other_mongo       26 May 2011 09:11:55 -0000      1.8
  +++ rpm/scripts/wnh_other_mongo       27 May 2011 06:57:19 -0000      1.9
  @@ -1,17 +1,17 @@
   "\
   db.other.save(\{\
  -\n  _id:     %|HDRID?{%{HDRID:json}}:{null,}|\
  -\n  Name:    %{NAME:json}\
  -\n  Arch:    %{ARCH:json}\
  -\n  Epoch:   %|EPOCH?{%{EPOCH}}:{0}|\
  +\n  _id:     %|HDRID?{%{HDRID:json}}:{null}|\
  +,\n  Name:   %{NAME:json}\
  +,\n  Arch:   %{ARCH:json}\
  +,\n  Epoch:  %|EPOCH?{%{EPOCH}}:{0}|\
   ,\n  Version:        %{VERSION:json}\
  -\n  Release: %{RELEASE:json}\
  -\n  Changelogs: \[\
  +,\n  Release:        %{RELEASE:json}\
  +,\n  Changelogs: \[\
   %|changelogname?{\
   [\
    \{\
   \n    Author:        %{CHANGELOGNAME:json}\
  -\n      Date:        new Date(%{CHANGELOGTIME}000)\
  +,\n      Date:       new Date(%{CHANGELOGTIME}000)\
   ,\n      Text:       %{CHANGELOGTEXT:json}\
    \},\
   ]\
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/scripts/wnh_primary_mongo
  ============================================================================
  $ cvs diff -u -r1.8 -r1.9 wnh_primary_mongo
  --- rpm/scripts/wnh_primary_mongo     26 May 2011 09:11:55 -0000      1.8
  +++ rpm/scripts/wnh_primary_mongo     27 May 2011 06:57:19 -0000      1.9
  @@ -1,28 +1,28 @@
   "\
   db.primary.save(\{\
  -\n  _id:     %|HDRID?{%{HDRID:json}}:{null,}|\
  -\n  Name:    %{NAME:json}\
  -\n  Arch:    %{ARCH:json}\
  -\n  Version: %{VERSION:json}\
  -\n  Epoch:   %|EPOCH?{%{EPOCH}}:{0}|\
  +\n  _id:     %|HDRID?{%{HDRID:json}}:{null}|\
  +,\n  Name:   %{NAME:json}\
  +,\n  Arch:   %{ARCH:json}\
  +,\n  Version:        %{VERSION:json}\
  +,\n  Epoch:  %|EPOCH?{%{EPOCH}}:{0}|\
   ,\n  Release:        %{RELEASE:json}\
  -\n  Summary: %{SUMMARY:json}\
  -\n  Description:     %{DESCRIPTION:json}\
  -\n  Packager:        %|PACKAGER?{%{PACKAGER:json}}:{'',}|\
  -\n  Url:     %|URL?{%{URL:json}}:{'',}|\
  -\n  Filetime:        '%{PACKAGETIME:date}'\
  -,\n  Buildtime:      '%{BUILDTIME:date}'\
  +,\n  Summary:        %{SUMMARY:json}\
  +,\n  Description:    %{DESCRIPTION:json}\
  +,\n  Packager:       %|PACKAGER?{%{PACKAGER:json}}:{''}|\
  +,\n  Url:    %|URL?{%{URL:json}}:{''}|\
  +,\n  Filetime:       new Date('%{PACKAGETIME:date}')\
  +,\n  Buildtime:      new Date('%{BUILDTIME:date}')\
   ,\n  Packagesize:    %{PACKAGESIZE}\
   ,\n  Size:   %{SIZE}\
   ,\n  Archivesize:    %{ARCHIVESIZE}\
   ,\n  Location:       %{PACKAGEORIGIN:json}\
  -\n  BaseURL: %|PACKAGEBASEURL?{%{PACKAGEBASEURL:json}}:{'',}|\
  -\n  License: %|license?{%{LICENSE:json}}:{'',}|\
  -\n  Vendor:  %|vendor?{%{VENDOR:json}}:{'',}|\
  -\n  Group:   %|group?{%{GROUP:json}}:{'',}|\
  -\n  Buildhost:       %|buildhost?{%{BUILDHOST:json}}:{'',}|\
  -\n  Sourcerpm:       %|sourcerpm?{%{SOURCERPM:json}}:{'',}|\
  -\n  Hdrstart:        %{HEADERSTARTOFF}\
  +,\n  BaseURL:        %|PACKAGEBASEURL?{%{PACKAGEBASEURL:json}}:{''}|\
  +,\n  License:        %|license?{%{LICENSE:json}}:{''}|\
  +,\n  Vendor: %|vendor?{%{VENDOR:json}}:{''}|\
  +,\n  Group:  %|group?{%{GROUP:json}}:{''}|\
  +,\n  Buildhost:      %|buildhost?{%{BUILDHOST:json}}:{''}|\
  +,\n  Sourcerpm:      %|sourcerpm?{%{SOURCERPM:json}}:{''}|\
  +,\n  Hdrstart:       %{HEADERSTARTOFF}\
   ,\n  Hdrend: %{HEADERENDOFF}\
   %|providename?{\
   ,\n  Provides: \
  @@ -54,5 +54,5 @@
   \n    \[ %{filesjsonentry1} \],\
   ] \]\
   }|\
  -,\n\});\
  +\n\});\
   \n"
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/tests/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.98 -r1.99 Makefile.am
  --- rpm/tests/Makefile.am     7 May 2011 23:30:49 -0000       1.98
  +++ rpm/tests/Makefile.am     27 May 2011 06:57:19 -0000      1.99
  @@ -618,7 +618,7 @@
        @echo "`${now}` ==> ${@D}: Exporting ..." | tee -a ${@D}/export
        for F in $</*.rpm; do \
          echo "--> $$F"; \
  -       ${rpm} -qp --nosignature --json $$F | tee -a $@ | ${mongo} 
${mongoserver}/${@D} > /dev/null; \
  +       ${rpm} -qp --nosignature --mongo $$F | tee -a $@ | ${mongo} 
${mongoserver}/${@D} > /dev/null; \
        done
        @echo "`${now}` <== ${@D}: Exported." | tee -a ${@D}/export
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to