| | @@ -653,23 +653,17 @@ |
| 653 | 653 | blob_reset(&sql); |
| 654 | 654 | return rc; |
| 655 | 655 | } |
| 656 | 656 | |
| 657 | 657 | /* |
| 658 | | -** Execute multiple SQL statements. |
| 658 | +** Execute multiple SQL statements. The input text is executed |
| 659 | +** directly without any formatting. |
| 659 | 660 | */ |
| 660 | | -int db_multi_exec(const char *zSql, ...){ |
| 661 | | - Blob sql; |
| 661 | +int db_exec_sql(const char *z){ |
| 662 | 662 | int rc = SQLITE_OK; |
| 663 | | - va_list ap; |
| 664 | | - const char *z, *zEnd; |
| 665 | 663 | sqlite3_stmt *pStmt; |
| 666 | | - blob_init(&sql, 0, 0); |
| 667 | | - va_start(ap, zSql); |
| 668 | | - blob_vappendf(&sql, zSql, ap); |
| 669 | | - va_end(ap); |
| 670 | | - z = blob_str(&sql); |
| 664 | + const char *zEnd; |
| 671 | 665 | while( rc==SQLITE_OK && z[0] ){ |
| 672 | 666 | pStmt = 0; |
| 673 | 667 | rc = sqlite3_prepare_v2(g.db, z, -1, &pStmt, &zEnd); |
| 674 | 668 | if( rc ){ |
| 675 | 669 | db_err("%s: {%s}", sqlite3_errmsg(g.db), z); |
| | @@ -679,10 +673,26 @@ |
| 679 | 673 | rc = sqlite3_finalize(pStmt); |
| 680 | 674 | if( rc ) db_err("%s: {%.*s}", sqlite3_errmsg(g.db), (int)(zEnd-z), z); |
| 681 | 675 | } |
| 682 | 676 | z = zEnd; |
| 683 | 677 | } |
| 678 | + return rc; |
| 679 | +} |
| 680 | + |
| 681 | +/* |
| 682 | +** Execute multiple SQL statements using printf-style formatting. |
| 683 | +*/ |
| 684 | +int db_multi_exec(const char *zSql, ...){ |
| 685 | + Blob sql; |
| 686 | + int rc; |
| 687 | + va_list ap; |
| 688 | + |
| 689 | + blob_init(&sql, 0, 0); |
| 690 | + va_start(ap, zSql); |
| 691 | + blob_vappendf(&sql, zSql, ap); |
| 692 | + va_end(ap); |
| 693 | + rc = db_exec_sql(blob_str(&sql)); |
| 684 | 694 | blob_reset(&sql); |
| 685 | 695 | return rc; |
| 686 | 696 | } |
| 687 | 697 | |
| 688 | 698 | /* |
| | @@ -1286,17 +1296,17 @@ |
| 1286 | 1296 | blob_init(&key, 0, 0); |
| 1287 | 1297 | db_maybe_obtain_encryption_key(zDbName, &key); |
| 1288 | 1298 | if( fossil_getenv("FOSSIL_USE_SEE_TEXTKEY")==0 ){ |
| 1289 | 1299 | char *zCmd = sqlite3_mprintf("ATTACH DATABASE %Q AS %Q KEY %Q", |
| 1290 | 1300 | zDbName, zLabel, blob_str(&key)); |
| 1291 | | - db_multi_exec("%s", zCmd /*safe-for-%s*/); |
| 1301 | + db_exec_sql(zCmd); |
| 1292 | 1302 | fossil_secure_zero(zCmd, strlen(zCmd)); |
| 1293 | 1303 | sqlite3_free(zCmd); |
| 1294 | 1304 | }else{ |
| 1295 | 1305 | char *zCmd = sqlite3_mprintf("ATTACH DATABASE %Q AS %Q KEY ''", |
| 1296 | 1306 | zDbName, zLabel); |
| 1297 | | - db_multi_exec("%s", zCmd /*safe-for-%s*/); |
| 1307 | + db_exec_sql(zCmd); |
| 1298 | 1308 | sqlite3_free(zCmd); |
| 1299 | 1309 | #if USE_SEE |
| 1300 | 1310 | if( blob_size(&key)>0 ){ |
| 1301 | 1311 | sqlite3_key_v2(g.db, zLabel, blob_str(&key), -1); |
| 1302 | 1312 | } |
| | @@ -1762,13 +1772,13 @@ |
| 1762 | 1772 | "UPDATE vfile" |
| 1763 | 1773 | " SET mhash=(SELECT uuid FROM blob WHERE blob.rid=vfile.mrid)" |
| 1764 | 1774 | " WHERE mrid!=rid;" |
| 1765 | 1775 | ); |
| 1766 | 1776 | if( !db_table_has_column("localdb", "vmerge", "mhash") ){ |
| 1767 | | - db_multi_exec("ALTER TABLE vmerge RENAME TO old_vmerge;"); |
| 1768 | | - db_multi_exec(zLocalSchemaVmerge /*works-like:""*/); |
| 1769 | | - db_multi_exec( |
| 1777 | + db_exec_sql("ALTER TABLE vmerge RENAME TO old_vmerge;"); |
| 1778 | + db_exec_sql(zLocalSchemaVmerge); |
| 1779 | + db_exec_sql( |
| 1770 | 1780 | "INSERT OR IGNORE INTO vmerge(id,merge,mhash)" |
| 1771 | 1781 | " SELECT id, merge, blob.uuid FROM old_vmerge, blob" |
| 1772 | 1782 | " WHERE old_vmerge.merge=blob.rid;" |
| 1773 | 1783 | "DROP TABLE old_vmerge;" |
| 1774 | 1784 | ); |
| 1775 | 1785 | |