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

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   21-Apr-2010 17:27:53
  Branch: HEAD                             Handle: 2010042115275201

  Modified files:
    rpm                     CHANGES
    rpm/rpmio               rpmsql.c

  Log:
    - jbj: rpmvt: permit column data types.

  Summary:
    Revision    Changes     Path
    1.3333      +1  -0      rpm/CHANGES
    2.52        +50 -22     rpm/rpmio/rpmsql.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3332 -r1.3333 CHANGES
  --- rpm/CHANGES       20 Apr 2010 22:35:55 -0000      1.3332
  +++ rpm/CHANGES       21 Apr 2010 15:27:52 -0000      1.3333
  @@ -1,5 +1,6 @@
   
   5.2b1 -> 5.3a1
  +    - jbj: rpmvt: permit column data types.
       - jbj: rpmvt: resurrect Nixdb against db.sqlite ValidPaths(path).
       - jbj: rpmvt: stub-in a loadable libsqldb.so module.
       - jbj: rpmvt: stub-in a loadable libsql.so module.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmsql.c
  ============================================================================
  $ cvs diff -u -r2.51 -r2.52 rpmsql.c
  --- rpm/rpmio/rpmsql.c        20 Apr 2010 22:35:55 -0000      2.51
  +++ rpm/rpmio/rpmsql.c        21 Apr 2010 15:27:53 -0000      2.52
  @@ -131,21 +131,59 @@
   }
   
   /*==============================================================*/
  +typedef struct key_s {
  +    const char * k;
  +    uint32_t v;
  +} KEY;
  +static KEY sqlTypes[] = {
  +    { "blob",        SQLITE_BLOB },
  +    { "float",       SQLITE_FLOAT },
  +    { "int", SQLITE_INTEGER },
  +    { "integer",SQLITE_INTEGER },
  +    { "null",        SQLITE_NULL },
  +    { "text",        SQLITE_TEXT },
  +};
  +static size_t nsqlTypes = sizeof(sqlTypes) / sizeof(sqlTypes[0]);
  +
  +static const char * hasSqlType(const char * s)
  +{
  +    int i;
  +    for (i = 0; i < (int)nsqlTypes; i++) {
  +     const char * k = sqlTypes[i].k;
  +     const char * se = strcasestr(s, k);
  +     if (se == NULL || se <= s || se[-1] != ' ')
  +         continue;
  +     se += strlen(k);
  +     if (*se && *se != ' ')
  +         continue;
  +     return se;
  +    }
  +    return NULL;
  +}
   
   static char * _rpmvtJoin(const char * a, const char ** argv, const char * z)
   {
  +    static const char _type[] = " TEXT";
       const char ** av;
  -    size_t na = strlen(a);
  +    size_t na = (sizeof("\t")-1) + (a ? strlen(a) : 0);
       size_t nb = 0;
  -    size_t nz = strlen(z);
  +    size_t nz = (z ? strlen(z) : 0) + strlen(_type) + (sizeof(",\n")-1);
       char *t, *te;
   
       for (av = argv; *av != NULL; av++)
        nb += na + strlen(*av) + nz;
   
       te = t = xmalloc(nb + 1);
  -    for (av = argv; *av != NULL; av++)
  -     te = stpcpy(stpcpy(stpcpy(te, a), *av), z);
  +    for (av = argv; *av != NULL; av++) {
  +     *te++ = '\t';
  +     te = stpcpy(te, a);
  +     te = stpcpy(te, *av);
  +     if (hasSqlType(*av) == NULL)
  +         te = stpcpy(te, _type);
  +     te = stpcpy(te, z);
  +     *te++ = ',';
  +     *te++ = '\n';
  +    }
       *te = '\0';
   
       return t;
  @@ -153,14 +191,14 @@
   
   static char * _rpmvtAppendCols(rpmvt vt, const char ** av)
   {
  -    char * h = _rpmvtJoin("\t'", av, "' HIDDEN TEXT,\n");
  +    char * h = _rpmvtJoin("", av, "");
       int xx = argvAppend(&vt->cols, av);
       char * u;
       char * hu;
   
       av = (const char **) (vt->argc > 4 ? &vt->argv[4] : vt->fields);
   assert(av);
  -    u = _rpmvtJoin("\t'", av, "' TEXT,\n");
  +    u = _rpmvtJoin("", av, "");
       u[strlen(u)-2] = ' ';    /* XXX nuke the final comma */
       xx = argvAppend(&vt->cols, av);
   
  @@ -182,7 +220,7 @@
       sqlite3 * db = (sqlite3 *) vt->db;
       rpmvd vd = vt->vd;
   
  -    static const char * hidden[] = { "path", "id", NULL };
  +    static const char * hidden[] = { "path HIDDEN", "id HIDDEN", NULL };
       const char * hu;
   
       char * uri = NULL;
  @@ -220,21 +258,11 @@
       (void) urlPath(uri, (const char **) &fn);
   
       if (!strcasecmp(vt->argv[0], "nixdb")) {
  -     static const char _cmd[] = "select path from ValidPaths;";
  -     const char * out =
  -             rpmExpand("%{sql ", vd->dbpath, ":", _cmd, "}", NULL);
  -     const char ** oav = NULL;
  -     int yy = argvSplit(&oav, out, "\n");
  -     int oac = argvCount(oav);
  -     miRE mire = mireNew(RPMMIRE_GLOB, 0);
  -     yy = mireRegcomp(mire, uri);
  -     for (i = 0; i < oac; i++) {
  -         if (mireRegexec(mire, oav[i], strlen(oav[i])))
  -             continue;
  -         yy = argvAdd(&vt->av, oav[i]);
  -     }
  -     mire = mireFree(mire);
  -     oav = argvFree(oav);
  +     const char * out = rpmExpand("%{sql ", vd->dbpath, ":",
  +         "select path from ValidPaths where glob('", fn, "', path);",
  +             "}", NULL);
  +     (void) argvSplit(&vt->av, out, "\n");
  +     out = _free(out);
       } else
   
       if (fn[0] == '/') {
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to