From 66a4ec5896b8819024ebd8db93a9eb40ef86adf9 Mon Sep 17 00:00:00 2001 From: Doug Coleman <erg@jobim.local> Date: Mon, 13 Apr 2009 18:19:37 -0500 Subject: [PATCH] more generics in the statement protocol --- extra/db2/db2.factor | 28 ++++++------------- extra/db2/sqlite/lib/lib.factor | 3 -- extra/db2/sqlite/statements/statements.factor | 8 ++---- extra/db2/sqlite/types/types.factor | 11 ++++++-- extra/db2/statements/statements.factor | 6 ++++ 5 files changed, 26 insertions(+), 30 deletions(-) diff --git a/extra/db2/db2.factor b/extra/db2/db2.factor index 71f181e8d7..8d4bfd19a0 100644 --- a/extra/db2/db2.factor +++ b/extra/db2/db2.factor @@ -23,36 +23,24 @@ PRIVATE> : sql-bind-command ( sequence string -- ) f f <statement> [ - sqlite-maybe-prepare [ - handle>> swap sqlite-bind-sequence - ] [ - >sqlite-result-set drop - ] bi + prepare-statement + [ bind-sequence ] [ statement>result-set drop ] bi ] with-disposal ; : sql-bind-query ( in-sequence string -- out-sequence ) f f <statement> [ - sqlite-maybe-prepare [ - handle>> swap sqlite-bind-sequence - ] [ - statement>result-sequence - ] bi + prepare-statement + [ bind-sequence ] [ statement>result-sequence ] bi ] with-disposal ; : sql-bind-typed-command ( in-sequence string -- ) f f <statement> [ - sqlite-maybe-prepare [ - handle>> swap sqlite-bind-typed-sequence - ] [ - >sqlite-result-set drop - ] bi + prepare-statement + [ bind-typed-sequence ] [ statement>result-set drop ] bi ] with-disposal ; : sql-bind-typed-query ( in-sequence string -- out-sequence ) f f <statement> [ - sqlite-maybe-prepare [ - handle>> swap sqlite-bind-typed-sequence - ] [ - statement>result-sequence - ] bi + prepare-statement + [ bind-typed-sequence ] [ statement>result-sequence ] bi ] with-disposal ; diff --git a/extra/db2/sqlite/lib/lib.factor b/extra/db2/sqlite/lib/lib.factor index 483987d803..f8503ee90f 100644 --- a/extra/db2/sqlite/lib/lib.factor +++ b/extra/db2/sqlite/lib/lib.factor @@ -114,8 +114,5 @@ IN: db2.sqlite.lib : sqlite-next ( prepared -- ? ) sqlite3_step sqlite-step-has-more-rows? ; -: sqlite-bind-sequence ( handle sequence -- ) - [ 1+ swap sqlite-bind-text ] assoc-with each-index ; - : >sqlite-result-set ( statement -- result-set ) sqlite-result-set new-result-set dup advance-row ; diff --git a/extra/db2/sqlite/statements/statements.factor b/extra/db2/sqlite/statements/statements.factor index a856c48075..64ce390308 100644 --- a/extra/db2/sqlite/statements/statements.factor +++ b/extra/db2/sqlite/statements/statements.factor @@ -14,8 +14,6 @@ M: sqlite-statement dispose handle>> [ [ sqlite3_reset drop ] [ sqlite-finalize ] bi ] when* ; -: sqlite-maybe-prepare ( statement -- statement ) - dup handle>> [ - db-connection get handle>> over sql>> sqlite-prepare - >>handle - ] unless ; +M: sqlite-statement prepare-statement* ( statement -- statement ) + db-connection get handle>> over sql>> sqlite-prepare + >>handle ; diff --git a/extra/db2/sqlite/types/types.factor b/extra/db2/sqlite/types/types.factor index 5429de0d7c..7124568fbe 100644 --- a/extra/db2/sqlite/types/types.factor +++ b/extra/db2/sqlite/types/types.factor @@ -84,5 +84,12 @@ IN: db2.sqlite.types [ no-sql-type ] } case ; -: sqlite-bind-typed-sequence ( handle sequence -- ) - [ 1+ swap first2 swap bind-next-sqlite-type ] assoc-with each-index ; +M: sqlite-statement bind-sequence ( sequence statement -- ) + handle>> '[ + [ _ ] 2dip 1+ swap sqlite-bind-text + ] each-index ; + +M: sqlite-statement bind-typed-sequence ( sequence statement -- ) + handle>> '[ + [ _ ] 2dip 1+ swap first2 swap bind-next-sqlite-type + ] each-index ; diff --git a/extra/db2/statements/statements.factor b/extra/db2/statements/statements.factor index 006cda3532..989391473d 100644 --- a/extra/db2/statements/statements.factor +++ b/extra/db2/statements/statements.factor @@ -15,6 +15,9 @@ TUPLE: statement handle sql in out type ; HOOK: <statement> db-connection ( sql in out -- statement ) GENERIC: statement>result-set* ( statement -- result-set ) GENERIC: execute-statement* ( statement type -- ) +GENERIC: prepare-statement* ( statement -- statement' ) +GENERIC: bind-sequence ( sequence statement -- ) +GENERIC: bind-typed-sequence ( sequence statement -- ) : statement>result-set ( statement -- result-set ) [ statement>result-set* ] @@ -31,6 +34,9 @@ M: object execute-statement* ( statement type -- ) [ [ execute-one-statement ] each ] [ execute-one-statement ] if ; +: prepare-statement ( statement -- statement ) + dup handle>> [ prepare-statement* ] unless ; + : statement-each ( statement quot: ( statement -- ) -- ) over more-rows? [ [ call ] 2keep over advance-row statement-each ]