: 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 ;
: 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 ;
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 ;
[ 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 ;
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* ]
[ [ 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 ]