factor/mongodb/connection/connection.factor

66 lines
1.5 KiB
Factor

USING: accessors assocs fry io.sockets kernel math mongodb.msg
namespaces sequences splitting math.parser io.encodings.binary ;
IN: mongodb.connection
TUPLE: mdb-node master? inet ;
TUPLE: mdb name nodes collections ;
: mdb>> ( -- mdb )
mdb get ; inline
: with-db ( mdb quot -- ... )
'[ _ mdb set _ call ] with-scope ;
: master>> ( mdb -- inet )
nodes>> [ t ] dip at inet>> ;
: slave>> ( mdb -- inet )
nodes>> [ f ] dip at inet>> ;
<PRIVATE
: ismaster-cmd ( node -- result )
binary "admin.$cmd" H{ { "ismaster" 1 } } <mdb-query-one-msg>
'[ _ write-message read-message ] with-client
objects>> first ;
: split-host-str ( hoststr -- host port )
":" split [ first ] keep
second string>number ; inline
: eval-ismaster-result ( node result -- node result )
[ [ "ismaster" ] dip at
>fixnum 1 =
[ t >>master? ] [ f >>master? ] if ] keep ;
: check-node ( node -- node remote )
dup inet>> ismaster-cmd
eval-ismaster-result
[ "remote" ] dip at ;
: check-nodes ( node -- nodelist )
check-node
[ V{ } clone [ push ] keep ] dip
[ split-host-str <inet> [ f ] dip
mdb-node boa check-node drop
swap tuck push
] when* ;
: verify-nodes ( -- )
mdb>> nodes>> [ t ] dip at
check-nodes
H{ } clone tuck
'[ dup master?>> _ set-at ] each
[ mdb>> ] dip >>nodes drop ;
PRIVATE>
: (<mdb>) ( db host port -- mdb )
[ f ] 2dip <inet> mdb-node boa
check-nodes
H{ } clone tuck
'[ dup master?>> _ set-at ] each
H{ } clone mdb boa ;