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