Fossil SCM
Add the -nocomplain option to the TH1 "query" command. Add the ability to query the unversioned table, if such a table exists.
Commit
c8289bdce4b10243397a847979ce37f1cc0e4fdf
Parent
70d898fe3cc24eb…
2 files changed
+2
-1
+11
-1
+2
-1
| --- src/report.c | ||
| +++ src/report.c | ||
| @@ -173,11 +173,11 @@ | ||
| 173 | 173 | const char *zArg4 |
| 174 | 174 | ){ |
| 175 | 175 | int rc = SQLITE_OK; |
| 176 | 176 | if( *(char**)pError ){ |
| 177 | 177 | /* We've already seen an error. No need to continue. */ |
| 178 | - return SQLITE_OK; | |
| 178 | + return SQLITE_DENY; | |
| 179 | 179 | } |
| 180 | 180 | switch( code ){ |
| 181 | 181 | case SQLITE_SELECT: |
| 182 | 182 | case SQLITE_RECURSIVE: |
| 183 | 183 | case SQLITE_FUNCTION: { |
| @@ -192,10 +192,11 @@ | ||
| 192 | 192 | "mlink", |
| 193 | 193 | "plink", |
| 194 | 194 | "event", |
| 195 | 195 | "tag", |
| 196 | 196 | "tagxref", |
| 197 | + "unversioned", | |
| 197 | 198 | }; |
| 198 | 199 | int i; |
| 199 | 200 | if( fossil_strncmp(zArg1, "fx_", 3)==0 ){ |
| 200 | 201 | break; |
| 201 | 202 | } |
| 202 | 203 |
| --- src/report.c | |
| +++ src/report.c | |
| @@ -173,11 +173,11 @@ | |
| 173 | const char *zArg4 |
| 174 | ){ |
| 175 | int rc = SQLITE_OK; |
| 176 | if( *(char**)pError ){ |
| 177 | /* We've already seen an error. No need to continue. */ |
| 178 | return SQLITE_OK; |
| 179 | } |
| 180 | switch( code ){ |
| 181 | case SQLITE_SELECT: |
| 182 | case SQLITE_RECURSIVE: |
| 183 | case SQLITE_FUNCTION: { |
| @@ -192,10 +192,11 @@ | |
| 192 | "mlink", |
| 193 | "plink", |
| 194 | "event", |
| 195 | "tag", |
| 196 | "tagxref", |
| 197 | }; |
| 198 | int i; |
| 199 | if( fossil_strncmp(zArg1, "fx_", 3)==0 ){ |
| 200 | break; |
| 201 | } |
| 202 |
| --- src/report.c | |
| +++ src/report.c | |
| @@ -173,11 +173,11 @@ | |
| 173 | const char *zArg4 |
| 174 | ){ |
| 175 | int rc = SQLITE_OK; |
| 176 | if( *(char**)pError ){ |
| 177 | /* We've already seen an error. No need to continue. */ |
| 178 | return SQLITE_DENY; |
| 179 | } |
| 180 | switch( code ){ |
| 181 | case SQLITE_SELECT: |
| 182 | case SQLITE_RECURSIVE: |
| 183 | case SQLITE_FUNCTION: { |
| @@ -192,10 +192,11 @@ | |
| 192 | "mlink", |
| 193 | "plink", |
| 194 | "event", |
| 195 | "tag", |
| 196 | "tagxref", |
| 197 | "unversioned", |
| 198 | }; |
| 199 | int i; |
| 200 | if( fossil_strncmp(zArg1, "fx_", 3)==0 ){ |
| 201 | break; |
| 202 | } |
| 203 |
+11
-1
| --- src/th_main.c | ||
| +++ src/th_main.c | ||
| @@ -1428,11 +1428,11 @@ | ||
| 1428 | 1428 | Th_SetResult(interp, (const char *)zOut, -1); |
| 1429 | 1429 | return TH_OK; |
| 1430 | 1430 | } |
| 1431 | 1431 | |
| 1432 | 1432 | /* |
| 1433 | -** TH1 command: query SQL CODE | |
| 1433 | +** TH1 command: query [-nocomplain] SQL CODE | |
| 1434 | 1434 | ** |
| 1435 | 1435 | ** Run the SQL query given by the SQL argument. For each row in the result |
| 1436 | 1436 | ** set, run CODE. |
| 1437 | 1437 | ** |
| 1438 | 1438 | ** In SQL, parameters such as $var are filled in using the value of variable |
| @@ -1453,15 +1453,23 @@ | ||
| 1453 | 1453 | const char *zTail; |
| 1454 | 1454 | int n, i; |
| 1455 | 1455 | int res = TH_OK; |
| 1456 | 1456 | int nVar; |
| 1457 | 1457 | char *zErr = 0; |
| 1458 | + int noComplain = 0; | |
| 1458 | 1459 | |
| 1460 | + if( argc>3 && argl[1]==11 && strncmp(argv[1], "-nocomplain", 11)==0 ){ | |
| 1461 | + argc--; | |
| 1462 | + argv++; | |
| 1463 | + argl++; | |
| 1464 | + noComplain = 1; | |
| 1465 | + } | |
| 1459 | 1466 | if( argc!=3 ){ |
| 1460 | 1467 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 1461 | 1468 | } |
| 1462 | 1469 | if( g.db==0 ){ |
| 1470 | + if( noComplain ) return TH_OK; | |
| 1463 | 1471 | Th_ErrorMessage(interp, "database is not open", 0, 0); |
| 1464 | 1472 | return TH_ERROR; |
| 1465 | 1473 | } |
| 1466 | 1474 | zSql = argv[1]; |
| 1467 | 1475 | nSql = argl[1]; |
| @@ -1469,10 +1477,11 @@ | ||
| 1469 | 1477 | zErr = 0; |
| 1470 | 1478 | sqlite3_set_authorizer(g.db, report_query_authorizer, (void*)&zErr); |
| 1471 | 1479 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 1472 | 1480 | sqlite3_set_authorizer(g.db, 0, 0); |
| 1473 | 1481 | if( rc!=0 || zErr!=0 ){ |
| 1482 | + if( noComplain ) return TH_OK; | |
| 1474 | 1483 | Th_ErrorMessage(interp, "SQL error: ", |
| 1475 | 1484 | zErr ? zErr : sqlite3_errmsg(g.db), -1); |
| 1476 | 1485 | return TH_ERROR; |
| 1477 | 1486 | } |
| 1478 | 1487 | n = (int)(zTail - zSql); |
| @@ -1502,10 +1511,11 @@ | ||
| 1502 | 1511 | res = Th_Eval(interp, 0, argv[2], argl[2]); |
| 1503 | 1512 | if( res==TH_BREAK || res==TH_CONTINUE ) res = TH_OK; |
| 1504 | 1513 | } |
| 1505 | 1514 | rc = sqlite3_finalize(pStmt); |
| 1506 | 1515 | if( rc!=SQLITE_OK ){ |
| 1516 | + if( noComplain ) return TH_OK; | |
| 1507 | 1517 | Th_ErrorMessage(interp, "SQL error: ", sqlite3_errmsg(g.db), -1); |
| 1508 | 1518 | return TH_ERROR; |
| 1509 | 1519 | } |
| 1510 | 1520 | } |
| 1511 | 1521 | return res; |
| 1512 | 1522 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -1428,11 +1428,11 @@ | |
| 1428 | Th_SetResult(interp, (const char *)zOut, -1); |
| 1429 | return TH_OK; |
| 1430 | } |
| 1431 | |
| 1432 | /* |
| 1433 | ** TH1 command: query SQL CODE |
| 1434 | ** |
| 1435 | ** Run the SQL query given by the SQL argument. For each row in the result |
| 1436 | ** set, run CODE. |
| 1437 | ** |
| 1438 | ** In SQL, parameters such as $var are filled in using the value of variable |
| @@ -1453,15 +1453,23 @@ | |
| 1453 | const char *zTail; |
| 1454 | int n, i; |
| 1455 | int res = TH_OK; |
| 1456 | int nVar; |
| 1457 | char *zErr = 0; |
| 1458 | |
| 1459 | if( argc!=3 ){ |
| 1460 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 1461 | } |
| 1462 | if( g.db==0 ){ |
| 1463 | Th_ErrorMessage(interp, "database is not open", 0, 0); |
| 1464 | return TH_ERROR; |
| 1465 | } |
| 1466 | zSql = argv[1]; |
| 1467 | nSql = argl[1]; |
| @@ -1469,10 +1477,11 @@ | |
| 1469 | zErr = 0; |
| 1470 | sqlite3_set_authorizer(g.db, report_query_authorizer, (void*)&zErr); |
| 1471 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 1472 | sqlite3_set_authorizer(g.db, 0, 0); |
| 1473 | if( rc!=0 || zErr!=0 ){ |
| 1474 | Th_ErrorMessage(interp, "SQL error: ", |
| 1475 | zErr ? zErr : sqlite3_errmsg(g.db), -1); |
| 1476 | return TH_ERROR; |
| 1477 | } |
| 1478 | n = (int)(zTail - zSql); |
| @@ -1502,10 +1511,11 @@ | |
| 1502 | res = Th_Eval(interp, 0, argv[2], argl[2]); |
| 1503 | if( res==TH_BREAK || res==TH_CONTINUE ) res = TH_OK; |
| 1504 | } |
| 1505 | rc = sqlite3_finalize(pStmt); |
| 1506 | if( rc!=SQLITE_OK ){ |
| 1507 | Th_ErrorMessage(interp, "SQL error: ", sqlite3_errmsg(g.db), -1); |
| 1508 | return TH_ERROR; |
| 1509 | } |
| 1510 | } |
| 1511 | return res; |
| 1512 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -1428,11 +1428,11 @@ | |
| 1428 | Th_SetResult(interp, (const char *)zOut, -1); |
| 1429 | return TH_OK; |
| 1430 | } |
| 1431 | |
| 1432 | /* |
| 1433 | ** TH1 command: query [-nocomplain] SQL CODE |
| 1434 | ** |
| 1435 | ** Run the SQL query given by the SQL argument. For each row in the result |
| 1436 | ** set, run CODE. |
| 1437 | ** |
| 1438 | ** In SQL, parameters such as $var are filled in using the value of variable |
| @@ -1453,15 +1453,23 @@ | |
| 1453 | const char *zTail; |
| 1454 | int n, i; |
| 1455 | int res = TH_OK; |
| 1456 | int nVar; |
| 1457 | char *zErr = 0; |
| 1458 | int noComplain = 0; |
| 1459 | |
| 1460 | if( argc>3 && argl[1]==11 && strncmp(argv[1], "-nocomplain", 11)==0 ){ |
| 1461 | argc--; |
| 1462 | argv++; |
| 1463 | argl++; |
| 1464 | noComplain = 1; |
| 1465 | } |
| 1466 | if( argc!=3 ){ |
| 1467 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 1468 | } |
| 1469 | if( g.db==0 ){ |
| 1470 | if( noComplain ) return TH_OK; |
| 1471 | Th_ErrorMessage(interp, "database is not open", 0, 0); |
| 1472 | return TH_ERROR; |
| 1473 | } |
| 1474 | zSql = argv[1]; |
| 1475 | nSql = argl[1]; |
| @@ -1469,10 +1477,11 @@ | |
| 1477 | zErr = 0; |
| 1478 | sqlite3_set_authorizer(g.db, report_query_authorizer, (void*)&zErr); |
| 1479 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 1480 | sqlite3_set_authorizer(g.db, 0, 0); |
| 1481 | if( rc!=0 || zErr!=0 ){ |
| 1482 | if( noComplain ) return TH_OK; |
| 1483 | Th_ErrorMessage(interp, "SQL error: ", |
| 1484 | zErr ? zErr : sqlite3_errmsg(g.db), -1); |
| 1485 | return TH_ERROR; |
| 1486 | } |
| 1487 | n = (int)(zTail - zSql); |
| @@ -1502,10 +1511,11 @@ | |
| 1511 | res = Th_Eval(interp, 0, argv[2], argl[2]); |
| 1512 | if( res==TH_BREAK || res==TH_CONTINUE ) res = TH_OK; |
| 1513 | } |
| 1514 | rc = sqlite3_finalize(pStmt); |
| 1515 | if( rc!=SQLITE_OK ){ |
| 1516 | if( noComplain ) return TH_OK; |
| 1517 | Th_ErrorMessage(interp, "SQL error: ", sqlite3_errmsg(g.db), -1); |
| 1518 | return TH_ERROR; |
| 1519 | } |
| 1520 | } |
| 1521 | return res; |
| 1522 |