| | @@ -191,37 +191,47 @@ |
| 191 | 191 | /* |
| 192 | 192 | ** Prepare a Stmt. Assume that the Stmt is previously uninitialized. |
| 193 | 193 | ** If the input string contains multiple SQL statements, only the first |
| 194 | 194 | ** one is processed. All statements beyond the first are silently ignored. |
| 195 | 195 | */ |
| 196 | | -int db_vprepare(Stmt *pStmt, const char *zFormat, va_list ap){ |
| 196 | +int db_vprepare(Stmt *pStmt, int errOk, const char *zFormat, va_list ap){ |
| 197 | + int rc; |
| 197 | 198 | char *zSql; |
| 198 | 199 | blob_zero(&pStmt->sql); |
| 199 | 200 | blob_vappendf(&pStmt->sql, zFormat, ap); |
| 200 | 201 | va_end(ap); |
| 201 | 202 | zSql = blob_str(&pStmt->sql); |
| 202 | | - if( sqlite3_prepare_v2(g.db, zSql, -1, &pStmt->pStmt, 0)!=0 ){ |
| 203 | + rc = sqlite3_prepare_v2(g.db, zSql, -1, &pStmt->pStmt, 0); |
| 204 | + if( rc!=0 && !errOk ){ |
| 203 | 205 | db_err("%s\n%s", sqlite3_errmsg(g.db), zSql); |
| 204 | 206 | } |
| 205 | 207 | pStmt->pNext = pStmt->pPrev = 0; |
| 206 | 208 | pStmt->nStep = 0; |
| 207 | | - return 0; |
| 209 | + return rc; |
| 208 | 210 | } |
| 209 | 211 | int db_prepare(Stmt *pStmt, const char *zFormat, ...){ |
| 210 | 212 | int rc; |
| 211 | 213 | va_list ap; |
| 212 | 214 | va_start(ap, zFormat); |
| 213 | | - rc = db_vprepare(pStmt, zFormat, ap); |
| 215 | + rc = db_vprepare(pStmt, 0, zFormat, ap); |
| 216 | + va_end(ap); |
| 217 | + return rc; |
| 218 | +} |
| 219 | +int db_prepare_ignore_error(Stmt *pStmt, const char *zFormat, ...){ |
| 220 | + int rc; |
| 221 | + va_list ap; |
| 222 | + va_start(ap, zFormat); |
| 223 | + rc = db_vprepare(pStmt, 1, zFormat, ap); |
| 214 | 224 | va_end(ap); |
| 215 | 225 | return rc; |
| 216 | 226 | } |
| 217 | 227 | int db_static_prepare(Stmt *pStmt, const char *zFormat, ...){ |
| 218 | 228 | int rc = SQLITE_OK; |
| 219 | 229 | if( blob_size(&pStmt->sql)==0 ){ |
| 220 | 230 | va_list ap; |
| 221 | 231 | va_start(ap, zFormat); |
| 222 | | - rc = db_vprepare(pStmt, zFormat, ap); |
| 232 | + rc = db_vprepare(pStmt, 0, zFormat, ap); |
| 223 | 233 | pStmt->pNext = pAllStmt; |
| 224 | 234 | pStmt->pPrev = 0; |
| 225 | 235 | if( pAllStmt ) pAllStmt->pPrev = pStmt; |
| 226 | 236 | pAllStmt = pStmt; |
| 227 | 237 | va_end(ap); |
| | @@ -444,11 +454,11 @@ |
| 444 | 454 | i64 db_int64(i64 iDflt, const char *zSql, ...){ |
| 445 | 455 | va_list ap; |
| 446 | 456 | Stmt s; |
| 447 | 457 | i64 rc; |
| 448 | 458 | va_start(ap, zSql); |
| 449 | | - db_vprepare(&s, zSql, ap); |
| 459 | + db_vprepare(&s, 0, zSql, ap); |
| 450 | 460 | va_end(ap); |
| 451 | 461 | if( db_step(&s)!=SQLITE_ROW ){ |
| 452 | 462 | rc = iDflt; |
| 453 | 463 | }else{ |
| 454 | 464 | rc = db_column_int64(&s, 0); |
| | @@ -459,11 +469,11 @@ |
| 459 | 469 | int db_int(int iDflt, const char *zSql, ...){ |
| 460 | 470 | va_list ap; |
| 461 | 471 | Stmt s; |
| 462 | 472 | int rc; |
| 463 | 473 | va_start(ap, zSql); |
| 464 | | - db_vprepare(&s, zSql, ap); |
| 474 | + db_vprepare(&s, 0, zSql, ap); |
| 465 | 475 | va_end(ap); |
| 466 | 476 | if( db_step(&s)!=SQLITE_ROW ){ |
| 467 | 477 | rc = iDflt; |
| 468 | 478 | }else{ |
| 469 | 479 | rc = db_column_int(&s, 0); |
| | @@ -479,11 +489,11 @@ |
| 479 | 489 | int db_exists(const char *zSql, ...){ |
| 480 | 490 | va_list ap; |
| 481 | 491 | Stmt s; |
| 482 | 492 | int rc; |
| 483 | 493 | va_start(ap, zSql); |
| 484 | | - db_vprepare(&s, zSql, ap); |
| 494 | + db_vprepare(&s, 0, zSql, ap); |
| 485 | 495 | va_end(ap); |
| 486 | 496 | if( db_step(&s)!=SQLITE_ROW ){ |
| 487 | 497 | rc = 0; |
| 488 | 498 | }else{ |
| 489 | 499 | rc = 1; |
| | @@ -499,11 +509,11 @@ |
| 499 | 509 | double db_double(double rDflt, const char *zSql, ...){ |
| 500 | 510 | va_list ap; |
| 501 | 511 | Stmt s; |
| 502 | 512 | double r; |
| 503 | 513 | va_start(ap, zSql); |
| 504 | | - db_vprepare(&s, zSql, ap); |
| 514 | + db_vprepare(&s, 0, zSql, ap); |
| 505 | 515 | va_end(ap); |
| 506 | 516 | if( db_step(&s)!=SQLITE_ROW ){ |
| 507 | 517 | r = rDflt; |
| 508 | 518 | }else{ |
| 509 | 519 | r = db_column_double(&s, 0); |
| | @@ -518,11 +528,11 @@ |
| 518 | 528 | */ |
| 519 | 529 | void db_blob(Blob *pResult, const char *zSql, ...){ |
| 520 | 530 | va_list ap; |
| 521 | 531 | Stmt s; |
| 522 | 532 | va_start(ap, zSql); |
| 523 | | - db_vprepare(&s, zSql, ap); |
| 533 | + db_vprepare(&s, 0, zSql, ap); |
| 524 | 534 | va_end(ap); |
| 525 | 535 | if( db_step(&s)==SQLITE_ROW ){ |
| 526 | 536 | blob_append(pResult, sqlite3_column_blob(s.pStmt, 0), |
| 527 | 537 | sqlite3_column_bytes(s.pStmt, 0)); |
| 528 | 538 | } |
| | @@ -538,11 +548,11 @@ |
| 538 | 548 | char *db_text(char *zDefault, const char *zSql, ...){ |
| 539 | 549 | va_list ap; |
| 540 | 550 | Stmt s; |
| 541 | 551 | char *z; |
| 542 | 552 | va_start(ap, zSql); |
| 543 | | - db_vprepare(&s, zSql, ap); |
| 553 | + db_vprepare(&s, 0, zSql, ap); |
| 544 | 554 | va_end(ap); |
| 545 | 555 | if( db_step(&s)==SQLITE_ROW ){ |
| 546 | 556 | z = mprintf("%s", sqlite3_column_text(s.pStmt, 0)); |
| 547 | 557 | }else if( zDefault ){ |
| 548 | 558 | z = mprintf("%s", zDefault); |
| 549 | 559 | |