From: drh Date: Thu, 6 Feb 2014 02:46:08 +0000 (+0000) Subject: Add additional error messages and a progress spinner to the ".clone" command. X-Git-Tag: version-3.8.4~104 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4bbcf10617908811dde800c114b693834b2574dd;p=thirdparty%2Fsqlite.git Add additional error messages and a progress spinner to the ".clone" command. FossilOrigin-Name: dd0db3f0cef1be46cea16d4e61ea3348b3b3bd3e --- diff --git a/manifest b/manifest index 8cb9683c66..3a59340ec6 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 5b765640c3..eb1eab6d72 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f9d95624ae4e123f83c835b5940f64d4a47be0d \ No newline at end of file +dd0db3f0cef1be46cea16d4e61ea3348b3b3bd3e \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 3a583f09fc..8fa32105d9 100644 --- a/src/shell.c +++ b/src/shell.c @@ -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); }