Overview
| SHA1 Hash: | f1127e87b90c7ba049404ec68cb4e99009c22185 |
|---|---|
| Date: | 2013-01-23 18:53:23 |
| User: | drh |
| Comment: | Improved parsing of the arguments to the ".backup" command in the command-line shell. |
Tags And Properties
- branch=trunk inherited from [704b122e53]
- sym-trunk inherited from [704b122e53]
Changes
Changes to src/shell.c
1625 } 1625 } 1626 1626 1627 /* Process the input line. 1627 /* Process the input line. 1628 */ 1628 */ 1629 if( nArg==0 ) return 0; /* no tokens, no error */ 1629 if( nArg==0 ) return 0; /* no tokens, no error */ 1630 n = strlen30(azArg[0]); 1630 n = strlen30(azArg[0]); 1631 c = azArg[0][0]; 1631 c = azArg[0][0]; 1632 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){ | 1632 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){ 1633 const char *zDestFile; | 1633 const char *zDestFile = 0; 1634 const char *zDb; | 1634 const char *zDb = 0; > 1635 const char *zKey = 0; 1635 sqlite3 *pDest; 1636 sqlite3 *pDest; 1636 sqlite3_backup *pBackup; 1637 sqlite3_backup *pBackup; 1637 if( nArg==2 ){ < > 1638 int j; > 1639 for(j=1; j<nArg; j++){ > 1640 const char *z = azArg[j]; > 1641 if( z[0]=='-' ){ > 1642 while( z[0]=='-' ) z++; > 1643 if( strcmp(z,"key")==0 && j<nArg-1 ){ 1638 zDestFile = azArg[1]; | 1644 zKey = azArg[++j]; 1639 zDb = "main"; < 1640 }else{ | 1645 }else > 1646 { > 1647 fprintf(stderr, "unknown option: %s\n", azArg[j]); > 1648 return 1; > 1649 } > 1650 }else if( zDestFile==0 ){ 1641 zDestFile = azArg[2]; | 1651 zDestFile = azArg[j]; > 1652 }else if( zDb==0 ){ > 1653 zDb = zDestFile; 1642 zDb = azArg[1]; | 1654 zDestFile = azArg[j]; > 1655 }else{ > 1656 fprintf(stderr, "too many arguments to .backup\n"); > 1657 return 1; 1643 } | 1658 } > 1659 } > 1660 if( zDestFile==0 ){ > 1661 fprintf(stderr, "missing FILENAME argument on .backup\n"); > 1662 return 1; > 1663 } > 1664 if( zDb==0 ) zDb = "main"; 1644 rc = sqlite3_open(zDestFile, &pDest); 1665 rc = sqlite3_open(zDestFile, &pDest); 1645 if( rc!=SQLITE_OK ){ 1666 if( rc!=SQLITE_OK ){ 1646 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 1667 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 1647 sqlite3_close(pDest); 1668 sqlite3_close(pDest); 1648 return 1; 1669 return 1; 1649 } 1670 } > 1671 #ifdef SQLITE_HAS_CODEC > 1672 sqlite3_key(pDest, zKey, (int)strlen(zKey)); > 1673 #else > 1674 (void)zKey; > 1675 #endif 1650 open_db(p); 1676 open_db(p); 1651 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 1677 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 1652 if( pBackup==0 ){ 1678 if( pBackup==0 ){ 1653 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 1679 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 1654 sqlite3_close(pDest); 1680 sqlite3_close(pDest); 1655 return 1; 1681 return 1; 1656 } 1682 }
Changes to test/shell1.test
249 #---------------------------------------------------------------------------- 249 #---------------------------------------------------------------------------- 250 # Test cases shell1-3.*: Basic test that "dot" command can be called. 250 # Test cases shell1-3.*: Basic test that "dot" command can be called. 251 # 251 # 252 252 253 # .backup ?DB? FILE Backup DB (default "main") to FILE 253 # .backup ?DB? FILE Backup DB (default "main") to FILE 254 do_test shell1-3.1.1 { 254 do_test shell1-3.1.1 { 255 catchcmd "test.db" ".backup" 255 catchcmd "test.db" ".backup" 256 } {1 {Error: unknown command or invalid arguments: "backup". Enter ".help" for | 256 } {1 {missing FILENAME argument on .backup}} 257 do_test shell1-3.1.2 { 257 do_test shell1-3.1.2 { 258 catchcmd "test.db" ".backup FOO" 258 catchcmd "test.db" ".backup FOO" 259 } {0 {}} 259 } {0 {}} 260 do_test shell1-3.1.3 { 260 do_test shell1-3.1.3 { 261 catchcmd "test.db" ".backup FOO BAR" 261 catchcmd "test.db" ".backup FOO BAR" 262 } {1 {Error: unknown database FOO}} 262 } {1 {Error: unknown database FOO}} 263 do_test shell1-3.1.4 { 263 do_test shell1-3.1.4 { 264 # too many arguments 264 # too many arguments 265 catchcmd "test.db" ".backup FOO BAR BAD" 265 catchcmd "test.db" ".backup FOO BAR BAD" 266 } {1 {Error: unknown command or invalid arguments: "backup". Enter ".help" for | 266 } {1 {too many arguments to .backup}} 267 267 268 # .bail ON|OFF Stop after hitting an error. Default OFF 268 # .bail ON|OFF Stop after hitting an error. Default OFF 269 do_test shell1-3.2.1 { 269 do_test shell1-3.2.1 { 270 catchcmd "test.db" ".bail" 270 catchcmd "test.db" ".bail" 271 } {1 {Error: unknown command or invalid arguments: "bail". Enter ".help" for he 271 } {1 {Error: unknown command or invalid arguments: "bail". Enter ".help" for he 272 do_test shell1-3.2.2 { 272 do_test shell1-3.2.2 { 273 catchcmd "test.db" ".bail ON" 273 catchcmd "test.db" ".bail ON"