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:   09-Apr-2010 15:05:41
  Branch: HEAD                             Handle: 2010040913053901

  Modified files:
    rpm                     CHANGES
    rpm/rpmio               rpmsql.c

  Log:
    - rpmsql: set the prompt(s) from basename(argv[0]).
    - rpmsql: eliminate the shellstatic function, concatenatente instead.

  Summary:
    Revision    Changes     Path
    1.3314      +2  -0      rpm/CHANGES
    2.13        +93 -98     rpm/rpmio/rpmsql.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3313 -r1.3314 CHANGES
  --- rpm/CHANGES       8 Apr 2010 22:01:49 -0000       1.3313
  +++ rpm/CHANGES       9 Apr 2010 13:05:39 -0000       1.3314
  @@ -1,5 +1,7 @@
   
   5.2b1 -> 5.3a1
  +    - jbj: rpmsql: set the prompt(s) from basename(argv[0]).
  +    - jbj: rpmsql: eliminate the shellstatic function, concatenatente 
instead.
       - jbj: tests: stub-in a "make check-sql" target.
       - jbj: rpmsql: stub-in an "expand" function tied to macro expansion.
       - jbj: rpmsql: resurrect building --without-sqlite.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmsql.c
  ============================================================================
  $ cvs diff -u -r2.12 -r2.13 rpmsql.c
  --- rpm/rpmio/rpmsql.c        8 Apr 2010 12:11:52 -0000       2.12
  +++ rpm/rpmio/rpmsql.c        9 Apr 2010 13:05:40 -0000       2.13
  @@ -245,26 +245,6 @@
   }
   #endif
   
  -/*
  -** A global char* and an SQL function to access its current value 
  -** from within an SQL statement. This program used to use the 
  -** sqlite_exec_printf() API to substitue a string into an SQL statement.
  -** The correct way to do this with sqlite3 is to use the bind API, but
  -** since the shell is built around the callback paradigm it would be a lot
  -** of work. Instead just use this hack, which is quite harmless.
  -*/
  -/*...@unchecked@*/
  -static const char * _rpmsqlShellStatic;
  -static void shellstaticFunc(sqlite3_context * context,
  -             int argc, sqlite3_value ** argv)
  -{
  -    assert(0 == argc);
  -    assert(_rpmsqlShellStatic);
  -    argc = argc;
  -    argv = argv;
  -    sqlite3_result_text(context, _rpmsqlShellStatic, -1, SQLITE_STATIC);
  -}
  -
   static void expandFunc(sqlite3_context * context,
                int argc, sqlite3_value ** argv)
   {
  @@ -287,7 +267,6 @@
   };
   
   static struct rpmsqlCF_s __CF[] = {
  -  { "shellstatic",   0, 0, SQLITE_UTF8,      0, shellstaticFunc      },
     { "expand",                1, 0, SQLITE_UTF8,      0, expandFunc           
},
     { NULL,            0, 0, 0,                0, NULL                 }
   };
  @@ -1218,7 +1197,7 @@
        rc = run_table_dump_query(sql, db, zSelect, zPrepStmt);
        if (rc == SQLITE_CORRUPT) {
            zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
  -         rc = run_table_dump_query(sql, db, zSelect, 0);
  +         rc = run_table_dump_query(sql, db, zSelect, NULL);
        }
        if (zSelect)
            free(zSelect);
  @@ -1451,7 +1430,7 @@
        }
        _rpmsqlOpenDB(sql);
        pBackup = sqlite3_backup_init(pDest, "main", db, zDb);
  -     if (pBackup == 0) {
  +     if (pBackup == NULL) {
            fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
            (void) rpmsqlCmd(sql, "close", pDest,
                        sqlite3_close(pDest));
  @@ -1459,7 +1438,8 @@
        }
        while ((rc = sqlite3_backup_step(pBackup, 100)) == SQLITE_OK) {
        }
  -     sqlite3_backup_finish(pBackup);
  +     (void) rpmsqlCmd(sql, "backup_finish", pBackup,
  +                     sqlite3_backup_finish(pBackup));
        if (rc == SQLITE_DONE) {
            rc = 0;
        } else {
  @@ -1479,6 +1459,8 @@
        if (c == 'd' && n > 1 && strncmp(azArg[0], "databases", n) == 0
             && nArg == 1) {
        /* XXX recursion b0rkage lies here. */
  +     uint32_t _flags = sql->flags;
  +     uint32_t _mode = sql->mode;
        char *zErrMsg = 0;
        _rpmsqlOpenDB(sql);
        sql->flags |= RPMSQL_FLAGS_SHOWHDR;
  @@ -1493,9 +1475,11 @@
            sqlite3_free(zErrMsg);
            rc = 1;
        }
  +     sql->mode = _mode;
  +     sql->flags = _flags;
       } else
        if (c == 'd' && strncmp(azArg[0], "dump", n) == 0 && nArg < 3) {
  -     char *zErrMsg = 0;
  +     char * t;
        _rpmsqlOpenDB(sql);
        /* When playing back a "dump", the content might appear in an order
         ** which causes immediate foreign key constraints to be violated.
  @@ -1505,48 +1489,44 @@
        sql->flags &= ~RPMSQL_FLAGS_WRITABLE;
        sqlite3_exec(db, "PRAGMA writable_schema=ON", 0, 0, 0);
        if (nArg == 1) {
  -         run_schema_dump_query(sql,
  -                               "SELECT name, type, sql FROM sqlite_master "
  -                               "WHERE sql NOT NULL AND type=='table' AND 
name!='sqlite_sequence'",
  -                               0);
  -         run_schema_dump_query(sql,
  -                               "SELECT name, type, sql FROM sqlite_master "
  -                               "WHERE name=='sqlite_sequence'", 0);
  -         run_table_dump_query(sql, db,
  -                              "SELECT sql FROM sqlite_master "
  -                              "WHERE sql NOT NULL AND type IN 
('index','trigger','view')",
  -                              0);
  +         t = rpmExpand("SELECT name, type, sql FROM sqlite_master"
  +                       " WHERE sql NOT NULL AND type=='table'"
  +                       " AND name!='sqlite_sequence'", NULL);
  +         run_schema_dump_query(sql, t, NULL);
  +         t = _free(t);
  +         t = rpmExpand("SELECT name, type, sql FROM sqlite_master"
  +                       " WHERE name=='sqlite_sequence'", NULL);
  +         run_schema_dump_query(sql, t, NULL);
  +         t = _free(t);
  +         t = rpmExpand("SELECT sql FROM sqlite_master"
  +                       " WHERE sql NOT NULL AND type IN 
('index','trigger','view')", NULL);
  +         run_table_dump_query(sql, db, t, NULL);
  +         t = _free(t);
        } else {
            int i;
            for (i = 1; i < nArg; i++) {
  -             _rpmsqlShellStatic = azArg[i];
  -             run_schema_dump_query(sql,
  -                                   "SELECT name, type, sql FROM 
sqlite_master "
  -                                   "WHERE tbl_name LIKE shellstatic() AND 
type=='table'"
  -                                   "  AND sql NOT NULL", 0);
  -             run_table_dump_query(sql, db,
  -                                  "SELECT sql FROM sqlite_master "
  -                                  "WHERE sql NOT NULL"
  -                                  "  AND type IN ('index','trigger','view')"
  -                                  "  AND tbl_name LIKE shellstatic()",
  -                                  0);
  -             _rpmsqlShellStatic = NULL;
  +             t = rpmExpand(  "SELECT name, type, sql FROM sqlite_master"
  +                             " WHERE tbl_name LIKE '", azArg[i], "'"
  +                             " AND type=='table' AND sql NOT NULL", NULL);
  +             run_schema_dump_query(sql, t, NULL);
  +             t = _free(t);
  +             t = rpmExpand(  "SELECT sql FROM sqlite_master"
  +                             " WHERE sql NOT NULL"
  +                             " AND type IN ('index','trigger','view')"
  +                             " AND tbl_name LIKE '", azArg[i], "'", NULL);
  +             run_table_dump_query(sql, db, t, NULL);
  +             t = _free(t);
            }
        }
        if (F_ISSET(sql, WRITABLE)) {
            rpmsqlFprintf(sql, "PRAGMA writable_schema=OFF;\n");
            sql->flags &= ~RPMSQL_FLAGS_WRITABLE;
        }
  -     sqlite3_exec(db, "PRAGMA writable_schema=OFF", 0, 0, 0);
  -     if (zErrMsg) {
  -         fprintf(stderr, "Error: %s\n", zErrMsg);
  -         sqlite3_free(zErrMsg);
  -     } else {
  -         rpmsqlFprintf(sql, "COMMIT;\n");
  -     }
  +     (void) rpmsqlCmd(sql, "exec", db,
  +             sqlite3_exec(db, "PRAGMA writable_schema=OFF", 0, 0, 0));
  +     rpmsqlFprintf(sql, "COMMIT;\n");
       } else
  -     if (c == 'e' && strncmp(azArg[0], "echo", n) == 0 && nArg > 1
  -          && nArg < 3) {
  +     if (c == 'e' && strncmp(azArg[0], "echo", n) == 0 && nArg > 1 && nArg < 
3) {
        if (booleanValue(azArg[1]))
            sql->flags |= RPMSQL_FLAGS_ECHO;
        else
  @@ -1743,30 +1723,33 @@
       } else
        if (c == 'i' && strncmp(azArg[0], "indices", n) == 0 && nArg < 3) {
        /* XXX recursion b0rkage lies here. */
  -     char *zErrMsg = 0;
  +     uint32_t _flags = sql->flags;
  +     uint32_t _mode = sql->mode;
  +     char * t;
  +     char *zErrMsg = NULL;
        _rpmsqlOpenDB(sql);
        sql->flags &= ~RPMSQL_FLAGS_SHOWHDR;
        sql->mode = RPMSQL_MODE_LIST;
        if (nArg == 1) {
  +         t = rpmExpand("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", NULL);
            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));
  +                     sqlite3_exec(db, t, callback, sql, &zErrMsg));
  +         t = _free(t);
        } else {
  -         _rpmsqlShellStatic = azArg[1];
  +         t = rpmExpand("SELECT name FROM sqlite_master"
  +                       " WHERE type='index' AND tbl_name LIKE '", azArg[1], 
"'",
  +                       " UNION ALL "
  +                       "SELECT name FROM sqlite_temp_master"
  +                       " WHERE type='index' AND tbl_name LIKE '", azArg[1], 
"'",
  +                       " ORDER BY 1", NULL);
            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));
  -         _rpmsqlShellStatic = NULL;
  +                     sqlite3_exec(db, t, callback, sql, &zErrMsg));
  +         t = _free(t);
        }
        if (zErrMsg) {
            fprintf(stderr, "Error: %s\n", zErrMsg);
  @@ -1779,6 +1762,8 @@
   #endif
            rc = 1;
        }
  +     sql->mode = _mode;
  +     sql->flags = _flags;
       } else
   #ifdef SQLITE_ENABLE_IOTRACE
       if (c == 'i' && strncmp(azArg[0], "iotrace", n) == 0) {
  @@ -1992,6 +1977,8 @@
       } else
        if (c == 's' && strncmp(azArg[0], "schema", n) == 0 && nArg < 3) {
        /* XXX recursion b0rkage lies here. */
  +     uint32_t _flags = sql->flags;
  +     uint32_t _mode = sql->mode;
        char *zErrMsg = 0;
        _rpmsqlOpenDB(sql);
        sql->flags &= ~RPMSQL_FLAGS_SHOWHDR;
  @@ -2025,17 +2012,20 @@
                callback(sql, 1, new_argv, new_colv);
                rc = SQLITE_OK;
            } else {
  -             _rpmsqlShellStatic = azArg[1];
  -             rc = sqlite3_exec(db,
  -                               "SELECT sql FROM "
  -                               "  (SELECT sql sql, type type, tbl_name 
tbl_name, name name"
  -                               "     FROM sqlite_master UNION ALL"
  -                               "   SELECT sql, type, tbl_name, name FROM 
sqlite_temp_master) "
  -                               "WHERE tbl_name LIKE shellstatic() AND 
type!='meta' AND sql NOTNULL "
  -                               "ORDER BY substr(type,2,1), name",
  -                               callback, sql, &zErrMsg);
  -             _rpmsqlShellStatic = 0;
  +             char * t;
  +             t = rpmExpand(  "SELECT sql FROM "
  +                             "  (SELECT sql sql, type type, tbl_name 
tbl_name, name name"
  +                             "     FROM sqlite_master UNION ALL"
  +                             "   SELECT sql, type, tbl_name, name FROM 
sqlite_temp_master)"
  +                             " WHERE tbl_name LIKE '", azArg[1], "'"
  +                             " AND type!='meta' AND sql NOTNULL "
  +                             "ORDER BY substr(type,2,1), name", NULL);
  +             rc = rpmsqlCmd(sql, "exec", db,
  +                     sqlite3_exec(db, t, callback, sql, &zErrMsg));
  +             t = _free(t);
            }
  +         sql->mode = _mode;
  +         sql->flags = _flags;
        } else {
            rc = sqlite3_exec(db,
                              "SELECT sql FROM "
  @@ -2102,17 +2092,16 @@
                                   "ORDER BY 1",
                                   &azResult, &nRow, 0, &zErrMsg));
        } else {
  -         _rpmsqlShellStatic = azArg[1];
  +         char * t;
  +         t = rpmExpand("SELECT name FROM sqlite_master "
  +                       " WHERE type IN ('table','view') AND name LIKE '", 
azArg[1], "'"
  +                       " UNION ALL "
  +                       "SELECT name FROM sqlite_temp_master"
  +                       " WHERE type IN ('table','view') AND name LIKE '", 
azArg[1], "'"
  +                                "ORDER BY 1", NULL);
            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));
  -         _rpmsqlShellStatic = 0;
  +                     sqlite3_get_table(db, t, &azResult, &nRow, 0,&zErrMsg));
  +         t = _free(t);
        }
        if (zErrMsg) {
            fprintf(stderr, "Error: %s\n", zErrMsg);
  @@ -2689,8 +2678,6 @@
       { /* XXX INTERACTIVE cruft. */
        static const char _zInitrc[]    = "/.sqliterc";
        static const char _zHistory[]   = "/.sqlite_history";
  -     static const char _zPrompt[]    = "dbsql> ";
  -     static const char _zContinue[]  = "  ...> ";
        /* XXX getpwuid? */
        sql->zHome = xstrdup(getenv("HOME"));
        sql->zInitrc = rpmGetPath(sql->zHome, _zInitrc, NULL);
  @@ -2699,8 +2686,16 @@
         ** Prompt strings. Initialized in main. Settable with
         **   .prompt main continue
         */
  -     sql->zPrompt = xstrdup(_zPrompt);
  -     sql->zContinue = xstrdup(_zContinue);
  +     /* Initialize the prompt from basename(argv[0]). */
  +     if (sql->zPrompt == NULL) {
  +         char * t = xstrdup((av && av[0] ? av[0] : "sql"));
  +         char * bn = basename(t);
  +         sql->zPrompt = rpmExpand(bn, "> ", NULL);
  +         t = _free(t);
  +         sql->zContinue = t = xstrdup(sql->zPrompt);
  +         while (*t && *t != '>')
  +             *t++ = '-';
  +     }
   
        /* Determine whether stdio or rpmiob should be used for output */
        sql->out = (F_ISSET(sql, INTERACTIVE) ? stdout : NULL);
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to