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:   20-Apr-2010 12:54:19
  Branch: HEAD                             Handle: 2010042010541800

  Modified files:
    rpm/rpmio               rpmsql.c rpmsql.h

  Log:
    - rpmsql: simplify vtab column sql spewage.

  Summary:
    Revision    Changes     Path
    2.50        +75 -102    rpm/rpmio/rpmsql.c
    2.24        +4  -0      rpm/rpmio/rpmsql.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmsql.c
  ============================================================================
  $ cvs diff -u -r2.49 -r2.50 rpmsql.c
  --- rpm/rpmio/rpmsql.c        19 Apr 2010 15:32:20 -0000      2.49
  +++ rpm/rpmio/rpmsql.c        20 Apr 2010 10:54:18 -0000      2.50
  @@ -37,7 +37,7 @@
   #include "debug.h"
   
   /*...@unchecked@*/
  -int _rpmsql_debug = -1;
  +int _rpmsql_debug = 0;
   
   /*...@unchecked@*/
   int _rpmvt_debug = -1;
  @@ -132,117 +132,93 @@
   
   /*==============================================================*/
   
  +static char * _rpmvtJoin(const char * a, const char ** argv, const char * z)
  +{
  +    const char ** av;
  +    size_t na = strlen(a);
  +    size_t nb = 0;
  +    size_t nz = strlen(z);
  +    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);
  +    *te = '\0';
  +
  +    return t;
  +}
  +
  +static char * _rpmvtAppendCols(rpmvt vt, const char ** av)
  +{
  +    char * h = _rpmvtJoin("\t'", av, "' HIDDEN TEXT,\n");
  +    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[strlen(u)-2] = ' ';    /* XXX nuke the final comma */
  +    xx = argvAppend(&vt->cols, av);
  +
  +#define      dbN     vt->argv[1]
  +#define      tblN    vt->argv[2]
  +    hu = rpmExpand("CREATE TABLE ", dbN, ".", tblN, " (\n", h, u, ");", 
NULL);
  +#undef       dbN
  +#undef       tblN
  +
  +    u = _free(u);
  +    h = _free(h);
  +
  +fprintf(stderr, "%s\n", hu);
  +    return hu;
  +}
  +
   int rpmvtLoadArgv(rpmvt vt, rpmvt * vtp)
   {
  -    static const char _type[] = "TEXT";
  -    rpmsql sql = _rpmsqlI;
       sqlite3 * db = (sqlite3 *) vt->db;
  -#define      modName vt->argv[0]
  -#define      dbName  vt->argv[1]
  -#define      tblName vt->argv[2]
  -
       rpmvd vd = vt->vd;
  -    const char * uprefix;
  -    const char * prefix;
  +
  +    static const char * hidden[] = { "path", "id", NULL };
  +    const char * hu;
   
       char * uri = NULL;
  -    size_t nuri;
       struct stat sb;
   
  -    char * fn;
  -    size_t nfn;
  -    char * t, * te;
  +    const char * fn = NULL;
   
  -    size_t nb;
       int rc = SQLITE_OK;
       int xx;
       int i;
   
  -static const char _hidden[] = "\
  -\t'path' HIDDEN TEXT,\n\
  -\t'id' HIDDEN TEXT,\n\
  -";
  -
   fprintf(stderr, "--> %s(%p,%p)\n", __FUNCTION__, vt, vtp);
   argvPrint("vt->argv", (ARGV_t)vt->argv, NULL);
   
  -    prefix = (vd->prefix ? vd->prefix : "");
  +    /* Set the columns in the schema. */
  +    hu = _rpmvtAppendCols(vt, hidden);
  +    rc = rpmsqlCmd(NULL, "declare_vtab", db,
  +                     sqlite3_declare_vtab(db, hu));
  +    hu = _free(hu);
  +
       if (vt->argv[3]) {
        /* XXX slice out the quotes that sqlite passes through ...  */
        static char _quotes[] = "'\"";
        int quoted = (strchr(_quotes, *vt->argv[3]) != NULL);
  -     uri = rpmExpand(vt->argv[3] + quoted, NULL);
  -     nuri = strlen(uri);
  -     if (quoted) uri[--nuri] = '\0';
  -     /* XXX Strip file:/// et al (if present). */
  -     (void) urlPath(uri, &uprefix);
  +     const char * prefix;
  +     const char * path = NULL;
        /* XXX Prefer user override to global prefix (if absolute path). */
  -     if (*uprefix == '/')
  -         prefix = "";
  +     (void) urlPath(vt->argv[3]+quoted, &path);
  +     prefix = (*path != '/' && vd->prefix ? vd->prefix : "");
  +     uri = rpmGetPath(prefix, path, NULL);
  +     uri[strlen(uri)-quoted] = '\0';
       } else
  -     uprefix = NULL;
  -
  -    fn = rpmGetPath(prefix, uprefix, NULL);
  -    nfn = strlen(fn);
  -
  -    nb = 0;
  -    nb += sizeof("CREATE TABLE ") - 1;
  -    nb += strlen(dbName) + (sizeof(".")-1) + strlen(tblName);
  -    nb += (sizeof(" (\n")-1);
  +     uri = rpmGetPath(vd->prefix, fn, NULL);
   
  -    nb += strlen(_hidden);
  +    (void) urlPath(uri, (const char **) &fn);
   
  -    if (vt->argc <= 4) {
  -assert(vt->fields);
  -     for (i = 0; i < vt->nfields; i++) {
  -         nb += sizeof("\t'' ,\n");
  -         nb += strlen(vt->fields[i]);
  -         nb += strlen(_type);
  -     }
  -    } else {
  -     for (i = 4; i < vt->argc; i++) {
  -         nb += sizeof("\t'' ,\n");
  -         nb += strlen(vt->argv[i]);
  -         nb += strlen(_type);
  -     }
  -    }
  -    nb--;
  -    nb += sizeof(");") - 1;
  -
  -    te = t = xmalloc(nb + 1);
  -    te = stpcpy(te, "CREATE TABLE ");
  -    te = stpcpy(stpcpy(stpcpy(te, dbName), "."), tblName);
  -    te = stpcpy(te, " (\n");
  -
  -    te = stpcpy(te, _hidden);
  -    xx = argvAdd(&vt->cols, "path");
  -    xx = argvAdd(&vt->cols, "id");
  -
  -    if (vt->argc <= 4) {
  -assert(vt->fields);
  -     for (i = 0; i < vt->nfields; i++) {
  -         te = stpcpy(stpcpy(stpcpy(te, "\t'"), vt->fields[i]), "' ");
  -         te = stpcpy(stpcpy(te, _type), ",\n");
  -         xx = argvAdd(&vt->cols, vt->fields[i]);
  -     }
  -    } else {
  -     for (i = 4; i < vt->argc; i++) {
  -         te = stpcpy(stpcpy(stpcpy(te, "\t'"), vt->argv[i]), "' ");
  -         te = stpcpy(stpcpy(te, _type), ",\n");
  -         xx = argvAdd(&vt->cols, vt->argv[i]);
  -     }
  -    }
  -    te--;
  -    te[-1] = '\n';
  -    te = stpcpy(te, ");");
  -    *te = '\0';
  -
  -fprintf(stderr, "%s\n", t);
  -    rc = rpmsqlCmd(sql, "declare_vtab", db,
  -             sqlite3_declare_vtab(db, t));
  -    t = _free(t);
  -
  -_rpmio_debug = -1;
       if (fn[0] == '/') {
   fprintf(stderr, "*** uri %s fn %s\n", uri, fn);
        if (Glob_pattern_p(uri, 0)) {   /* XXX uri */
  @@ -257,24 +233,23 @@
                xx = argvAppend(&vt->av, (ARGV_t)av);
            av = argvFree(av);
        } else
  -     if (fn[nfn-1] == '/') {
  +     if (uri[strlen(uri)-1] == '/') {
            DIR * dir = Opendir(uri);
            struct dirent * dp;
   fprintf(stderr, " DIR: %p = Opendir(%s)\n", dir, uri);
            if (dir == NULL)
                rc = SQLITE_NOTFOUND;           /* XXX */
            else
  -         while ((dp = Readdir(dir)) != NULL)
  -             if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, ".."))
  -                 xx = argvAdd(&vt->av, dp->d_name);
  +         while ((dp = Readdir(dir)) != NULL) {
  +             if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
  +                 continue;
  +             fn = rpmGetPath(uri, "/", dp->d_name, NULL);
  +             xx = argvAdd(&vt->av, fn);
  +             fn = _free(fn);
  +         }
            if (dir) xx = Closedir(dir);
        } else
  -#ifdef       DYING
  -     if (!Access(uri, R_OK))
  -#else
  -     if (!Lstat(uri, &sb))
  -#endif
  -     {
  +     if (!Lstat(uri, &sb)) {
            rpmiob iob = NULL;
            xx = rpmiobSlurp(uri, &iob);
   fprintf(stderr, "FILE: %d = Slurp(%s)\n", xx, uri);
  @@ -286,7 +261,7 @@
        } else
            rc = SQLITE_NOTFOUND;               /* XXX */
       } else
  -    if (!strcasecmp(modName, "Env")) {
  +    if (!strcasecmp(vt->argv[0], "Env")) {
   fprintf(stderr, " ENV: %d = getenv(%p[%d])\n", xx, &vt->argv[3], 
argvCount(&vt->argv[3]));
        for (i = 3; i < vt->argc; i++) {
            char * t = rpmExpand(vt->argv[i], "=", getenv(vt->argv[i]), NULL);
  @@ -297,11 +272,9 @@
        xx = argvAppend(&vt->av, (ARGV_t)&vt->argv[3]);
   fprintf(stderr, "LIST: %d = Append(%p[%d])\n", xx, &vt->argv[3], 
argvCount(&vt->argv[3]));
       }
  -_rpmio_debug = 0;
   
       vt->ac = argvCount((ARGV_t)vt->av);
   
  -    fn = _free(fn);
       uri = _free(uri);
   
   argvPrint("vt->av", (ARGV_t)vt->av, NULL);
  @@ -2554,7 +2527,7 @@
   
   static struct rpmvd_s _repodbVD = {
        /* XXX where to map the default? */
  -     .prefix = "%{?_repodb}%{!?_repodb:http://rpm5.org/files/popt/}";,
  +     .prefix = "%{?_repodb}%{!?_repodb:/X/popt/}",
        .split  = "/-.",
        .parse  = "dir/file-NVRA-N-V-R.A",
        .regex  = "^(.+/)(((.*)-([^-]+)-([^-]+)\\.([^.]+))\\.rpm)$",
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmsql.h
  ============================================================================
  $ cvs diff -u -r2.23 -r2.24 rpmsql.h
  --- rpm/rpmio/rpmsql.h        19 Apr 2010 15:32:20 -0000      2.23
  +++ rpm/rpmio/rpmsql.h        20 Apr 2010 10:54:18 -0000      2.24
  @@ -152,6 +152,10 @@
       int ac;
       const char ** av;
   
  +    void * _ts;
  +    void * _gi;
  +    void * _h;
  +
       rpmvd vd;                /* Data object. */
   };
   struct rpmVT_s {
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to