2008-02-12 16:47:01 -05:00
|
|
|
! Copyright (C) 2008 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-02-11 00:11:16 -05:00
|
|
|
USING: arrays assocs classes db kernel namespaces
|
2008-04-19 23:09:36 -04:00
|
|
|
classes.tuple words sequences slots math accessors
|
2009-05-15 00:23:06 -04:00
|
|
|
math.parser io prettyprint continuations
|
2009-02-19 19:26:11 -05:00
|
|
|
destructors mirrors sets db.types db.private fry
|
2009-02-21 22:59:23 -05:00
|
|
|
combinators.short-circuit db.errors ;
|
2008-02-11 00:11:16 -05:00
|
|
|
IN: db.tuples
|
|
|
|
|
2008-12-17 22:04:17 -05:00
|
|
|
HOOK: create-sql-statement db-connection ( class -- object )
|
|
|
|
HOOK: drop-sql-statement db-connection ( class -- object )
|
2008-09-23 16:59:33 -04:00
|
|
|
|
2008-12-17 22:04:17 -05:00
|
|
|
HOOK: <insert-db-assigned-statement> db-connection ( class -- object )
|
|
|
|
HOOK: <insert-user-assigned-statement> db-connection ( class -- object )
|
|
|
|
HOOK: <update-tuple-statement> db-connection ( class -- object )
|
|
|
|
HOOK: <delete-tuples-statement> db-connection ( tuple class -- object )
|
2010-02-18 18:31:52 -05:00
|
|
|
HOOK: <select-by-slots-statement> db-connection ( tuple class -- statement )
|
2008-12-17 22:04:17 -05:00
|
|
|
HOOK: <count-statement> db-connection ( query -- statement )
|
|
|
|
HOOK: query>statement db-connection ( query -- statement )
|
|
|
|
HOOK: insert-tuple-set-key db-connection ( tuple statement -- )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-10-03 21:19:20 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
2008-04-18 13:43:21 -04:00
|
|
|
SYMBOL: sql-counter
|
2008-10-03 21:19:20 -04:00
|
|
|
|
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-04-19 23:09:36 -04:00
|
|
|
|
2008-09-08 20:24:44 -04:00
|
|
|
: resulting-tuple ( exemplar-tuple row out-params -- tuple )
|
2008-05-30 20:21:20 -04:00
|
|
|
rot class new [
|
2009-02-19 19:26:11 -05:00
|
|
|
'[ slot-name>> _ set-slot-named ] 2each
|
2008-02-24 20:23:14 -05:00
|
|
|
] keep ;
|
|
|
|
|
2008-05-30 20:21:20 -04:00
|
|
|
: query-tuples ( exemplar-tuple statement -- seq )
|
2008-04-21 14:11:19 -04:00
|
|
|
[ out-params>> ] keep query-results [
|
2008-05-30 20:21:20 -04:00
|
|
|
[ sql-row-typed swap resulting-tuple ] with with query-map
|
2008-02-24 20:23:14 -05:00
|
|
|
] with-disposal ;
|
|
|
|
|
|
|
|
: query-modify-tuple ( tuple statement -- )
|
2008-03-05 20:59:29 -05:00
|
|
|
[ 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
|
2008-02-22 18:06:00 -05:00
|
|
|
] curry 2each ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-09-09 18:27:37 -04:00
|
|
|
: with-disposals ( object quotation -- )
|
2008-02-27 20:36:32 -05:00
|
|
|
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
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
: insert-db-assigned-statement ( tuple -- )
|
|
|
|
dup class
|
2008-12-17 22:04:17 -05:00
|
|
|
db-connection get insert-statements>>
|
|
|
|
[ <insert-db-assigned-statement> ] cache
|
2008-09-27 15:07:39 -04:00
|
|
|
[ bind-tuple ] 2keep insert-tuple-set-key ;
|
2008-09-24 18:59:17 -04:00
|
|
|
|
|
|
|
: insert-user-assigned-statement ( tuple -- )
|
|
|
|
dup class
|
2008-12-17 22:04:17 -05:00
|
|
|
db-connection get insert-statements>>
|
|
|
|
[ <insert-user-assigned-statement> ] cache
|
2008-09-24 18:59:17 -04:00
|
|
|
[ bind-tuple ] keep execute-statement ;
|
|
|
|
|
|
|
|
: do-select ( exemplar-tuple statement -- tuples )
|
|
|
|
[ [ bind-tuple ] [ query-tuples ] 2bi ] with-disposal ;
|
|
|
|
|
|
|
|
: do-count ( exemplar-tuple statement -- tuples )
|
|
|
|
[ [ bind-tuple ] [ nip default-query ] 2bi ] with-disposal ;
|
2008-10-02 17:02:31 -04:00
|
|
|
|
2008-09-24 20:30:46 -04:00
|
|
|
PRIVATE>
|
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
! High level
|
2008-09-24 20:30:46 -04:00
|
|
|
ERROR: no-slots-named class seq ;
|
|
|
|
: check-columns ( class columns -- )
|
2009-01-23 19:20:47 -05:00
|
|
|
[ nip ] [
|
2010-05-17 23:20:46 -04:00
|
|
|
[ keys ]
|
2009-01-23 19:20:47 -05:00
|
|
|
[ all-slots [ name>> ] map ] bi* diff
|
|
|
|
] 2bi
|
2008-09-24 20:30:46 -04:00
|
|
|
[ drop ] [ no-slots-named ] if-empty ;
|
|
|
|
|
|
|
|
: define-persistent ( class table columns -- )
|
|
|
|
pick dupd
|
|
|
|
check-columns
|
|
|
|
[ dupd "db-table" set-word-prop dup ] dip
|
|
|
|
[ relation? ] partition swapd
|
|
|
|
dupd [ spec>tuple ] with map
|
|
|
|
"db-columns" set-word-prop
|
|
|
|
"db-relations" set-word-prop ;
|
2008-09-24 18:59:17 -04:00
|
|
|
|
|
|
|
TUPLE: query tuple group order offset limit ;
|
|
|
|
|
|
|
|
: <query> ( -- query ) \ query new ;
|
|
|
|
|
|
|
|
GENERIC: >query ( object -- query )
|
|
|
|
|
|
|
|
M: query >query clone ;
|
|
|
|
|
|
|
|
M: tuple >query <query> swap >>tuple ;
|
|
|
|
|
2009-02-19 19:26:11 -05:00
|
|
|
ERROR: no-defined-persistent object ;
|
|
|
|
|
|
|
|
: ensure-defined-persistent ( object -- object )
|
|
|
|
dup { [ class? ] [ "db-table" word-prop ] } 1&& [
|
|
|
|
no-defined-persistent
|
|
|
|
] unless ;
|
|
|
|
|
2008-02-27 19:28:32 -05:00
|
|
|
: create-table ( class -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
ensure-defined-persistent
|
2008-02-27 19:47:14 -05:00
|
|
|
create-sql-statement [ execute-statement ] with-disposals ;
|
|
|
|
|
2008-02-27 19:28:32 -05:00
|
|
|
: drop-table ( class -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
ensure-defined-persistent
|
2008-02-27 19:47:14 -05:00
|
|
|
drop-sql-statement [ execute-statement ] with-disposals ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-04-28 19:21:45 -04:00
|
|
|
: recreate-table ( class -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
ensure-defined-persistent
|
2008-03-17 01:26:05 -04:00
|
|
|
[
|
2009-02-19 19:26:11 -05:00
|
|
|
'[
|
2009-02-21 22:59:23 -05:00
|
|
|
[
|
|
|
|
_ drop-sql-statement [ execute-statement ] with-disposals
|
|
|
|
] ignore-table-missing
|
|
|
|
] ignore-function-missing
|
2008-03-17 01:26:05 -04:00
|
|
|
] [ create-table ] bi ;
|
2008-03-13 00:57:56 -04:00
|
|
|
|
2009-02-19 19:26:11 -05:00
|
|
|
: ensure-table ( class -- )
|
|
|
|
ensure-defined-persistent
|
2009-02-21 22:59:23 -05:00
|
|
|
'[ [ _ create-table ] ignore-table-exists ] ignore-function-exists ;
|
2008-04-28 19:21:45 -04:00
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
: ensure-tables ( classes -- ) [ ensure-table ] each ;
|
2008-02-11 14:39:43 -05:00
|
|
|
|
2008-02-11 00:11:16 -05:00
|
|
|
: insert-tuple ( tuple -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
dup class ensure-defined-persistent
|
|
|
|
db-columns find-primary-key db-assigned-id-spec?
|
2008-04-28 17:48:55 -04:00
|
|
|
[ insert-db-assigned-statement ] [ insert-user-assigned-statement ] if ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
|
|
|
: update-tuple ( tuple -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
dup class ensure-defined-persistent
|
2008-12-17 22:04:17 -05:00
|
|
|
db-connection get update-statements>> [ <update-tuple-statement> ] cache
|
2008-02-24 13:32:36 -05:00
|
|
|
[ bind-tuple ] keep execute-statement ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-04-29 22:03:01 -04:00
|
|
|
: delete-tuples ( tuple -- )
|
2009-02-19 19:26:11 -05:00
|
|
|
dup
|
|
|
|
dup class ensure-defined-persistent
|
|
|
|
<delete-tuples-statement> [
|
2008-04-28 18:35:45 -04:00
|
|
|
[ bind-tuple ] keep execute-statement
|
|
|
|
] with-disposal ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
: select-tuples ( query/tuple -- tuples )
|
|
|
|
>query [ tuple>> ] [ query>statement ] bi do-select ;
|
2008-09-23 16:59:33 -04:00
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
: select-tuple ( query/tuple -- tuple/f )
|
2009-02-19 19:26:11 -05:00
|
|
|
>query 1 >>limit [ tuple>> ] [ query>statement ] bi
|
2011-10-13 15:53:46 -04:00
|
|
|
do-select ?first ;
|
2008-06-07 11:48:05 -04:00
|
|
|
|
2008-09-24 18:59:17 -04:00
|
|
|
: count-tuples ( query/tuple -- n )
|
|
|
|
>query [ tuple>> ] [ <count-statement> ] bi do-count
|
2008-06-12 19:04:01 -04:00
|
|
|
dup length 1 =
|
|
|
|
[ first first string>number ] [ [ first string>number ] map ] if ;
|