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: 06-Apr-2010 22:12:26 Branch: HEAD Handle: 2010040620122401 Modified files: rpm CHANGES rpm/rpmio rpmsql.c rpm/tools dbsql.c Log: - dbsql: incremental step toward the desired rpmsql object API. - rpmsql: add rc checking for sqlite3_foo() calls (a la rpmrepo.c). Summary: Revision Changes Path 1.3305 +2 -0 rpm/CHANGES 2.6 +233 -114 rpm/rpmio/rpmsql.c 2.9 +4 -3 rpm/tools/dbsql.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3304 -r1.3305 CHANGES --- rpm/CHANGES 5 Apr 2010 21:27:56 -0000 1.3304 +++ rpm/CHANGES 6 Apr 2010 20:12:24 -0000 1.3305 @@ -1,5 +1,7 @@ 5.2b1 -> 5.3a1 + - jbj: dbsql: incremental step toward the desired rpmsql object API. + - jbj: rpmsql: add rc checking for sqlite3_foo() calls (a la rpmrepo.c). - jbj: dbsql: disembowel tools/dbsql.c and push the offal into rpmsql.c. - jbj: dbsql: send spewage to stdout or append to an iob, as needed. - jbj: dbsql: move popt tables into -lrpmo for use by rpmsql ctor. @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmsql.c ============================================================================ $ cvs diff -u -r2.5 -r2.6 rpmsql.c --- rpm/rpmio/rpmsql.c 5 Apr 2010 21:27:56 -0000 2.5 +++ rpm/rpmio/rpmsql.c 6 Apr 2010 20:12:25 -0000 2.6 @@ -91,6 +91,85 @@ static struct rpmsql_s _sql; /*==============================================================*/ +static void rpmsqlDebugDump(rpmsql sql) +{ +SQLDBG((stderr, "==> %s(%p) _rpmsqlI %p\n", __FUNCTION__, sql, _rpmsqlI)); + if (sql) { + fprintf(stderr, "\t flags: 0x%x\n", sql->flags); + fprintf(stderr, "\t av: %p[%u]\n", sql->av, (unsigned)argvCount(sql->av)); + fprintf(stderr, "\t I: %p\n", sql->I); + fprintf(stderr, "\t S: %p\n", sql->S); + fprintf(stderr, "\t init: %s\n", sql->zInitFile); + fprintf(stderr, "\t database: %s\n", sql->zDbFilename); + fprintf(stderr, "\t table: %s\n", sql->zDestTable); + + fprintf(stderr, "\t mode: 0x%x\n", sql->mode); + fprintf(stderr, "\t cnt: 0x%x\n", sql->cnt); + fprintf(stderr, "\t iob: %p\n", sql->iob); + fprintf(stderr, "\t out: %p\n", sql->out); + fprintf(stderr, "\t log: %p\n", sql->pLog); + fprintf(stderr, "\t trace: %p\n", sql->iotrace); + + if (sql->explainPrev.valid) { + fprintf(stderr, "\t explain:\n"); + fprintf(stderr, "\t\t mode: 0x%x\n", sql->explainPrev.mode); + fprintf(stderr, "\t\tflags: 0x%x\n", sql->explainPrev.flags); + } + + fprintf(stderr, "\tseparator: %.*s\n", (int)sizeof(sql->separator), sql->separator); + fprintf(stderr, "\tnullvalue: %.*s\n", (int)sizeof(sql->nullvalue), sql->nullvalue); + fprintf(stderr, "\t outfile: %.*s\n", (int)sizeof(sql->outfile), sql->outfile); + fprintf(stderr, "\t home: %s\n", sql->zHome); + fprintf(stderr, "\t initrc: %s\n", sql->zInitrc); + fprintf(stderr, "\t history: %s\n", sql->zHistory); + fprintf(stderr, "\t prompt: %s\n", sql->zPrompt); + fprintf(stderr, "\t continue: %s\n", sql->zContinue); + } +} + +/** + * Print an error message and exit (if requested). + * @param lvl error level (non-zero exits) + * @param fmt msg format + */ +/*...@mayexit@*/ +static void +rpmsql_error(int lvl, const char *fmt, ...) + /*...@globals fileSystem @*/ + /*...@modifies fileSystem @*/ +{ + va_list ap; + + va_start(ap, fmt); + (void) fflush(NULL); +#ifdef NOTYET + (void) fprintf(stderr, "%s: ", __progname); +#endif + (void) vfprintf(stderr, fmt, ap); + va_end (ap); + (void) fprintf(stderr, "\n"); + if (lvl) + exit(EXIT_FAILURE); +} + +/** + * Check sqlite3 return, displaying error messages. + * @param sql sql interpreter + * @return SQLITE_OK on success + */ +static int rpmsqlCmd(rpmsql sql, const char * msg, void * _db, int rc) + /*...@globals fileSystem @*/ + /*...@modifies fileSystem @*/ +{ + if (rc != SQLITE_OK || _rpmsql_debug) { + sqlite3 * db = (sqlite3 *) (_db ? _db : sql->I); + rpmsql_error(0, "sqlite3_%s: %s", msg, + sqlite3_errmsg(db)); + } + return rc; +} + +/*==============================================================*/ /* Saved resource information for the beginning of an operation */ static struct rusage sBegin; @@ -142,9 +221,8 @@ /*...@globals _rpmsqlI @*/ /*...@modifies _rpmsqlI @*/ { - if (_rpmsqlI == NULL) { + if (_rpmsqlI == NULL) _rpmsqlI = rpmsqlNew(NULL, 0); - } SQLDBG((stderr, "<== %s() _rpmsqlI %p\n", __FUNCTION__, _rpmsqlI)); return _rpmsqlI; } @@ -250,12 +328,14 @@ db = (sqlite3 *)sql->I; if (db == NULL) { -SQLDBG((stderr, "--> %s(%p) %s\n", __FUNCTION__, sql, sql->zDbFilename)); - sqlite3_open(sql->zDbFilename, &db); + int rc; + rc = rpmsqlCmd(sql, "open", db, /* XXX watchout: arg order */ + sqlite3_open(sql->zDbFilename, &db)); sql->I = db; if (db && sqlite3_errcode(db) == SQLITE_OK) { - sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, - shellstaticFunc, 0, 0); + (void) rpmsqlCmd(sql, "create_function", db, + sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, + shellstaticFunc, 0, 0)); } if (db == NULL || SQLITE_OK != sqlite3_errcode(db)) { @@ -266,10 +346,12 @@ } /* Enable extension loading (if not disabled). */ if (!F_ISSET(sql, NOLOAD)) - sqlite3_enable_load_extension(db, 1); + (void) rpmsqlCmd(sql, "enable_load_extension", db, + sqlite3_enable_load_extension(db, 1)); } rc = 0; exit: +SQLDBG((stderr, "<-- %s(%p) rc %d %s\n", __FUNCTION__, sql, rc, sql->zDbFilename)); #endif return rc; } @@ -795,10 +877,7 @@ } } - zIn = (char *) realloc(zIn, len); - if (!zIn) { - return 0; - } + zIn = (char *) xrealloc(zIn, len); if (quote) { char *zCsr = &zIn[nIn]; @@ -833,20 +912,21 @@ sqlite3_stmt *pSelect; int rc; SQLDBG((stderr, "--> %s(%p,%p,%s,%s)\n", __FUNCTION__, sql, db, zSelect, zFirstRow)); - rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0); - if (rc != SQLITE_OK || !pSelect) { + rc = rpmsqlCmd(sql, "prepare", db, + sqlite3_prepare(db, zSelect, -1, &pSelect, 0)); + if (rc || pSelect == NULL) return rc; - } - rc = sqlite3_step(pSelect); - while (rc == SQLITE_ROW) { + + while ((rc = sqlite3_step(pSelect)) == SQLITE_ROW) { if (zFirstRow) { rpmsqlFprintf(sql, "%s", zFirstRow); - zFirstRow = 0; + zFirstRow = NULL; } rpmsqlFprintf(sql, "%s;\n", sqlite3_column_text(pSelect, 0)); - rc = sqlite3_step(pSelect); } - return sqlite3_finalize(pSelect); + + return rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pSelect)); } /*==============================================================*/ @@ -873,17 +953,13 @@ fflush(stdout); } nLine = 100; - zLine = malloc(nLine); - if (zLine == 0) - return 0; + zLine = xmalloc(nLine); n = 0; eol = 0; while (!eol) { if (n + 100 > nLine) { nLine = nLine * 2 + 100; - zLine = realloc(zLine, nLine); - if (zLine == 0) - return 0; + zLine = xrealloc(zLine, nLine); } if (fgets(&zLine[n], nLine - n, in) == 0) { if (n == 0) { @@ -905,7 +981,7 @@ eol = 1; } } - zLine = realloc(zLine, n + 1); + zLine = xrealloc(zLine, n + 1); return zLine; } @@ -976,8 +1052,9 @@ } while (zSql[0] && (SQLITE_OK == rc)) { - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); - if (SQLITE_OK != rc) { + rc = rpmsqlCmd(sql, "prepare_v2", db, + sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover)); + if (rc) { if (pzErrMsg) { *pzErrMsg = save_err_msg(db); } @@ -1007,8 +1084,7 @@ /* allocate space for col name ptr, value ptr, and type */ int nCol = sqlite3_column_count(pStmt); void *pData = - sqlite3_malloc(3 * nCol * sizeof(const char *) + - 1); + sqlite3_malloc(3 * nCol * sizeof(const char *) + 1); if (!pData) { rc = SQLITE_NOMEM; } else { @@ -1063,7 +1139,8 @@ /* Finalize the statement just executed. If this fails, save a ** copy of the error message. Otherwise, set zSql to point to the ** next statement to execute. */ - rc = sqlite3_finalize(pStmt); + rc = rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); if (rc == SQLITE_OK) { zSql = zLeftover; while (isspace(zSql[0])) @@ -1137,8 +1214,9 @@ zTableInfo = appendText(zTableInfo, zTable, '"'); zTableInfo = appendText(zTableInfo, ");", 0); - rc = sqlite3_prepare(db, zTableInfo, -1, &pTableInfo, 0); - free(zTableInfo); + rc = rpmsqlCmd(sql, "prepare", db, + sqlite3_prepare(db, zTableInfo, -1, &pTableInfo, 0)); + zTableInfo = _free(zTableInfo); if (rc != SQLITE_OK || !pTableInfo) { return 1; } @@ -1163,11 +1241,13 @@ } nRow++; } - rc = sqlite3_finalize(pTableInfo); + rc = rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pTableInfo)); if (rc != SQLITE_OK || nRow == 0) { - free(zSelect); + zSelect = _free(zSelect); return 1; } + zSelect = appendText(zSelect, "|| ')' FROM ", 0); zSelect = appendText(zSelect, zTable, '"'); @@ -1202,9 +1282,7 @@ int len = strlen30(zQuery); if (pzErrMsg) sqlite3_free(*pzErrMsg); - zQ2 = malloc(len + 100); - if (zQ2 == 0) - return rc; + zQ2 = xmalloc(len + 100); sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); rc = sqlite3_exec(db, zQ2, dump_callback, sql, pzErrMsg); @@ -1397,17 +1475,22 @@ zDestFile = azArg[2]; zDb = azArg[1]; } - rc = sqlite3_open(zDestFile, &pDest); - if (rc != SQLITE_OK) { + rc = rpmsqlCmd(sql, "open", pDest, + sqlite3_open(zDestFile, &pDest)); + if (rc) { +#ifdef DYING fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile); - sqlite3_close(pDest); +#endif + (void) rpmsqlCmd(sql, "close", pDest, + sqlite3_close(pDest)); return 1; } _rpmsqlOpenDB(sql); pBackup = sqlite3_backup_init(pDest, "main", db, zDb); if (pBackup == 0) { fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); - sqlite3_close(pDest); + (void) rpmsqlCmd(sql, "close", pDest, + sqlite3_close(pDest)); return 1; } while ((rc = sqlite3_backup_step(pBackup, 100)) == SQLITE_OK) { @@ -1419,7 +1502,8 @@ fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); rc = 1; } - sqlite3_close(pDest); + (void) rpmsqlCmd(sql, "close", pDest, + sqlite3_close(pDest)); } else if (c == 'b' && n >= 3 && strncmp(azArg[0], "bail", n) == 0 && nArg > 1 && nArg < 3) { @@ -1580,30 +1664,29 @@ return 1; } zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); - if (zSql == 0) { - fprintf(stderr, "Error: out of memory\n"); - return 1; - } +assert(zSql != NULL); nByte = strlen30(zSql); - rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + rc = rpmsqlCmd(sql, "prepare", db, + sqlite3_prepare(db, zSql, -1, &pStmt, 0)); sqlite3_free(zSql); if (rc) { +#ifdef DYING sqlite3 * db = (sqlite3 *)sql->I; - if (pStmt) - sqlite3_finalize(pStmt); fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); +#endif + if (pStmt) { + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); + } return 1; } nCol = sqlite3_column_count(pStmt); - sqlite3_finalize(pStmt); + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); pStmt = 0; if (nCol == 0) return 0; /* no columns, no error */ - zSql = malloc(nByte + 20 + nCol * 2); - if (zSql == 0) { - fprintf(stderr, "Error: out of memory\n"); - return 1; - } + zSql = xmalloc(nByte + 20 + nCol * 2); sqlite3_snprintf(nByte + 20, zSql, "INSERT INTO '%q' VALUES(?", zTable); j = strlen30(zSql); @@ -1613,27 +1696,33 @@ } zSql[j++] = ')'; zSql[j] = 0; - rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); - free(zSql); + rc = rpmsqlCmd(sql, "prepare", db, + sqlite3_prepare(db, zSql, -1, &pStmt, 0)); + zSql = _free(zSql); if (rc) { +#ifdef DYING sqlite3 * db = (sqlite3 *)sql->I; fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); - if (pStmt) - sqlite3_finalize(pStmt); +#endif + if (pStmt) { + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); + } return 1; } in = fopen(zFile, "rb"); if (in == 0) { fprintf(stderr, "Error: cannot open \"%s\"\n", zFile); - sqlite3_finalize(pStmt); + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); return 1; } azCol = malloc(sizeof(azCol[0]) * (nCol + 1)); - if (azCol == 0) { - fprintf(stderr, "Error: out of memory\n"); + if (azCol == NULL) { fclose(in); - sqlite3_finalize(pStmt); - return 1; + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); +assert(azCol); } sqlite3_exec(db, "BEGIN", 0, 0, 0); zCommit = "COMMIT"; @@ -1668,11 +1757,14 @@ SQLITE_STATIC); } sqlite3_step(pStmt); - rc = sqlite3_reset(pStmt); - free(zLine); - if (rc != SQLITE_OK) { + rc = rpmsqlCmd(sql, "reset", db, + sqlite3_reset(pStmt)); + zLine = _free(zLine); + if (rc) { +#ifdef DYING sqlite3 * db = (sqlite3 *)sql->I; fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); +#endif zCommit = "ROLLBACK"; rc = 1; break; /* from while */ @@ -1680,8 +1772,10 @@ } /* end while */ free(azCol); fclose(in); - sqlite3_finalize(pStmt); - sqlite3_exec(db, zCommit, 0, 0, 0); + (void) rpmsqlCmd(sql, "finalize", db, + sqlite3_finalize(pStmt)); + (void) rpmsqlCmd(sql, "exec", db, + sqlite3_exec(db, zCommit, 0, 0, 0)); } else if (c == 'i' && strncmp(azArg[0], "indices", n) == 0 && nArg < 3) { /* XXX recursion b0rkage lies here. */ @@ -1690,38 +1784,42 @@ sql->flags &= ~RPMSQL_FLAGS_SHOWHDR; sql->mode = RPMSQL_MODE_LIST; if (nArg == 1) { - rc = sqlite3_exec(db, + rc = rpmsqlCmd(sql, "exec", db, + sqlite3_exec(db, "SELECT name FROM sqlite_master " "WHERE type='index' AND name NOT LIKE 'sqlite_%' " "UNION ALL " "SELECT name FROM sqlite_temp_master " "WHERE type='index' " - "ORDER BY 1", callback, sql, &zErrMsg); + "ORDER BY 1", callback, sql, &zErrMsg)); } else { _rpmsqlShellStatic = azArg[1]; - rc = sqlite3_exec(db, + rc = rpmsqlCmd(sql, "exec", db, + sqlite3_exec(db, "SELECT name FROM sqlite_master " "WHERE type='index' AND tbl_name LIKE shellstatic() " "UNION ALL " "SELECT name FROM sqlite_temp_master " "WHERE type='index' AND tbl_name LIKE shellstatic() " - "ORDER BY 1", callback, sql, &zErrMsg); + "ORDER BY 1", callback, sql, &zErrMsg)); _rpmsqlShellStatic = NULL; } if (zErrMsg) { fprintf(stderr, "Error: %s\n", zErrMsg); sqlite3_free(zErrMsg); rc = 1; - } else if (rc != SQLITE_OK) { + } else if (rc) { +#ifdef DYING fprintf(stderr, "Error: querying sqlite_master and sqlite_temp_master\n"); +#endif rc = 1; } } else #ifdef SQLITE_ENABLE_IOTRACE if (c == 'i' && strncmp(azArg[0], "iotrace", n) == 0) { extern void (*sqlite3IoTrace) (const char *, ...); - if (sql->iotrace && fileno(sql->iotrace) > 2) + if (sql->iotrace && fileno(sql->iotrace) > STDERR_FILENO) fclose(sql->iotrace); sql->iotrace = NULL; if (nArg < 2) { @@ -1749,8 +1847,9 @@ zProc = nArg >= 3 ? azArg[2] : 0; if (!F_ISSET(sql, NOLOAD)) { _rpmsqlOpenDB(sql); - rc = sqlite3_load_extension(db, zFile, zProc, &zErrMsg); - if (rc != SQLITE_OK) { + rc = rpmsqlCmd(sql, "load_extension", db, + sqlite3_load_extension(db, zFile, zProc, &zErrMsg)); + if (rc) { fprintf(stderr, "Error: %s\n", zErrMsg); sqlite3_free(zErrMsg); rc = 1; @@ -1760,7 +1859,7 @@ if (c == 'l' && strncmp(azArg[0], "log", n) == 0 && nArg >= 1) { const char *zFile = azArg[1]; - if (sql->pLog && fileno(sql->pLog) > 2) + if (sql->pLog && fileno(sql->pLog) > STDERR_FILENO) fclose(sql->pLog); sql->pLog = NULL; if (strcmp(zFile, "stdout") == 0) { @@ -1823,7 +1922,7 @@ azArg[1]); } else if (c == 'o' && strncmp(azArg[0], "output", n) == 0 && nArg == 2) { - if (fileno(sql->out) > 2) + if (fileno(sql->out) > STDERR_FILENO) fclose(sql->out); sql->out = NULL; if (strcmp(azArg[1], "stdout") == 0) { @@ -1882,21 +1981,27 @@ zSrcFile = azArg[2]; zDb = azArg[1]; } - rc = sqlite3_open(zSrcFile, &pSrc); - if (rc != SQLITE_OK) { + rc = rpmsqlCmd(sql, "open", pSrc, /* XXX watchout: arg order */ + sqlite3_open(zSrcFile, &pSrc)); + if (rc) { +#ifdef DYING fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); - sqlite3_close(pSrc); +#endif + (void) rpmsqlCmd(sql, "close", pSrc, + sqlite3_close(pSrc)); return 1; } _rpmsqlOpenDB(sql); pBackup = sqlite3_backup_init(db, zDb, pSrc, "main"); if (pBackup == 0) { fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); - sqlite3_close(pSrc); + (void) rpmsqlCmd(sql, "close", db, + sqlite3_close(pSrc)); return 1; } while ((rc = sqlite3_backup_step(pBackup, 100)) == SQLITE_OK - || rc == SQLITE_BUSY) { + || rc == SQLITE_BUSY) + { if (rc == SQLITE_BUSY) { if (nTimeout++ >= 3) break; @@ -1904,16 +2009,22 @@ } } sqlite3_backup_finish(pBackup); - if (rc == SQLITE_DONE) { + switch (rc) { + case SQLITE_DONE: rc = 0; - } else if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED) { + break; + case SQLITE_BUSY: + case SQLITE_LOCKED: fprintf(stderr, "Error: source database is busy\n"); rc = 1; - } else { + break; + default: fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); rc = 1; + break; } - sqlite3_close(pSrc); + (void) rpmsqlCmd(sql, "close", pSrc, + sqlite3_close(pSrc)); } else if (c == 's' && strncmp(azArg[0], "schema", n) == 0 && nArg < 3) { /* XXX recursion b0rkage lies here. */ @@ -2017,31 +2128,33 @@ char *zErrMsg; _rpmsqlOpenDB(sql); if (nArg == 1) { - rc = sqlite3_get_table(db, + rc = rpmsqlCmd(sql, "get_table", db, + sqlite3_get_table(db, "SELECT name FROM sqlite_master " "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' " "UNION ALL " "SELECT name FROM sqlite_temp_master " "WHERE type IN ('table','view') " "ORDER BY 1", - &azResult, &nRow, 0, &zErrMsg); + &azResult, &nRow, 0, &zErrMsg)); } else { _rpmsqlShellStatic = azArg[1]; - rc = sqlite3_get_table(db, + rc = rpmsqlCmd(sql, "get_table", db, + sqlite3_get_table(db, "SELECT name FROM sqlite_master " "WHERE type IN ('table','view') AND name LIKE shellstatic() " "UNION ALL " "SELECT name FROM sqlite_temp_master " "WHERE type IN ('table','view') AND name LIKE shellstatic() " "ORDER BY 1", - &azResult, &nRow, 0, &zErrMsg); + &azResult, &nRow, 0, &zErrMsg)); _rpmsqlShellStatic = 0; } if (zErrMsg) { fprintf(stderr, "Error: %s\n", zErrMsg); sqlite3_free(zErrMsg); rc = 1; - } else if (rc != SQLITE_OK) { + } else if (rc) { fprintf(stderr, "Error: querying sqlite_master and sqlite_temp_master\n"); rc = 1; @@ -2209,6 +2322,7 @@ int startline = 0; SQLDBG((stderr, "--> %s(%p,%p)\n", __FUNCTION__, sql, in)); +rpmsqlDebugDump(sql); while (errCnt == 0 || !F_ISSET(sql, BAIL) || (in == 0 && F_ISSET(sql, INTERACTIVE))) { fflush(out); @@ -2448,13 +2562,13 @@ set_table_name(sql, NULL); /* XXX needed? */ - if (sql->out && fileno(sql->out) > 2) + if (sql->out && fileno(sql->out) > STDERR_FILENO) fclose(sql->out); sql->out = NULL; - if (sql->pLog && fileno(sql->pLog) > 2) + if (sql->pLog && fileno(sql->pLog) > STDERR_FILENO) fclose(sql->pLog); sql->pLog = NULL; - if (sql->iotrace && fileno(sql->iotrace) > 2) + if (sql->iotrace && fileno(sql->iotrace) > STDERR_FILENO) fclose(sql->iotrace); sql->iotrace = NULL; @@ -2470,14 +2584,9 @@ #if defined(WITH_SQLITE) if (sql->I) { sqlite3 * db = (sqlite3 *)sql->I; - switch (sqlite3_close(db)) { - default: - fprintf(stderr, "Error: cannot close database \"%s\"\n", - sqlite3_errmsg(db)); - break; - case SQLITE_OK: - break; - } + int rc; + rc = rpmsqlCmd(sql, "close", db, + sqlite3_close(db)); } #endif sql->I = NULL; @@ -2521,7 +2630,6 @@ poptContext con; int rc; -SQLDBG((stderr, "==> %s(%p, %p[%u], %p)\n", __FUNCTION__, sql, av, (unsigned)ac, tbl)); if (av == NULL || av[0] == NULL || av[1] == NULL) goto exit; @@ -2539,8 +2647,8 @@ } } /* XXX FIXME: arrange error return iff rc < -1. */ -if (rc != 0) -fprintf(stderr, "%s: poptGetNextOpt rc(%d): %s\n", __FUNCTION__, rc, poptStrerror(rc)); +if (rc) +SQLDBG((stderr, "%s: poptGetNextOpt rc(%d): %s\n", __FUNCTION__, rc, poptStrerror(rc))); *sql = _sql; /* structure assignment */ @@ -2556,7 +2664,9 @@ rpmsql rpmsqlNew(char ** av, uint32_t flags) { - rpmsql sql = rpmsqlGetPool(_rpmsqlPool); + rpmsql sql = + (flags & 0x80000000) ? rpmsqlI() : + rpmsqlGetPool(_rpmsqlPool); int ac = argvCount((ARGV_t)av); SQLDBG((stderr, "==> %s(%p[%u], 0x%x)\n", __FUNCTION__, av, (unsigned)ac, flags)); @@ -2589,7 +2699,8 @@ sql->zDbFilename = xstrdup(sql->av[0]); /* XXX strdup? */ /* If database alread exists, open immediately. */ if (Access(sql->zDbFilename, R_OK)) { - xx = sqlite3_open(sql->zDbFilename, &db); + xx = rpmsqlCmd(sql, "open", db, /* XXX watchout: arg order */ + sqlite3_open(sql->zDbFilename, &db)); sql->I = (void *) db; } } else @@ -2627,10 +2738,10 @@ /* Determine whether stdio or rpmiob should be used for output */ sql->out = (F_ISSET(sql, INTERACTIVE) ? stdout : NULL); } -#else +#else /* WITH_SQLITE */ if (av) (void) argvAppend(&sql->av, av); /* XXX useful? */ -#endif +#endif /* WITH_SQLITE */ if (!F_ISSET(sql, INTERACTIVE)) sql->iob = rpmiobNew(0); @@ -2642,12 +2753,20 @@ { rpmRC rc = RPMRC_FAIL; +SQLDBG((stderr, "==> %s(%p,%p[%u]) \"%s\"\n", __FUNCTION__, sql, str, (unsigned)(str ? strlen(str) : 0), str)); if (sql == NULL) sql = rpmsqlI(); -#ifdef NOTYET +#if defined(WITH_SQLITE) if (str != NULL) { + FILE * fp = NULL; +sql->iob = rpmiobFree(sql->iob); /* XXX HACK ALERT */ +sql->out = stdout; /* XXX HACK ALERT */ + fp = (*str == '\0' || *str == '-' ? stdin : fopen(str, "rb")); + rc = (fp && !ferror(fp) && !rpmsqlInput(sql, fp) + ? RPMRC_FAIL : RPMRC_OK); + if (fp && fileno(fp) > STDERR_FILENO) (void) fclose(fp); } -#endif +#endif /* WITH_SQLITE */ SQLDBG((stderr, "<== %s(%p,%p[%u]) rc %d\n", __FUNCTION__, sql, str, (unsigned)(str ? strlen(str) : 0), rc)); @@ . patch -p0 <<'@@ .' Index: rpm/tools/dbsql.c ============================================================================ $ cvs diff -u -r2.8 -r2.9 dbsql.c --- rpm/tools/dbsql.c 5 Apr 2010 21:27:57 -0000 2.8 +++ rpm/tools/dbsql.c 6 Apr 2010 20:12:25 -0000 2.9 @@ -116,7 +116,7 @@ int main(int argc, char **argv) { int _flags = (isatty(0) ? RPMSQL_FLAGS_INTERACTIVE : 0); - rpmsql sql = rpmsqlNew(argv, _flags); + rpmsql sql = rpmsqlNew(argv, _flags | 0x80000000); char *zErrMsg = NULL; char *zFirstCmd = NULL; const char ** av = NULL; @@ -184,13 +184,13 @@ if (sql->zHistory) read_history(sql->zHistory); #endif - ec = rpmsqlInput(sql, 0); + ec = rpmsqlInput(sql, NULL); if (sql->zHistory) { stifle_history(100); write_history(sql->zHistory); } } else { - ec = rpmsqlInput(sql, stdin); + ec = (int) rpmsqlRun(NULL, "", NULL); } } @@ -199,6 +199,7 @@ zFirstCmd = _free(zFirstCmd); sql = rpmsqlFree(sql); + rpmioClean(); /* XXX 0x8000000 global newref */ return ec; } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
