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:   28-Mar-2008 16:28:11
  Branch: HEAD                             Handle: 2008032815281000

  Modified files:
    rpm/rpmio               rpmrepo.c

  Log:
    - jbj: rpmrepo: populate other.sqlite with real data.

  Summary:
    Revision    Changes     Path
    1.40        +55 -32     rpm/rpmio/rpmrepo.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmrepo.c
  ============================================================================
  $ cvs diff -u -r1.39 -r1.40 rpmrepo.c
  --- rpm/rpmio/rpmrepo.c       28 Mar 2008 14:04:26 -0000      1.39
  +++ rpm/rpmio/rpmrepo.c       28 Mar 2008 15:28:10 -0000      1.40
  @@ -823,6 +823,44 @@
       return s;
   }
   
  +static const char * rfileHeaderSprintfHack(Header h, const char * qfmt)
  +{
  +    static const char mark[] = "'XXX'";
  +    static size_t nmark = sizeof("'XXX'") - 1;
  +    const char * msg = NULL;
  +    char * s = (char *) headerSprintf(h, qfmt, NULL, NULL, &msg);
  +    char * f, * fe;
  +    int nsubs = 0;
  +
  +    if (s == NULL)
  +     repo_error(1, _("headerSprintf(%s): %s"), qfmt, msg);
  +
  +    /* Find & replace 'XXX' with '%{DBINSTANCE}' the hard way. */
  +    for (f = s; *f && (fe = strstr(f, "'XXX'")) != NULL; fe += nmark, f = fe)
  +     nsubs++;
  +
  +    if (nsubs > 0) {
  +     char instance[64];
  +     int xx = snprintf(instance, sizeof(instance), "'%u'",
  +             (unsigned) headerGetInstance(h));
  +     size_t tlen = strlen(s) + nsubs * ((int)strlen(instance) - (int)nmark);
  +     char * t = xmalloc(tlen + 1);
  +     char * te = t;
  +
  +     xx = xx;
  +     for (f = s; *f && (fe = strstr(f, mark)) != NULL; fe += nmark, f = fe) {
  +         *fe = '\0';
  +         te = stpcpy( stpcpy(te, f), instance);
  +     }
  +     if (*f)
  +         te = stpcpy(te, f);
  +     s = _free(s);
  +     s = t;
  +    }
  + 
  +    return s;
  +}
  +
   static int rfileSQLBindSprintf(rpmrfile rfile, sqlite3_stmt * stmt, int pos,
                Header h, const char * qfmt)
   {
  @@ -1275,13 +1313,10 @@
        /[EMAIL PROTECTED] fileSystem @*/
        /[EMAIL PROTECTED] rfile, h, fileSystem @*/
   {
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       const char * cmd;
       sqlite3_stmt * stmt;
       const char * tail;
       const char * qfmt;
  -    const char * q;
  -    int nq;
       int xx;
   
       cmd = sqlite3_mprintf("INSERT into '%q' values (?, ?);", "packages");
  @@ -1306,45 +1341,33 @@
       sqlite3_free((char *)cmd);
       cmd = NULL;
   
  -    cmd = sqlite3_mprintf("INSERT into '%q' values (?, ?, ?, ?);", 
"changelog");
  -
  -    xx = rfileSQL(rfile, "prepare",
  -     sqlite3_prepare(rfile->sqldb, cmd, (int)strlen(cmd), &stmt, &tail));
  -
  -    xx = rfileSQL(rfile, "reset",
  -     sqlite3_reset(stmt));
  -
  -    qfmt = 
"%|changelogname?{[%{CHANGELOGNAME:sqlescape}|%{CHANGELOGTIME}|%{CHANGELOGTEXT:sqlescape}\n]}|";
  -{   const char * author = "author";
  -    int date = 0;
  -    const char * changelog = "changelog";
  -
  -    q = rfileHeaderSprintf(h, qfmt);
  -    nq = (q ? strlen(q) : 0);
  -  if (nq > 0) {
       /* changelog 1 pkgKey INTEGER */
  -    xx = rfileSQLBindInt(rfile, stmt,  1, (int) repo->current);
  -
       /* changelog 2 author TEXT */
  -    xx = rfileSQLBindText(rfile, stmt, 2, author);
  -
       /* changelog 3 date INTEGER */
  -    xx = rfileSQLBindInt(rfile, stmt, 2, date);
  -
       /* changelog 4 changelog TEXT */
  -    xx = rfileSQLBindText(rfile, stmt, 2, changelog);
  +    qfmt = "\
  +%|changelogname?{[\
  +\nINSERT into changelog values (\
  +'XXX'\
  +, '%{CHANGELOGNAME:sqlescape}'\
  +, '%{CHANGELOGTIME}'\
  +, '%{CHANGELOGTEXT:sqlescape}'\
  +);\
  +]}:{\
  +\nINSERT into changelog ('%{DBINSTANCE}', '', '', '');\
  +}|\
  +\n";
  +    cmd = rfileHeaderSprintfHack(h, qfmt);
   
  -    xx = rfileSQLStep(rfile, stmt);
  +    xx = rfileSQL(rfile, "prepare",
  +     sqlite3_prepare(rfile->sqldb, cmd, (int)strlen(cmd), &stmt, &tail));
   
  -  }
  -  q = _free(q);
  -}
  +    xx = rfileSQLStep(rfile, stmt);
   
       xx = rfileSQL(rfile, "finalize",
        sqlite3_finalize(stmt));
   
  -    sqlite3_free((char *)cmd);
  -    cmd = NULL;
  +    cmd = _free(cmd);
   
       return 0;
   }
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to