2009-01-23 00:53:08 -05:00
|
|
|
USING: accessors assocs classes fry kernel linked-assocs math mirrors
|
|
|
|
namespaces sequences strings vectors words bson.constants
|
2009-01-27 13:42:29 -05:00
|
|
|
continuations mongodb.tuple ;
|
2008-12-19 07:47:46 -05:00
|
|
|
|
|
|
|
IN: mongodb.persistent
|
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
SYMBOL: mdb-op-seq
|
2008-12-19 07:47:46 -05:00
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
GENERIC# tuple>assoc 1 ( tuple exemplar -- assoc )
|
2008-12-19 07:47:46 -05:00
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
: tuple>linked-assoc ( tuple -- linked-assoc )
|
|
|
|
<linked-hash> tuple>assoc ; inline
|
2008-12-19 07:47:46 -05:00
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
GENERIC# tuple>query 1 ( tuple examplar -- query-assoc )
|
2008-12-19 07:47:46 -05:00
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
DEFER: assoc>tuple
|
|
|
|
DEFER: create-mdb-command
|
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
CONSTANT: MDB_INFO "_mdb_info"
|
|
|
|
|
2009-02-01 11:40:52 -05:00
|
|
|
: <objref> ( tuple -- objref )
|
|
|
|
[ mdb-collection>> ] [ _id>> ] bi objref boa ; inline
|
2009-01-23 00:53:08 -05:00
|
|
|
|
|
|
|
: mdbinfo>tuple-class ( mdbinfo -- class )
|
|
|
|
[ first ] keep second lookup ; inline
|
|
|
|
|
|
|
|
: make-tuple ( assoc -- tuple )
|
|
|
|
[ MDB_INFO swap at mdbinfo>tuple-class new ] keep ! instance assoc
|
|
|
|
[ dup <mirror> [ keys ] keep ] dip ! instance array mirror assoc
|
|
|
|
'[ dup _ [ _ at assoc>tuple ] dip [ swap ] dip set-at ] each ;
|
|
|
|
|
|
|
|
: persistent-info ( tuple -- pinfo )
|
|
|
|
class V{ } clone tuck
|
|
|
|
[ [ name>> ] dip push ]
|
|
|
|
[ [ vocabulary>> ] dip push ] 2bi ; inline
|
|
|
|
|
|
|
|
: id-or-f? ( key value -- key value boolean )
|
|
|
|
over "_id" =
|
|
|
|
[ dup f = ] dip or ; inline
|
|
|
|
|
|
|
|
: write-persistent-info ( mirror exemplar assoc -- )
|
|
|
|
[ drop ] dip
|
|
|
|
2dup [ "_id" ] 2dip [ over [ at ] dip ] dip set-at
|
|
|
|
[ object>> persistent-info MDB_INFO ] dip set-at ;
|
|
|
|
|
|
|
|
: persistent-tuple? ( object -- object boolean )
|
|
|
|
dup mdb-persistent? ; inline
|
|
|
|
|
|
|
|
: ensure-value-ht ( key ht -- vht )
|
|
|
|
2dup key?
|
|
|
|
[ at ]
|
|
|
|
[ [ H{ } clone dup ] 2dip set-at ] if ; inline
|
|
|
|
|
|
|
|
: data-tuple? ( tuple -- ? )
|
|
|
|
dup tuple? [ assoc? [ f ] [ t ] if ] [ drop f ] if ;
|
|
|
|
|
|
|
|
: write-tuple-fields ( mirror exemplar assoc -- )
|
|
|
|
[ dup ] dip ! m e e a
|
|
|
|
'[ id-or-f?
|
|
|
|
[ 2drop ]
|
|
|
|
[ persistent-tuple?
|
|
|
|
[ _ keep
|
|
|
|
[ mdb-collection>> ] keep
|
|
|
|
[ create-mdb-command ] dip
|
2009-02-01 11:40:52 -05:00
|
|
|
<objref> ]
|
2009-01-23 00:53:08 -05:00
|
|
|
[ dup data-tuple? _ [ ] if ] if
|
|
|
|
swap _ set-at
|
|
|
|
] if
|
|
|
|
] assoc-each ;
|
|
|
|
|
|
|
|
: prepare-assoc ( tuple exemplar -- assoc mirror exemplar assoc )
|
|
|
|
[ <mirror> ] dip dup clone swap [ tuck ] dip swap ; inline
|
2008-12-19 07:47:46 -05:00
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
: ensure-mdb-info ( tuple -- tuple )
|
2009-02-01 11:40:52 -05:00
|
|
|
dup _id>> [ <objid> >>_id ] unless ; inline
|
2009-01-23 00:53:08 -05:00
|
|
|
|
|
|
|
: with-op-seq ( quot -- op-seq )
|
|
|
|
[
|
|
|
|
[ H{ } clone mdb-op-seq set ] dip call mdb-op-seq get
|
|
|
|
] with-scope ; inline
|
|
|
|
|
2008-12-19 07:47:46 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-01-23 00:53:08 -05:00
|
|
|
: create-mdb-command ( assoc ns -- )
|
|
|
|
mdb-op-seq get
|
|
|
|
ensure-value-ht
|
|
|
|
[ dup [ MDB_OID ] dip at ] dip
|
|
|
|
set-at ; inline
|
|
|
|
|
|
|
|
: prepare-store ( mdb-persistent -- op-seq )
|
|
|
|
'[ _ [ tuple>linked-assoc ] keep mdb-collection>> create-mdb-command ]
|
|
|
|
with-op-seq ; inline
|
|
|
|
|
|
|
|
M: mdb-persistent tuple>assoc ( tuple exemplar -- assoc )
|
|
|
|
[ ensure-mdb-info ] dip ! tuple exemplar
|
|
|
|
prepare-assoc
|
|
|
|
[ write-persistent-info ]
|
|
|
|
[ [ '[ _ tuple>assoc ] ] dip write-tuple-fields ] 3bi ;
|
|
|
|
|
|
|
|
M: tuple tuple>assoc ( tuple exemplar -- assoc )
|
|
|
|
[ drop persistent-info MDB_INFO ] 2keep
|
|
|
|
prepare-assoc [ '[ _ tuple>assoc ] ] write-tuple-fields
|
|
|
|
[ set-at ] keep ;
|
|
|
|
|
|
|
|
M: tuple tuple>query ( tuple examplar -- assoc )
|
|
|
|
prepare-assoc [ '[ _ tuple>query ] ] dip write-tuple-fields ;
|
|
|
|
|
|
|
|
: assoc>tuple ( assoc -- tuple )
|
|
|
|
dup assoc?
|
|
|
|
[ [ dup MDB_INFO swap key?
|
|
|
|
[ make-tuple ]
|
|
|
|
[ ] if ] [ drop ] recover
|
|
|
|
] [ ] if ; inline
|
|
|
|
|
|
|
|
|