diff --git a/extra/db2/db2.factor b/extra/db2/db2.factor index e1723160c0..708caa97ab 100644 --- a/extra/db2/db2.factor +++ b/extra/db2/db2.factor @@ -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 : sql-query ( sql -- sequence ) f f [ statement>result-sequence ] with-disposal ; +: sql-bind-command ( sequence string -- ) + f f [ + 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 [ + sqlite-maybe-prepare [ + handle>> '[ [ _ ] 2dip 1+ swap sqlite-bind-text ] each-index + ] [ + statement>result-sequence + ] bi + ] with-disposal ; diff --git a/extra/db2/result-sets/result-sets.factor b/extra/db2/result-sets/result-sets.factor index 8e35dc3862..6f69c26ab2 100644 --- a/extra/db2/result-sets/result-sets.factor +++ b/extra/db2/result-sets/result-sets.factor @@ -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 ; diff --git a/extra/db2/sqlite/result-sets/result-sets.factor b/extra/db2/sqlite/result-sets/result-sets.factor index a8bf11fc56..e77ade567a 100644 --- a/extra/db2/sqlite/result-sets/result-sets.factor +++ b/extra/db2/sqlite/result-sets/result-sets.factor @@ -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 -- ) diff --git a/extra/db2/statements/statements-tests.factor b/extra/db2/statements/statements-tests.factor index 43564c8b29..6afcfb0c95 100644 --- a/extra/db2/statements/statements-tests.factor +++ b/extra/db2/statements/statements-tests.factor @@ -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 -