]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add additional error messages and a progress spinner to the ".clone" command.
authordrh <drh@noemail.net>
Thu, 6 Feb 2014 02:46:08 +0000 (02:46 +0000)
committerdrh <drh@noemail.net>
Thu, 6 Feb 2014 02:46:08 +0000 (02:46 +0000)
FossilOrigin-Name: dd0db3f0cef1be46cea16d4e61ea3348b3b3bd3e

manifest
manifest.uuid
src/shell.c

index 8cb9683c668368e260808b15d6a04aa3903dbb6d..3a59340ec660a4f174174175b6a2d5d06cec476c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Rename\sthe\s'.repair'\sshell\scommand\sto\s'.clone'.
-D 2014-02-06T01:15:29.192
+C Add\sadditional\serror\smessages\sand\sa\sprogress\sspinner\sto\sthe\s".clone"\scommand.
+D 2014-02-06T02:46:08.164
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -220,7 +220,7 @@ F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6
 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
 F src/select.c b78f5e62c283aca2e38657938bc1fec1051df728
-F src/shell.c da0a97d984a7f59441d052925f3b83189c532bf7
+F src/shell.c 7dedf7367ee49050b0366bf8dbc8ec2bd15b42c7
 F src/sqlite.h.in eed7f7d66a60daaa7b4a597dcd9bad87aad9611b
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
@@ -1152,7 +1152,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P d1dfadea87ecf18eeb6d2f21769deaa97473ca0e
-R f560d9f23cc9db65e30e7982b2e54ef7
-U mistachkin
-Z 4d9ab8dffd5cac0331ab06f34b9616ca
+P 4f9d95624ae4e123f83c835b5940f64d4a47be0d
+R f4dd749481e46684567e713bb83ed4e5
+U drh
+Z 395514f5fdbe146277bb7612673c11cf
index 5b765640c3ad53ef5d35810749560f0ce2cc5ccf..eb1eab6d72e937f35dea70da0c6eef38bf67e4a2 100644 (file)
@@ -1 +1 @@
-4f9d95624ae4e123f83c835b5940f64d4a47be0d
\ No newline at end of file
+dd0db3f0cef1be46cea16d4e61ea3348b3b3bd3e
\ No newline at end of file
index 3a583f09fc150888ea48dd525252807695f96fbf..8fa32105d97e960d876ee73bed16c5fdd672a9d3 100644 (file)
@@ -1543,6 +1543,7 @@ static int run_schema_dump_query(
 static char zHelp[] =
   ".backup ?DB? FILE      Backup DB (default \"main\") to FILE\n"
   ".bail ON|OFF           Stop after hitting an error.  Default OFF\n"
+  ".clone NEWDB           Clone data into NEWDB from the existing database\n"
   ".databases             List names and files of attached databases\n"
   ".dump ?TABLE? ...      Dump the database in an SQL text format\n"
   "                         If TABLE specified, only dump tables matching\n"
@@ -1581,7 +1582,6 @@ static char zHelp[] =
   ".prompt MAIN CONTINUE  Replace the standard prompts\n"
   ".quit                  Exit this program\n"
   ".read FILENAME         Execute SQL in FILENAME\n"
-  ".clone NEWDB           Clone data into NEWDB from the existing database\n"
   ".restore ?DB? FILE     Restore content of DB (default \"main\") from FILE\n"
   ".schema ?TABLE?        Show the CREATE statements\n"
   "                         If TABLE specified, only show tables matching\n"
@@ -1898,7 +1898,9 @@ static char *csv_read_one_field(CSVReader *p){
 }
 
 /*
-** Try to transfer data for table zTable
+** Try to transfer data for table zTable.  If an error is seen while
+** moving forward, try to go backwards.  The backwards movement won't
+** work for WITHOUT ROWID tables.
 */
 static void tryToCloneData(
   struct callback_data *p,
@@ -1913,11 +1915,13 @@ static void tryToCloneData(
   int i, j, n;
   int nTable = (int)strlen(zTable);
   int k = 0;
+  int cnt = 0;
+  const int spinRate = 10000;
 
   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
   if( rc ){
-    fprintf(stderr, "Error: (%d) %s on [%s]\n",
+    fprintf(stderr, "Error %d: %s on [%s]\n",
             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
             zQuery);
     goto end_data_xfer;
@@ -1938,7 +1942,7 @@ static void tryToCloneData(
   memcpy(zInsert+i, ");", 3);
   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
   if( rc ){
-    fprintf(stderr, "Error: (%d) %s on [%s]\n",
+    fprintf(stderr, "Error %d: %s on [%s]\n",
             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
             zQuery);
     goto end_data_xfer;
@@ -1973,8 +1977,17 @@ static void tryToCloneData(
           }
         }
       } /* End for */
-      sqlite3_step(pInsert);
+      rc = sqlite3_step(pInsert);
+      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
+        fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
+                        sqlite3_errmsg(newDb));
+      }
       sqlite3_reset(pInsert);
+      cnt++;
+      if( (cnt%spinRate)==0 ){
+        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
+        fflush(stdout);
+      }
     } /* End while */
     if( rc==SQLITE_DONE ) break;
     sqlite3_finalize(pQuery);
@@ -1983,10 +1996,8 @@ static void tryToCloneData(
                              zTable);
     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
     if( rc ){
-       fprintf(stderr, "Error: (%d) %s on [%s]\n",
-          sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
-          zQuery);
-       goto end_data_xfer;
+      fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
+      break;
     }
   } /* End for(k=0...) */
 
@@ -2001,6 +2012,8 @@ end_data_xfer:
 /*
 ** Try to transfer all rows of the schema that match zWhere.  For
 ** each row, invoke xForEach() on the object defined by that row.
+** If an error is encountered while moving forward through the
+** sqlite_master table, try again moving backwards.
 */
 static void tryToCloneSchema(
   struct callback_data *p,
@@ -2013,6 +2026,7 @@ static void tryToCloneSchema(
   int rc;
   const unsigned char *zName;
   const unsigned char *zSql;
+  char *zErrMsg = 0;
 
   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
                            " WHERE %s", zWhere);
@@ -2027,7 +2041,12 @@ static void tryToCloneSchema(
     zName = sqlite3_column_text(pQuery, 0);
     zSql = sqlite3_column_text(pQuery, 1);
     printf("%s... ", zName); fflush(stdout);
-    sqlite3_exec(newDb, (const char*)zSql, 0, 0, 0);
+    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
+    if( zErrMsg ){
+      fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
+      sqlite3_free(zErrMsg);
+      zErrMsg = 0;
+    }
     if( xForEach ){
       xForEach(p, newDb, (const char*)zName);
     }
@@ -2049,7 +2068,12 @@ static void tryToCloneSchema(
       zName = sqlite3_column_text(pQuery, 0);
       zSql = sqlite3_column_text(pQuery, 1);
       printf("%s... ", zName); fflush(stdout);
-      sqlite3_exec(newDb, (const char*)zSql, 0, 0, 0);
+      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
+      if( zErrMsg ){
+        fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
+        sqlite3_free(zErrMsg);
+        zErrMsg = 0;
+      }
       if( xForEach ){
         xForEach(p, newDb, (const char*)zName);
       }