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: 15-Apr-2010 18:40:34 Branch: HEAD Handle: 2010041516403300 Modified files: rpm/rpmio rpmsql.c Log: - rpmvt: WIP. Summary: Revision Changes Path 2.40 +120 -125 rpm/rpmio/rpmsql.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/rpmsql.c ============================================================================ $ cvs diff -u -r2.39 -r2.40 rpmsql.c --- rpm/rpmio/rpmsql.c 15 Apr 2010 13:11:06 -0000 2.39 +++ rpm/rpmio/rpmsql.c 15 Apr 2010 16:40:33 -0000 2.40 @@ -38,10 +38,10 @@ int _rpmsql_debug = 0; /*...@unchecked@*/ -int _rpmvt_debug = 0; +int _rpmvt_debug = -1; /*...@unchecked@*/ -int _rpmvc_debug = 0; +int _rpmvc_debug = -1; /*...@unchecked@*/ /*...@relnull@*/ rpmsql _rpmsqlI = NULL; @@ -55,6 +55,9 @@ #endif /* defined(WITH_SQLITE) */ /*==============================================================*/ + +#define VTDBG(_l) if (_rpmvt_debug) fprintf _l + /** * rpmvt pool destructor. */ @@ -66,7 +69,7 @@ rpmvt vt = &VT->vt; -SQLDBG((stderr, "==> %s(%p)\n", __FUNCTION__, vt)); +VTDBG((stderr, "==> %s(%p)\n", __FUNCTION__, vt)); vt->av = argvFree(vt->av); vt->ac = 0; } @@ -92,7 +95,7 @@ rpmvt rpmvtNew(void * pModule, rpmvData vd, const char * colSql) { - rpmvt vt = rpmvtGetPool(_rpmvtPool); + rpmvt vt = rpmvtLink(rpmvtGetPool(_rpmvtPool)); vt->av = NULL; vt->ac = 0; @@ -100,81 +103,93 @@ return vt; } -static int rpmvtCreate(void * _db, void * pAux, - int argc, const char *const * argv, - rpmvt * vtp, char ** pzErr) +static int rpmvtLoadArgv(rpmsql sql, sqlite3 * db, + rpmvt vt, int argc, const char *const * argv) { - sqlite3 * db = (sqlite3 *) _db; - rpmsql sql = _rpmsqlI; - rpmvt vt = rpmvtNew(pAux, NULL, NULL); + const char * _modName = argv[0]; + const char * _dbName = argv[1]; + const char * _tblName = argv[2]; + const char * url = (argv[3] ? argv[3] : "/"); + const char * path = NULL; + int ut = urlPath(url, &path); + char * fn = xstrdup(path); + size_t nfn = strlen(fn); + char * bn = (fn[nfn-1] == '/' ? fn : basename(fn)); + char * t = rpmExpand("CREATE TABLE ", _dbName, ".", _tblName, + " ( '", (bn && *bn ? bn : "val"), "' TEXT);", NULL); int rc = SQLITE_OK; int xx; -SQLDBG((stderr, "--> %s(%p,%p,%p[%u],%p,%p)\n", __FUNCTION__, db, pAux, argv, (unsigned)argc, vtp, pzErr)); -argvPrint("argv", (ARGV_t)argv, NULL); +VTDBG((stderr, "\t%s\n", t)); +#ifdef REFERENCE +/* XXX unsnark patterns from column names */ +create virtual table yumdb using Argv(/var/lib/yum/yumdb/[a-z]/[0-9a-f]*); +--> rpmvtCreate(0x9b632d8,(nil),0x9b71628[4],0x9b6f358,0xbf8b2bac) + CREATE TABLE main.yumdb ( '[0-9a-f]*' TEXT); +sqlite3_declare_vtab(0x9b632d8): rc(0) not an error +#endif - /* Create the columns in the virtual table. */ - { const char * _modName = argv[0]; - const char * _dbName = argv[1]; - const char * _tblName = argv[2]; - const char * url = (argv[3] ? argv[3] : "/"); - const char * path = NULL; - int ut = urlPath(url, &path); - char * fn = xstrdup(path); - size_t nfn = strlen(fn); - char * bn = (fn[nfn-1] == '/' ? fn : basename(fn)); - char * t = rpmExpand("CREATE TABLE ", _dbName, ".", _tblName, - " ( '", (bn && *bn ? bn : "val"), "' TEXT);", NULL); -SQLDBG((stderr, "\t%s\n", t)); - rc = rpmsqlCmd(sql, "declare_vtab", db, + rc = rpmsqlCmd(sql, "declare_vtab", db, sqlite3_declare_vtab(db, t)); - t = _free(t); + t = _free(t); - if (fn[0] == '/') { - if (Glob_pattern_p(fn, 0)) { - const char ** av = NULL; - int ac = 0; + if (fn[0] == '/') { + if (Glob_pattern_p(fn, 0)) { + const char ** av = NULL; + int ac = 0; - if (rpmGlob(url, &ac, &av)) - rc = SQLITE_NOTFOUND; /* XXX */ - else - xx = argvAppend(&vt->av, (ARGV_t)av); - av = argvFree(av); - } else - if (fn[nfn-1] == '/') { - DIR * dir = Opendir(url); - struct dirent * dp; - if (dir == NULL) - rc = SQLITE_NOTFOUND; /* XXX */ - else - while ((dp = Readdir(dir)) != NULL) - if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) + if (rpmGlob(url, &ac, &av)) + rc = SQLITE_NOTFOUND; /* XXX */ + else + xx = argvAppend(&vt->av, (ARGV_t)av); + av = argvFree(av); + } else + if (fn[nfn-1] == '/') { + DIR * dir = Opendir(url); + struct dirent * dp; + 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); - if (dir) xx = Closedir(dir); - } else - if (Access(fn, R_OK)) { - FD_t fd = Fopen(fn, "r.fpio"); - if (fd == NULL || Ferror(fd)) - rc = SQLITE_NOTFOUND; /* XXX */ - else - xx = argvFgets(&vt->av, fd); - if (fd) (void) Fclose(fd); - } else - rc = SQLITE_NOTFOUND; /* XXX */ - + if (dir) xx = Closedir(dir); } else - xx = argvAppend(&vt->av, (ARGV_t)&argv[3]); -argvPrint("vt->av", (ARGV_t)vt->av, NULL); - vt->ac = argvCount((ARGV_t)vt->av); - fn = _free(fn); - } + if (Access(fn, R_OK)) { + FD_t fd = Fopen(fn, "r.fpio"); + if (fd == NULL || Ferror(fd)) + rc = SQLITE_NOTFOUND; /* XXX */ + else + xx = argvFgets(&vt->av, fd); + if (fd) (void) Fclose(fd); + } else + rc = SQLITE_NOTFOUND; /* XXX */ + } else + xx = argvAppend(&vt->av, (ARGV_t)&argv[3]); + + vt->ac = argvCount((ARGV_t)vt->av); + + fn = _free(fn); + + return rc; +} + +static int rpmvtCreate(void * _db, void * pAux, + int argc, const char *const * argv, + rpmvt * vtp, char ** pzErr) +{ + sqlite3 * db = (sqlite3 *) _db; + rpmsql sql = _rpmsqlI; + rpmvt vt = rpmvtNew(pAux, NULL, NULL); + int rc = SQLITE_OK; + + /* Create the columns in the virtual table. */ + rc = rpmvtLoadArgv(sql, db, vt, argc, argv); if (vtp) *vtp = (!rc ? vt : NULL); else - vt = rpmvtFree(vt); - -SQLDBG((stderr, "<-- %s(%p,%p,%p[%u],%p,%p) rc %d vt %p\n", __FUNCTION__, db, pAux, argv, (unsigned)argc, vtp, pzErr, rc, vt)); + (void) rpmvtFree(vt); return rc; } @@ -187,34 +202,15 @@ rpmsql sql = _rpmsqlI; rpmvt vt = rpmvtNew(pAux, NULL, NULL); int rc = SQLITE_OK; - int xx; - -SQLDBG((stderr, "--> %s(%p,%p,%p[%u],%p,%p)\n", __FUNCTION__, db, pAux, argv, (unsigned)argc, vtp, pzErr)); -argvPrint("argv", (ARGV_t)argv, NULL); /* Create the columns in the virtual table. */ - { const char * _modName = argv[0]; - const char * _dbName = argv[1]; - const char * _tblName = argv[2]; - char * t = rpmExpand("CREATE TABLE ", - _dbName, "_", _tblName, "_", _modName, - " ( k INTEGER PRIMARY KEY, v TEXT );", NULL); - - rc = rpmsqlCmd(sql, "declare_vtab", db, - sqlite3_declare_vtab(db, t)); - t = _free(t); - } - if (argc > 3) { - xx = argvAppend(&vt->av, (ARGV_t) &argv[3]); - vt->ac = argvCount((ARGV_t)vt->av); - } + rc = rpmvtLoadArgv(sql, db, vt, argc, argv); if (vtp) - *vtp = (rpmvt ) (!rc ? vt : NULL); + *vtp = (rpmvt ) (!rc ? rpmvtLink(vt) : NULL); else - vt = _free(vt); + (void) rpmvtFree(vt); -SQLDBG((stderr, "<-- %s(%p,%p,%p[%u],%p,%p) rc %d\n", __FUNCTION__, db, pAux, argv, (unsigned)argc, vtp, pzErr, rc)); return rc; } @@ -222,61 +218,55 @@ { sqlite3_index_info * pInfo = (sqlite3_index_info *) _pInfo; int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p,%p) rc %d vt %p\n", __FUNCTION__, vt, pInfo, rc, vt)); +VTDBG((stderr, "<-- %s(%p,%p) rc %d\n", __FUNCTION__, vt, pInfo, rc)); return rc; } int rpmvtDisconnect(rpmvt vt) { - int rc = SQLITE_OK; -SQLDBG((stderr, "--> %s(%p)\n", __FUNCTION__, vt)); - vt = rpmvtFree(vt); -SQLDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); - return rc; + (void) rpmvtFree(vt); + return 0; /* SQLITE_OK */ } int rpmvtDestroy(rpmvt vt) { - int rc = SQLITE_OK; -SQLDBG((stderr, "--> %s(%p)\n", __FUNCTION__, vt)); - vt = rpmvtFree(vt); -SQLDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); - return rc; + (void) rpmvtFree(vt); + return 0; /* SQLITE_OK */ } int rpmvtUpdate(rpmvt vt, int argc, rpmvArg * _argv, int64_t * pRowid) { sqlite3_value ** argv = (sqlite3_value **) _argv; int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p,%p[%u],%p) rc %d vt %p\n", __FUNCTION__, vt, argv, (unsigned)argc, pRowid, rc, vt)); +VTDBG((stderr, "<-- %s(%p,%p[%u],%p) rc %d\n", __FUNCTION__, vt, argv, (unsigned)argc, pRowid, rc)); return rc; } int rpmvtBegin(rpmvt vt) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p) rc %d vt %p\n", __FUNCTION__, vt, rc, vt)); +VTDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); return rc; } int rpmvtSync(rpmvt vt) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p) rc %d vt %p\n", __FUNCTION__, vt, rc, vt)); +VTDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); return rc; } int rpmvtCommit(rpmvt vt) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p) rc %d vt %p\n", __FUNCTION__, vt, rc, vt)); +VTDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); return rc; } int rpmvtRollback(rpmvt vt) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p) rc %d vt %p\n", __FUNCTION__, vt, rc, vt)); +VTDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vt, rc)); return rc; } @@ -285,18 +275,21 @@ void ** ppArg) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p,%d,%s,%p,%p) rc %d vt %p\n", __FUNCTION__, vt, nArg, zName, pxFunc, ppArg, rc, vt)); +VTDBG((stderr, "<-- %s(%p,%d,%s,%p,%p) rc %d\n", __FUNCTION__, vt, nArg, zName, pxFunc, ppArg, rc)); return rc; } int rpmvtRename(rpmvt vt, const char * zNew) { int rc = SQLITE_OK; -SQLDBG((stderr, "<-- %s(%p,%s) rc %d vt %p\n", __FUNCTION__, vt, zNew, rc, vt)); +VTDBG((stderr, "<-- %s(%p,%s) rc %d\n", __FUNCTION__, vt, zNew, rc)); return rc; } /*==============================================================*/ + +#define VCDBG(_l) if (_rpmvc_debug) fprintf _l + /** * rpmvc pool destructor. */ @@ -307,8 +300,10 @@ struct rpmVC_s * VC = _VC; rpmvc vc = &VC->vc; -SQLDBG((stderr, "==> %s(%p)\n", __FUNCTION__, vc)); - +VCDBG((stderr, "==> %s(%p)\n", __FUNCTION__, vc)); + if (vc->vt) + (void) rpmvtFree(vc->vt); + vc->vt = NULL; } /*...@unchecked@*/ /*...@only@*/ /*...@null@*/ @@ -332,9 +327,9 @@ rpmvc rpmvcNew(rpmvt vt, int nrows) { - rpmvc vc = rpmvcGetPool(_rpmvcPool); + rpmvc vc = rpmvcLink(rpmvcGetPool(_rpmvcPool)); - vc->vt = vt; + vc->vt = rpmvtLink(vt); vc->ix = -1; vc->nrows = nrows; @@ -347,26 +342,23 @@ { rpmvc vc = rpmvcNew(vt, vt->ac); int rc = SQLITE_OK; -SQLDBG((stderr, "--> %s(%p,%p)\n", __FUNCTION__, vt, vcp)); if (vcp) *vcp = vc; else - vc = rpmvcFree(vc); + (void) rpmvcFree(vc); -SQLDBG((stderr, "<-- %s(%p,%p) rc %d vc %p\n", __FUNCTION__, vt, vcp, rc, vc)); return rc; } int rpmvcClose(rpmvc vc) { - int rc = SQLITE_OK; - -SQLDBG((stderr, "--> %s(%p)\n", __FUNCTION__, vc)); - vc = rpmvcFree(vc); - -SQLDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vc, rc)); - return rc; + /* XXX unnecessary but the debug spewage is confusing. */ + if (vc->vt) + (void) rpmvtFree(vc->vt); + vc->vt = NULL; + (void) rpmvcFree(vc); + return 0; /* SQLITE_OK */ } int rpmvcFilter(rpmvc vc, int idxNum, const char * idxStr, @@ -378,7 +370,7 @@ if (vc->nrows > 0) vc->ix = 0; -SQLDBG((stderr, "<-- %s(%p,%d,%s,%p[%u]) rc %d vc %p\n", __FUNCTION__, vc, idxNum, idxStr, argv, (unsigned)argc, rc, vc)); +VCDBG((stderr, "<-- %s(%p,%d,%s,%p[%u]) rc %d\n", __FUNCTION__, vc, idxNum, idxStr, argv, (unsigned)argc, rc)); return rc; } @@ -388,7 +380,8 @@ vc->ix++; -SQLDBG((stderr, "<-- %s(%p) rc %d (%d:%d)\n", __FUNCTION__, vc, rc, vc->ix, vc->nrows)); +if (!(vc->ix >= 0 && vc->ix < vc->nrows)) +VCDBG((stderr, "<-- %s(%p) rc %d (%d:%d)\n", __FUNCTION__, vc, rc, vc->ix, vc->nrows)); return rc; } @@ -396,7 +389,8 @@ { int rc = (vc->ix >= 0 && vc->ix < vc->nrows ? 0 : 1); -SQLDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vc, rc)); +if (rc) +VCDBG((stderr, "<-- %s(%p) rc %d\n", __FUNCTION__, vc, rc)); return rc; } @@ -411,7 +405,7 @@ default: sqlite3_result_null(pContext); break; } -SQLDBG((stderr, "<-- %s(%p,%p,%d) rc %d\n", __FUNCTION__, vc, pContext, N, rc)); +VCDBG((stderr, "<-- %s(%p,%p,%d) rc %d\n", __FUNCTION__, vc, pContext, N, rc)); return rc; } @@ -423,7 +417,7 @@ if (pRowid) *pRowid = vc->ix; -SQLDBG((stderr, "<-- %s(%p,%p) rc %d vc %p\n", __FUNCTION__, vc, pRowid, rc, vc)); +VCDBG((stderr, "<-- %s(%p,%p) rc %d\n", __FUNCTION__, vc, pRowid, rc)); return rc; } @@ -511,11 +505,12 @@ /*...@modifies fileSystem @*/ { sqlite3 * db; + switch (rc) { case SQLITE_OK: case SQLITE_ROW: case SQLITE_DONE: - if (!_rpmsql_debug) + if (1 || !_rpmsql_debug) break; /*...@fallthrough@*/ default: @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
