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
|
2008-02-18 17:52:00 -05:00
|
|
|
math.parser io prettyprint db.types continuations
|
2008-04-21 16:06:39 -04:00
|
|
|
mirrors sequences.lib tools.walker combinators.lib ;
|
2008-02-11 00:11:16 -05:00
|
|
|
IN: db.tuples
|
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: 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-02-11 00:11:16 -05:00
|
|
|
|
2008-04-19 20:27:54 -04:00
|
|
|
ERROR: not-persistent ;
|
|
|
|
|
|
|
|
: db-table ( class -- obj )
|
|
|
|
"db-table" word-prop [ not-persistent ] unless* ;
|
|
|
|
|
|
|
|
: db-columns ( class -- obj )
|
|
|
|
"db-columns" word-prop ;
|
|
|
|
|
|
|
|
: db-relations ( class -- obj )
|
|
|
|
"db-relations" word-prop ;
|
2008-02-18 20:09:59 -05:00
|
|
|
|
2008-02-25 15:50:42 -05:00
|
|
|
: set-primary-key ( key tuple -- )
|
|
|
|
[
|
2008-04-21 14:11:19 -04:00
|
|
|
class db-columns find-primary-key slot-name>>
|
2008-02-25 15:50:42 -05:00
|
|
|
] keep set-slot-named ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
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-02-22 18:06:00 -05:00
|
|
|
! returns a sequence of prepared-statements
|
|
|
|
HOOK: create-sql-statement db ( class -- obj )
|
|
|
|
HOOK: drop-sql-statement db ( class -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-27 20:30:31 -05:00
|
|
|
HOOK: <insert-native-statement> db ( class -- obj )
|
2008-03-17 01:26:05 -04:00
|
|
|
HOOK: <insert-nonnative-statement> db ( class -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-27 20:30:31 -05:00
|
|
|
HOOK: <update-tuple-statement> db ( class -- obj )
|
|
|
|
HOOK: <update-tuples-statement> db ( class -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-27 20:30:31 -05:00
|
|
|
HOOK: <delete-tuple-statement> db ( class -- obj )
|
|
|
|
HOOK: <delete-tuples-statement> db ( class -- obj )
|
2008-02-15 00:39:20 -05:00
|
|
|
|
2008-03-15 08:57:38 -04:00
|
|
|
HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-25 15:50:42 -05:00
|
|
|
HOOK: insert-tuple* db ( tuple statement -- )
|
2008-02-15 21:37:54 -05:00
|
|
|
|
2008-04-21 16:06:39 -04:00
|
|
|
GENERIC: eval-generator ( singleton -- obj )
|
2008-04-19 23:09:36 -04:00
|
|
|
SINGLETON: retryable
|
|
|
|
|
|
|
|
: make-retryable ( obj -- obj' )
|
|
|
|
dup sequence? [
|
|
|
|
[ make-retryable ] map
|
|
|
|
] [
|
|
|
|
retryable >>type
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: regenerate-params ( statement -- statement )
|
|
|
|
dup
|
|
|
|
[ bind-params>> ] [ in-params>> ] bi
|
|
|
|
[
|
|
|
|
dup generator-bind? [
|
2008-04-21 14:11:19 -04:00
|
|
|
singleton>> eval-generator >>value
|
2008-04-19 23:09:36 -04:00
|
|
|
] [
|
|
|
|
drop
|
|
|
|
] if
|
|
|
|
] 2map >>bind-params ;
|
|
|
|
|
|
|
|
M: retryable execute-statement* ( statement type -- )
|
|
|
|
drop
|
|
|
|
[
|
|
|
|
[ query-results dispose t ]
|
|
|
|
[ ]
|
|
|
|
[ regenerate-params bind-statement* f ] cleanup
|
|
|
|
] curry 10 retry drop ;
|
|
|
|
|
2008-02-24 20:23:14 -05:00
|
|
|
: resulting-tuple ( row out-params -- tuple )
|
2008-04-21 14:11:19 -04:00
|
|
|
dup first class>> new [
|
2008-02-24 20:23:14 -05:00
|
|
|
[
|
2008-04-21 14:11:19 -04:00
|
|
|
>r slot-name>> r> set-slot-named
|
2008-02-24 20:23:14 -05:00
|
|
|
] curry 2each
|
|
|
|
] keep ;
|
|
|
|
|
|
|
|
: query-tuples ( statement -- seq )
|
2008-04-21 14:11:19 -04:00
|
|
|
[ out-params>> ] keep query-results [
|
2008-03-05 20:59:29 -05:00
|
|
|
[ sql-row-typed swap resulting-tuple ] 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 [
|
|
|
|
>r slot-name>> r> set-slot-named
|
2008-02-22 18:06:00 -05:00
|
|
|
] curry 2each ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: sql-props ( class -- columns table )
|
2008-04-19 20:27:54 -04:00
|
|
|
[ db-columns ] [ db-table ] bi ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-27 19:47:14 -05:00
|
|
|
: with-disposals ( seq quot -- )
|
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-02-27 19:28:32 -05:00
|
|
|
: create-table ( class -- )
|
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 -- )
|
2008-02-27 19:47:14 -05:00
|
|
|
drop-sql-statement [ execute-statement ] with-disposals ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-03-13 00:57:56 -04:00
|
|
|
: ensure-table ( class -- )
|
2008-03-17 01:26:05 -04:00
|
|
|
[
|
|
|
|
drop-sql-statement make-nonthrowable
|
|
|
|
[ execute-statement ] with-disposals
|
|
|
|
] [ create-table ] bi ;
|
2008-03-13 00:57:56 -04:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: insert-native ( tuple -- )
|
2008-02-27 20:30:31 -05:00
|
|
|
dup class
|
|
|
|
db get db-insert-statements [ <insert-native-statement> ] cache
|
2008-02-25 15:50:42 -05:00
|
|
|
[ bind-tuple ] 2keep insert-tuple* ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-03-17 01:26:05 -04:00
|
|
|
: insert-nonnative ( tuple -- )
|
2008-02-27 20:30:31 -05:00
|
|
|
dup class
|
2008-03-17 01:26:05 -04:00
|
|
|
db get db-insert-statements [ <insert-nonnative-statement> ] cache
|
2008-02-22 18:06:00 -05:00
|
|
|
[ bind-tuple ] keep execute-statement ;
|
2008-02-11 14:39:43 -05:00
|
|
|
|
2008-02-11 00:11:16 -05:00
|
|
|
: insert-tuple ( tuple -- )
|
2008-04-19 20:27:54 -04:00
|
|
|
dup class db-columns find-primary-key nonnative-id?
|
|
|
|
[ insert-nonnative ] [ insert-native ] if ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
|
|
|
: update-tuple ( tuple -- )
|
2008-02-27 20:30:31 -05:00
|
|
|
dup class
|
|
|
|
db get db-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-02-25 16:13:00 -05:00
|
|
|
: delete-tuple ( tuple -- )
|
2008-02-27 20:30:31 -05:00
|
|
|
dup class
|
|
|
|
db get db-delete-statements [ <delete-tuple-statement> ] cache
|
2008-02-25 16:13:00 -05:00
|
|
|
[ bind-tuple ] keep execute-statement ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-03-03 05:40:50 -05:00
|
|
|
: select-tuples ( tuple -- tuples )
|
2008-02-27 19:28:32 -05:00
|
|
|
dup dup class <select-by-slots-statement> [
|
|
|
|
[ bind-tuple ] keep query-tuples
|
|
|
|
] with-disposal ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-25 16:13:00 -05:00
|
|
|
: select-tuple ( tuple -- tuple/f ) select-tuples ?first ;
|