handle>> db-close
] with-variable ;
-TUPLE: statement handle sql in-params out-params bind-params bound? type ;
+TUPLE: statement handle sql in-params out-params bind-params bound? type retries ;
TUPLE: simple-statement < statement ;
TUPLE: prepared-statement < statement ;
swap >>out-params
swap >>in-params
swap >>sql ;
-
+
: sql-row ( result-set -- seq )
dup #columns [ row-column ] with map ;
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel math namespaces sequences random
strings math.parser math.intervals combinators
-math.bitfields.lib namespaces.lib db db.tuples db.types ;
+math.bitfields.lib namespaces.lib db db.tuples db.types
+sequences.lib ;
IN: db.queries
GENERIC: where ( specs obj -- )
] with filter ;
: where-clause ( tuple specs -- )
- dupd filter-slots
- dup empty? [
- 2drop
+ dupd filter-slots [
+ drop
] [
" where " 0% [
" and " 0%
] [
2dup slot-name>> swap get-slot-named where
] interleave drop
- ] if ;
+ ] if-empty ;
M: db <delete-tuples-statement> ( tuple table -- sql )
[
SYMBOLS: insert update delete select distinct columns from as
where group-by having order-by limit offset is-null desc all
-any count avg table values ;
+any count avg table values ? ;
+
+! Output an s-exp sql statement and an alist of keys/values
: input-spec, 1, ;
: output-spec, 2, ;
[ make-retryable ] map
] [
retryable >>type
+ 10 >>retries
] if ;
: regenerate-params ( statement -- statement )
] 2map >>bind-params ;
M: retryable execute-statement* ( statement type -- )
- drop
- [
- [ query-results dispose t ]
- [ ]
- [ regenerate-params bind-statement* f ] cleanup
- ] curry 10 retry drop ;
+ drop [
+ [
+ [ query-results dispose t ]
+ [ ]
+ [ regenerate-params bind-statement* f ] cleanup
+ ] curry
+ ] [ retries>> ] bi retry drop ;
: resulting-tuple ( class row out-params -- tuple )
rot class new [
: select-tuple ( tuple -- tuple/f )
dup dup class f f f 1 <advanced-select-statement>
do-select ?first ;
+
+: advanced-select ( tuple groups order offset limit -- tuples )
+ >r >r >r >r dup dup class r> r> r> r>
+ <advanced-select-statement> do-select ;