factor/basis/db/tuples/tuples.factor

152 lines
4.5 KiB
Factor
Raw Normal View History

! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays assocs classes db kernel namespaces
classes.tuple words sequences slots math accessors
math.parser io prettyprint db.types continuations
2008-09-05 20:29:14 -04:00
destructors mirrors ;
IN: db.tuples
TUPLE: query tuple group order offset limit ;
: <query> ( -- query ) \ query new ;
GENERIC: >query ( object -- query )
M: query >query ;
M: tuple >query <query> swap >>tuple ;
! returns a sequence of prepared-statements
HOOK: create-sql-statement db ( class -- object )
HOOK: drop-sql-statement db ( class -- object )
HOOK: <insert-db-assigned-statement> db ( class -- object )
HOOK: <insert-user-assigned-statement> db ( class -- object )
HOOK: <update-tuple-statement> db ( class -- object )
HOOK: <delete-tuples-statement> db ( tuple class -- object )
HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
HOOK: <count-statement> db ( tuple class groups -- statement )
HOOK: make-query db ( tuple class query -- statement )
HOOK: insert-tuple* db ( tuple statement -- )
: define-persistent ( class table columns -- )
>r dupd "db-table" set-word-prop dup r>
[ relation? ] partition swapd
dupd [ spec>tuple ] with map
"db-columns" set-word-prop
"db-relations" set-word-prop ;
2008-05-30 17:13:47 -04:00
ERROR: not-persistent class ;
2008-09-09 18:27:37 -04:00
: db-table ( class -- object )
2008-05-30 17:13:47 -04:00
dup "db-table" word-prop [ ] [ not-persistent ] ?if ;
2008-09-09 18:27:37 -04:00
: db-columns ( class -- object )
2008-05-28 18:02:58 -04:00
superclasses [ "db-columns" word-prop ] map concat ;
2008-09-09 18:27:37 -04:00
: db-relations ( class -- object )
"db-relations" word-prop ;
: set-primary-key ( key tuple -- )
[
2008-04-21 14:11:19 -04:00
class db-columns find-primary-key slot-name>>
] keep set-slot-named ;
2008-04-18 13:43:21 -04:00
SYMBOL: sql-counter
2008-04-21 14:11:19 -04:00
: next-sql-counter ( -- str )
sql-counter [ inc ] [ get ] bi number>string ;
2008-04-18 13:43:21 -04:00
2008-09-09 18:27:37 -04:00
GENERIC: eval-generator ( singleton -- object )
2008-09-08 20:24:44 -04:00
: resulting-tuple ( exemplar-tuple row out-params -- tuple )
rot class new [
[
2008-09-08 20:24:44 -04:00
[ slot-name>> ] dip set-slot-named
] curry 2each
] keep ;
: query-tuples ( exemplar-tuple statement -- seq )
2008-04-21 14:11:19 -04:00
[ out-params>> ] keep query-results [
[ sql-row-typed swap resulting-tuple ] with with query-map
] with-disposal ;
: query-modify-tuple ( tuple statement -- )
[ query-results [ sql-row-typed ] with-disposal ] keep
2008-04-21 14:11:19 -04:00
out-params>> rot [
2008-09-08 20:24:44 -04:00
[ slot-name>> ] dip set-slot-named
] curry 2each ;
2008-09-09 18:27:37 -04:00
: with-disposals ( object quotation -- )
over sequence? [
[ with-disposal ] curry each
] [
with-disposal
2008-04-23 20:40:17 -04:00
] if ; inline
2008-02-27 19:47:14 -05:00
: create-table ( class -- )
2008-02-27 19:47:14 -05:00
create-sql-statement [ execute-statement ] with-disposals ;
: drop-table ( class -- )
2008-02-27 19:47:14 -05:00
drop-sql-statement [ execute-statement ] with-disposals ;
: recreate-table ( class -- )
2008-03-17 01:26:05 -04:00
[
2008-06-01 00:38:10 -04:00
[ drop-sql-statement [ execute-statement ] with-disposals
] curry ignore-errors
2008-03-17 01:26:05 -04:00
] [ create-table ] bi ;
2008-03-13 00:57:56 -04:00
: ensure-table ( class -- )
[ create-table ] curry ignore-errors ;
: ensure-tables ( classes -- )
[ ensure-table ] each ;
: insert-db-assigned-statement ( tuple -- )
2008-02-27 20:30:31 -05:00
dup class
2008-08-30 13:46:30 -04:00
db get insert-statements>> [ <insert-db-assigned-statement> ] cache
[ bind-tuple ] 2keep insert-tuple* ;
: insert-user-assigned-statement ( tuple -- )
2008-02-27 20:30:31 -05:00
dup class
2008-08-30 13:46:30 -04:00
db get insert-statements>> [ <insert-user-assigned-statement> ] cache
[ bind-tuple ] keep execute-statement ;
2008-02-11 14:39:43 -05:00
: insert-tuple ( tuple -- )
dup class db-columns find-primary-key db-assigned-id-spec?
[ insert-db-assigned-statement ] [ insert-user-assigned-statement ] if ;
: update-tuple ( tuple -- )
2008-02-27 20:30:31 -05:00
dup class
2008-08-31 03:51:55 -04:00
db get update-statements>> [ <update-tuple-statement> ] cache
[ bind-tuple ] keep execute-statement ;
2008-04-29 22:03:01 -04:00
: delete-tuples ( tuple -- )
dup dup class <delete-tuples-statement> [
[ bind-tuple ] keep execute-statement
] with-disposal ;
: do-select ( exemplar-tuple statement -- tuples )
[ [ bind-tuple ] [ query-tuples ] 2bi ] with-disposal ;
2008-06-12 19:04:01 -04:00
: query ( tuple query -- tuples )
[ dup dup class ] dip make-query do-select ;
2008-06-12 19:04:01 -04:00
2008-03-03 05:40:50 -05:00
: select-tuples ( tuple -- tuples )
dup dup class <select-by-slots-statement> do-select ;
: select-tuple ( tuple -- tuple/f )
dup dup class \ query new 1 >>limit make-query do-select
2008-09-05 20:29:14 -04:00
[ f ] [ first ] if-empty ;
2008-06-07 11:48:05 -04:00
: do-count ( exemplar-tuple statement -- tuples )
[
[ bind-tuple ] [ nip default-query ] 2bi
] with-disposal ;
: count-tuples ( tuple groups -- n )
>r dup dup class r> <count-statement> do-count
2008-06-12 19:04:01 -04:00
dup length 1 =
[ first first string>number ] [ [ first string>number ] map ] if ;