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-02-22 18:06:00 -05:00
|
|
|
tuples words sequences slots math
|
2008-02-18 17:52:00 -05:00
|
|
|
math.parser io prettyprint db.types continuations
|
2008-02-22 18:06:00 -05: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-12 16:47:01 -05:00
|
|
|
: db-table ( class -- obj ) "db-table" word-prop ;
|
2008-02-18 17:52:00 -05:00
|
|
|
: db-columns ( class -- obj ) "db-columns" word-prop ;
|
|
|
|
: db-relations ( class -- obj ) "db-relations" word-prop ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-25 15:50:42 -05:00
|
|
|
: set-primary-key ( key tuple -- )
|
|
|
|
[
|
|
|
|
class db-columns find-primary-key sql-spec-slot-name
|
|
|
|
] keep set-slot-named ;
|
|
|
|
|
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-22 18:06:00 -05:00
|
|
|
HOOK: <insert-native-statement> db ( tuple -- obj )
|
|
|
|
HOOK: <insert-assigned-statement> db ( tuple -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
HOOK: <update-tuple-statement> db ( tuple -- obj )
|
|
|
|
HOOK: <update-tuples-statement> db ( tuple -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
HOOK: <delete-tuple-statement> db ( tuple -- obj )
|
|
|
|
HOOK: <delete-tuples-statement> db ( tuple -- obj )
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-25 15:50:42 -05:00
|
|
|
HOOK: <select-by-slots-statement> db ( tuple -- tuple )
|
|
|
|
|
2008-02-15 15:01:44 -05:00
|
|
|
HOOK: row-column-typed db ( result-set n type -- sql )
|
2008-02-25 15:50:42 -05:00
|
|
|
HOOK: insert-tuple* db ( tuple statement -- )
|
2008-02-15 21:37:54 -05:00
|
|
|
|
2008-02-24 20:23:14 -05:00
|
|
|
: resulting-tuple ( row out-params -- tuple )
|
|
|
|
dup first sql-spec-class construct-empty [
|
|
|
|
[
|
|
|
|
>r [ sql-spec-type sql-type>factor-type ] keep
|
|
|
|
sql-spec-slot-name r> set-slot-named
|
|
|
|
] curry 2each
|
|
|
|
] keep ;
|
|
|
|
|
|
|
|
: query-tuples ( statement -- seq )
|
|
|
|
[ statement-out-params ] keep query-results [
|
|
|
|
! out-parms result-set
|
|
|
|
[
|
|
|
|
sql-row swap resulting-tuple
|
|
|
|
] with query-map
|
|
|
|
] with-disposal ;
|
|
|
|
|
|
|
|
: query-modify-tuple ( tuple statement -- )
|
2008-02-22 18:06:00 -05:00
|
|
|
[ query-results [ sql-row ] with-disposal ] keep
|
|
|
|
statement-out-params rot [
|
|
|
|
>r [ sql-spec-type sql-type>factor-type ] keep
|
|
|
|
sql-spec-slot-name r> set-slot-named
|
|
|
|
] curry 2each ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: sql-props ( class -- columns table )
|
|
|
|
dup db-columns swap db-table ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: create-table ( class -- ) create-sql-statement execute-statement ;
|
|
|
|
: drop-table ( class -- ) drop-sql-statement execute-statement ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: insert-native ( tuple -- )
|
|
|
|
dup class <insert-native-statement>
|
2008-02-25 15:50:42 -05:00
|
|
|
[ bind-tuple ] 2keep insert-tuple* ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: insert-assigned ( tuple -- )
|
2008-02-25 15:50:42 -05:00
|
|
|
dup class <insert-assigned-statement>
|
2008-02-22 18:06:00 -05:00
|
|
|
[ bind-tuple ] keep execute-statement ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: insert-tuple ( tuple -- )
|
|
|
|
dup class db-columns find-primary-key assigned-id? [
|
|
|
|
insert-assigned
|
|
|
|
] [
|
|
|
|
insert-native
|
|
|
|
] if ;
|
2008-02-13 17:51:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: update-tuple ( tuple -- )
|
2008-02-24 13:32:36 -05:00
|
|
|
dup class <update-tuple-statement>
|
|
|
|
[ bind-tuple ] keep execute-statement ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
2008-02-22 18:06:00 -05:00
|
|
|
: update-tuples ( seq -- )
|
|
|
|
<update-tuples-statement> execute-statement ;
|
2008-02-11 14:39:43 -05:00
|
|
|
|
2008-02-25 15:50:42 -05:00
|
|
|
: persist ( tuple -- )
|
|
|
|
dup class db-columns find-primary-key ;
|
2008-02-11 00:11:16 -05:00
|
|
|
|
|
|
|
|
2008-02-24 20:23:14 -05:00
|
|
|
: setup-select ( tuple -- statement )
|
2008-02-22 18:06:00 -05:00
|
|
|
dup dup class <select-by-slots-statement>
|
2008-02-24 20:23:14 -05:00
|
|
|
[ bind-tuple ] keep ;
|
2008-02-24 13:32:36 -05:00
|
|
|
|
2008-02-24 20:23:14 -05:00
|
|
|
: select-tuples ( tuple -- tuple ) setup-select query-tuples ;
|
2008-02-25 15:50:42 -05:00
|
|
|
: select-tuple ( tuple -- tuple ) select-tuples first ;
|