RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 07-May-2012 21:56:38 Branch: rpm-5_4 Handle: 2012050719563800 Modified files: (Branch: rpm-5_4) rpm/rpmdb sqlite.c Log: - sqldb: eliminate sql_get_table() everywhere, sql_exec+callback instead. - sqldb: rip out existing transaction code prior to replacing. - sqldb: disable the chroot code until the error can be revisted. Summary: Revision Changes Path 1.44.4.10 +44 -115 rpm/rpmdb/sqlite.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmdb/sqlite.c ============================================================================ $ cvs diff -u -r1.44.4.9 -r1.44.4.10 sqlite.c --- rpm/rpmdb/sqlite.c 7 May 2012 17:01:09 -0000 1.44.4.9 +++ rpm/rpmdb/sqlite.c 7 May 2012 19:56:38 -0000 1.44.4.10 @@ -306,6 +306,7 @@ _b = _c[2]; _c[2] = _c[1]; _c[1] = _b; \ } +#ifdef DYING /*@unchecked@*/ /*@only@*/ /*@null@*/ static const char * sqlCwd = NULL; /*@unchecked@*/ @@ -369,6 +370,10 @@ sqlInRoot = 0; } +#else +#define enterChroot(_dbi) +#define leaveChroot(_dbi) +#endif /*==============================================================*/ int _scp_debug = 0; @@ -844,88 +849,25 @@ return rc; } -static int sql_startTransaction(dbiIndex dbi) - /*@*/ -{ - rpmsql sql = (rpmsql) dbi->dbi_db; - int rc = 0; - - if (!sql->transaction) { - static char _cmd[] = " BEGIN TRANSACTION;"; - rc = sql_exec(dbi, _cmd, NULL, NULL); - - if (rc == 0) - sql->transaction = 1; - } - - return rc; -} - -static int sql_endTransaction(dbiIndex dbi) +static int sql_busy_handler(void * _dbi, int time) /*@*/ { - rpmsql sql = (rpmsql) dbi->dbi_db; - int rc = 0; - - if (sql->transaction) { - static char _cmd[] = " END TRANSACTION;"; - rc = sql_exec(dbi, _cmd, NULL, NULL); - - if (rc == 0) - sql->transaction = 0; - } - - return rc; -} - -static int sql_commitTransaction(dbiIndex dbi, int flag) - /*@*/ -{ - rpmsql sql = (rpmsql) dbi->dbi_db; - int rc = 0; - - if (sql->transaction) { - static char _cmd[] = " COMMIT;"; - rc = sql_exec(dbi, _cmd, NULL, NULL); - - sql->transaction = 0; - - /* Start a new transaction if we were in the middle of one */ - if (flag == 0) - rc = sql_startTransaction(dbi); - } - - return rc; -} - -static int sql_busy_handler(void * dbi_void, int time) - /*@*/ -{ -/*@-castexpose@*/ - dbiIndex dbi = (dbiIndex) dbi_void; -/*@=castexpose@*/ + dbiIndex dbi = (dbiIndex) _dbi; + int rc = 1; /* assume retry */ +#ifdef DYING rpmlog(RPMLOG_WARNING, _("Unable to get lock on db %s, retrying... (%d)\n"), dbi->dbi_file, time); +#endif + /* XXX FIXME: backoff timer with drop dead ceiling. */ (void) sleep(1); - return 1; +SQLDBDEBUG(dbi, (stderr, "<-- %s(%p,%d) rc %d\n", __FUNCTION__, _dbi, time, rc)); + return rc; } /* =================================================================== */ -static int sql_get_table(dbiIndex dbi, SCP_t scp, const char * cmd) -{ - rpmsql sql = (rpmsql) dbi->dbi_db; - sqlite3 * sqlI = (sqlite3 *) sql->I; - int rc = cvtdberr(dbi, "sqlite3_get_table", - sqlite3_get_table(sqlI, cmd, - &scp->av, &scp->nr, &scp->nc, &scp->pzErrmsg)); - -SQLDBDEBUG(dbi, (stderr, "%s\n<-- %s(%p,%p) rc %d av %p nr %d nc %d %s\n", cmd, __FUNCTION__, dbi, scp, rc, scp->av, scp->nr, scp->nc, scp->pzErrmsg)); - - return rc; -} /* XXX FIXME: all the "new.key" fields in trigger need headerGet() getter */ static const char _Packages_sql_init[] = "\ @@ -1214,8 +1156,8 @@ /*@globals fileSystem, internalState @*/ /*@modifies dbi, *dbcursor, fileSystem, internalState @*/ { - SCP_t scp = (SCP_t)dbcursor; - int rc; + SCP_t scp = (SCP_t) dbcursor; + int rc = 0; SQLDBDEBUG(dbi, (stderr, "==> sql_cclose(%p)\n", scp)); @@ -1227,11 +1169,6 @@ enterChroot(dbi); - if (flags == DB_WRITECURSOR) - rc = sql_commitTransaction(dbi, 1); - else - rc = sql_endTransaction(dbi); - /*@-kepttrans -nullstate@*/ scp = scpFree(scp); /*@=kepttrans =nullstate@*/ @@ -1262,9 +1199,6 @@ enterChroot(dbi); - /* Commit, don't open a new one */ - rc = sql_commitTransaction(dbi, 1); - xx = cvtdberr(dbi, "sqlite3_close", sqlite3_close(sqlI)); sql->I = sqlI = NULL; @@ -1285,12 +1219,17 @@ dbi->dbi_stats = _free(dbi->dbi_stats); dbi->dbi_file = _free(dbi->dbi_file); + /* XXX different than Berkeley DB: privately allocated. */ sql = rpmsqlFree(sql); dbi->dbi_db = sql = NULL; leaveChroot(dbi); } +#ifdef NOTYET /* XXX FIXME: double free */ + dbi = db3Free(dbi); +#endif + SQLDBDEBUG(dbi, (stderr, "<-- %s(%p,0x%x) rc %d\n", __FUNCTION__, dbi, flags, rc)); return rc; } @@ -1462,9 +1401,7 @@ { int rc = 0; -enterChroot(dbi); - rc = sql_commitTransaction(dbi, 0); -leaveChroot(dbi); + /* XXX FIXME: implement. */ SQLDBDEBUG(dbi, (stderr, "<-- %s(%p,0x%x) rc %d\n", __FUNCTION__, dbi, flags, rc)); return rc; @@ -1550,10 +1487,6 @@ enterChroot(dbi); - /* If we're going to write, start a transaction (lock the DB) */ - if (flags == DB_WRITECURSOR) - rc = sql_startTransaction(dbi); - if (dbcp) /*@-onlytrans@*/ *dbcp = dbcursor; /*@=onlytrans@*/ else @@ -1657,11 +1590,6 @@ * to later iteration confusion. (It may return the same value for the multiple keys.) */ -#ifdef DYING -/* Only RPMDBI_PACKAGES is supposed to be iterating, and this is guarenteed to be unique */ -assert(dbi->dbi_rpmtag == RPMDBI_PACKAGES); -#endif - switch (dbi->dbi_rpmtag) { case RPMDBI_PACKAGES: scp->cmd = sqlite3_mprintf("SELECT key FROM '%q' ORDER BY key;", @@ -1980,6 +1908,19 @@ return rc; } +static int sql_stat_cb(void * _dbi, int argc, char ** argv, char ** cols) +{ + dbiIndex dbi = (dbiIndex) _dbi; + int rc = -1; + if (dbi && argc == 1) { + char * end = NULL; + dbi->dbi_table_nkeys = strtoll(argv[0], &end, 10); + if (end && *end == '\0') rc = 0; + } +SQLDBDEBUG(dbi, (stderr, "<-- %s(%p,%p[%d],%p) rc %d table_nkeys %llu\n", __FUNCTION__, _dbi, argv, argc, cols, rc, (unsigned long long) (dbi ? dbi->dbi_table_nkeys : 0))); + return rc; +} + /** \ingroup dbi * Save statistics in database handle. * @param dbi index database handle @@ -1990,43 +1931,31 @@ /*@globals fileSystem, internalState @*/ /*@modifies dbi, fileSystem, internalState @*/ { +#ifdef UNUSED rpmsql sql = (rpmsql) dbi->dbi_db; - SCP_t scp = scpNew(sql); +#endif + char * cmd; int rc = 0; - long nkeys = -1; dbi->dbi_stats = _free(dbi->dbi_stats); + dbi->dbi_table_nkeys = -1; /*@-sizeoftype@*/ dbi->dbi_stats = (void *) xcalloc(1, sizeof(DB_HASH_STAT)); /*@=sizeoftype@*/ - scp->cmd = sqlite3_mprintf(" SELECT COUNT('key') FROM '%q';", dbi->dbi_subfile); + cmd = sqlite3_mprintf(" SELECT COUNT('key') FROM '%q';", dbi->dbi_subfile); /*@-nullstate@*/ enterChroot(dbi); - rc = sql_get_table(dbi, scp, scp->cmd); + rc = sql_exec(dbi, cmd, sql_stat_cb, dbi); leaveChroot(dbi); /*@=nullstate@*/ + cmd = _free(cmd); - if (rc == 0 && scp->nr > 0) { -assert(scp->av != NULL); - nkeys = strtol(scp->av[1], NULL, 10); - - rpmlog(RPMLOG_DEBUG, D_(" stat on %s nkeys %ld\n"), - dbi->dbi_subfile, nkeys); - } else { - if (rc) { - rpmlog(RPMLOG_DEBUG, D_("stat failed %s (%d)\n"), - scp->pzErrmsg, rc); - } - } - - if (nkeys < 0) - nkeys = 4096; /* Good high value */ + if (dbi->dbi_table_nkeys < 0) + dbi->dbi_table_nkeys = 4096; /* XXX hacky */ - ((DB_HASH_STAT *)(dbi->dbi_stats))->hash_nkeys = nkeys; - - scp = scpFree(scp); + ((DB_HASH_STAT *)(dbi->dbi_stats))->hash_nkeys = dbi->dbi_table_nkeys; return rc; } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org