2008-04-20 18:47:43 -04:00
|
|
|
! Copyright (C) 2008 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-04-20 18:55:08 -04:00
|
|
|
USING: accessors kernel math namespaces sequences random
|
2008-04-21 01:45:14 -04:00
|
|
|
strings
|
|
|
|
math.bitfields.lib namespaces.lib db db.tuples db.types
|
|
|
|
math.intervals ;
|
2008-04-20 18:47:43 -04:00
|
|
|
IN: db.queries
|
|
|
|
|
|
|
|
: maybe-make-retryable ( statement -- statement )
|
|
|
|
dup in-params>> [ generator-bind? ] contains? [
|
|
|
|
make-retryable
|
|
|
|
] when ;
|
|
|
|
|
|
|
|
: query-make ( class quot -- )
|
|
|
|
>r sql-props r>
|
|
|
|
[ 0 sql-counter rot with-variable ] { "" { } { } } nmake
|
2008-04-21 05:11:33 -04:00
|
|
|
<simple-statement> maybe-make-retryable ; inline
|
2008-04-20 18:47:43 -04:00
|
|
|
|
|
|
|
M: db begin-transaction ( -- ) "BEGIN" sql-command ;
|
|
|
|
M: db commit-transaction ( -- ) "COMMIT" sql-command ;
|
|
|
|
M: db rollback-transaction ( -- ) "ROLLBACK" sql-command ;
|
2008-04-20 18:55:08 -04:00
|
|
|
|
|
|
|
: where-primary-key% ( specs -- )
|
|
|
|
" where " 0%
|
|
|
|
find-primary-key dup column-name>> 0% " = " 0% bind% ;
|
|
|
|
|
|
|
|
M: db <update-tuple-statement> ( class -- statement )
|
|
|
|
[
|
|
|
|
"update " 0% 0%
|
|
|
|
" set " 0%
|
|
|
|
dup remove-id
|
|
|
|
[ ", " 0% ] [ dup column-name>> 0% " = " 0% bind% ] interleave
|
|
|
|
where-primary-key%
|
|
|
|
] query-make ;
|
|
|
|
|
|
|
|
M: db <delete-tuple-statement> ( specs table -- sql )
|
|
|
|
[
|
|
|
|
"delete from " 0% 0%
|
|
|
|
" where " 0%
|
|
|
|
find-primary-key
|
|
|
|
dup column-name>> 0% " = " 0% bind%
|
|
|
|
] query-make ;
|
|
|
|
|
|
|
|
M: db random-id-quot ( -- quot )
|
|
|
|
[ 63 [ 2^ random ] keep 1 - set-bit ] ;
|
|
|
|
|
2008-04-21 01:45:14 -04:00
|
|
|
GENERIC: where ( specs obj -- )
|
|
|
|
|
|
|
|
: interval-comparison ( ? str -- str )
|
|
|
|
"from" = " >" " <" ? swap [ "= " append ] when ;
|
|
|
|
|
|
|
|
: where-interval ( spec obj from/to -- )
|
|
|
|
pick column-name>> 0%
|
|
|
|
>r first2 r> interval-comparison 0%
|
|
|
|
bind# ;
|
|
|
|
|
|
|
|
: in-parens ( quot -- )
|
|
|
|
"(" 0% call ")" 0% ; inline
|
|
|
|
|
|
|
|
M: interval where ( spec obj -- )
|
|
|
|
[
|
|
|
|
[ from>> "from" where-interval " and " 0% ]
|
|
|
|
[ to>> "to" where-interval ] 2bi
|
|
|
|
] in-parens ;
|
|
|
|
|
|
|
|
M: sequence where ( spec obj -- )
|
|
|
|
[
|
|
|
|
[ " or " 0% ] [ dupd where ] interleave drop
|
|
|
|
] in-parens ;
|
|
|
|
|
|
|
|
: object-where ( spec obj -- )
|
|
|
|
over column-name>> 0% " = " 0% bind# ;
|
|
|
|
|
|
|
|
M: object where ( spec obj -- ) object-where ;
|
|
|
|
|
|
|
|
M: integer where ( spec obj -- ) object-where ;
|
|
|
|
|
|
|
|
M: string where ( spec obj -- ) object-where ;
|
|
|
|
|
|
|
|
: where-clause ( tuple specs -- )
|
|
|
|
" where " 0% [
|
|
|
|
" and " 0%
|
|
|
|
] [
|
|
|
|
2dup slot-name>> swap get-slot-named where
|
|
|
|
] interleave drop ;
|
|
|
|
|
|
|
|
M: db <select-by-slots-statement> ( tuple class -- statement )
|
|
|
|
[
|
|
|
|
"select " 0%
|
|
|
|
over [ ", " 0% ]
|
|
|
|
[ dup column-name>> 0% 2, ] interleave
|
|
|
|
|
|
|
|
" from " 0% 0%
|
|
|
|
dupd
|
|
|
|
[ slot-name>> swap get-slot-named ] with subset
|
|
|
|
dup empty? [ 2drop ] [ where-clause ] if ";" 0%
|
|
|
|
] query-make ;
|
|
|
|
|