]> gitweb.factorcode.org Git - factor.git/commitdiff
add sql-bind-query, sql-bind-command for writing raw sql
authorDoug Coleman <erg@jobim.local>
Mon, 13 Apr 2009 22:27:31 +0000 (17:27 -0500)
committerDoug Coleman <erg@jobim.local>
Mon, 13 Apr 2009 22:27:31 +0000 (17:27 -0500)
extra/db2/db2.factor
extra/db2/result-sets/result-sets.factor
extra/db2/sqlite/result-sets/result-sets.factor
extra/db2/statements/statements-tests.factor

index e1723160c095406f8aeee5adf88364cc531772ab..708caa97ab81f519d57ba8a5137262d8f012b0be 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors continuations destructors fry kernel
-namespaces sequences strings db2.statements ;
+USING: accessors continuations db2.result-sets db2.sqlite.lib
+db2.sqlite.result-sets db2.sqlite.statements db2.statements
+destructors fry kernel math namespaces sequences strings ;
 IN: db2
 
 <PRIVATE
@@ -19,3 +20,20 @@ PRIVATE>
 : sql-query ( sql -- sequence )
     f f <statement> [ statement>result-sequence ] with-disposal ;
 
+: sql-bind-command ( sequence string -- )
+    f f <statement> [
+        sqlite-maybe-prepare [
+            handle>> '[ [ _ ] 2dip 1+ swap sqlite-bind-text ] each-index
+        ] [
+            sqlite-result-set new-result-set advance-row
+        ] bi
+    ] with-disposal ;
+
+: sql-bind-query ( in-sequence string -- out-sequence )
+    f f <statement> [
+        sqlite-maybe-prepare [
+            handle>> '[ [ _ ] 2dip 1+ swap sqlite-bind-text ] each-index
+        ] [
+            statement>result-sequence
+        ] bi
+    ] with-disposal ;
index 8e35dc3862b3db36de248a7c106706305ca45d37..6f69c26ab2b629fc0574acf5e008afe19146566e 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel sequences ;
+USING: accessors kernel sequences combinators ;
 IN: db2.result-sets
 
 TUPLE: result-set sql in out handle n max ;
@@ -16,10 +16,14 @@ GENERIC# column-typed 1 ( result-set column -- sql )
     dup #rows >>max
     0 >>n ;
 
-: new-result-set ( query handle class -- result-set )
+: new-result-set ( query class -- result-set )
     new
-        swap >>handle
-        swap [ sql>> >>sql ] [ in>> >>in ] [ out>> >>out ] tri ;
+        swap {
+            [ handle>> >>handle ]
+            [ sql>> >>sql ]
+            [ in>> >>in ]
+            [ out>> >>out ]
+        } cleave ;
 
 : sql-row ( result-set -- seq )
     dup #columns [ column ] with map ;
index a8bf11fc568597d9963cb10857b505e9d606d5fb..e77ade567a70410add202faa651bcd846c3f86e8 100644 (file)
@@ -11,7 +11,7 @@ M: sqlite-result-set dispose
 
 M: sqlite-statement statement>result-set*
     sqlite-maybe-prepare
-    dup handle>> sqlite-result-set new-result-set
+    sqlite-result-set new-result-set
     dup advance-row ;
 
 M: sqlite-result-set advance-row ( result-set -- )
index 43564c8b2986e107234e7a0b437440930522eb6d..6afcfb0c9530c16492da9cd9dbd96c1bf02b8c01 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: tools.test db2.statements kernel db2 db2.tester
-continuations db2.errors ;
+continuations db2.errors accessors ;
 IN: db2.statements.tests
 
 { 1 0 } [ [ drop ] statement-each ] must-infer-as
@@ -11,6 +11,9 @@ IN: db2.statements.tests
 : test-sql-command ( -- )
     [ "drop table computer;" sql-command ] ignore-errors
 
+    [ "drop table computer;" sql-command ]
+    [ [ sql-table-missing? ] [ table>> "computer" = ] bi and ] must-fail-with
+
     [ ] [
         "create table computer(name varchar, os varchar);"
         sql-command
@@ -32,7 +35,17 @@ IN: db2.statements.tests
     [ "selectt" sql-query ]
     [ sql-syntax-error? ] must-fail-with
 
+    [ ] [
+        { "clubber" "windows" }
+        "insert into computer (name, os) values(?, ?);"
+        sql-bind-command
+    ] unit-test
+
+    [ { { "windows" } } ] [
+        { "clubber" }
+        "select os from computer where name = ?;" sql-bind-query
+    ] unit-test
+
     ;
 
 [ test-sql-command ] test-dbs
-