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]
