From 46fb05e6eef700dd31686a1abc68eb6639852f90 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Fri, 30 Nov 2012 03:14:18 -0500 Subject: [PATCH] ignore reset result, reset on error Reset result is from last step; looking at it was probably causing spurious failures and busy-timeouts. Transaction completion relies on statements being reset reliably. --- collects/db/private/sqlite3/connection.rkt | 30 +++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/collects/db/private/sqlite3/connection.rkt b/collects/db/private/sqlite3/connection.rkt index 2a2c72f8d3..0ce832ea8e 100644 --- a/collects/db/private/sqlite3/connection.rkt +++ b/collects/db/private/sqlite3/connection.rkt @@ -62,8 +62,8 @@ (when delenda (for ([pst (in-hash-values delenda)]) (send pst finalize #f))) - (HANDLE fsym (sqlite3_reset stmt)) - (HANDLE fsym (sqlite3_clear_bindings stmt)) + (void (sqlite3_reset stmt)) + (void (sqlite3_clear_bindings stmt)) (for ([i (in-naturals 1)] [param (in-list params)]) (load-param fsym db stmt i param)) @@ -126,16 +126,22 @@ (error/internal* fsym "bad parameter value" '("value" value) param)]))) (define/private (step* fsym db stmt end-box fetch-limit) - (if (zero? fetch-limit) - null - (let ([c (step fsym db stmt)]) - (cond [c - (cons c (step* fsym db stmt end-box (sub1 fetch-limit)))] - [else - (HANDLE fsym (sqlite3_reset stmt)) - (HANDLE fsym (sqlite3_clear_bindings stmt)) - (when end-box (set-box! end-box #t)) - null])))) + (with-handlers ([exn:fail? + (lambda (e) + (void (sqlite3_reset stmt)) + (void (sqlite3_clear_bindings stmt)) + (raise e))]) + (let loop ([fetch-limit fetch-limit]) + (if (zero? fetch-limit) + null + (let ([c (step fsym db stmt)]) + (cond [c + (cons c (loop (sub1 fetch-limit)))] + [else + (void (sqlite3_reset stmt)) + (void (sqlite3_clear_bindings stmt)) + (when end-box (set-box! end-box #t)) + null])))))) (define/private (step fsym db stmt) (let ([s (HANDLE fsym (sqlite3_step stmt))])