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 ]