]> gitweb.factorcode.org Git - factor.git/commitdiff
tokyo.remotedb: Remote database using Tokyo Tyrant
authorBruno Deferrari <utizoc@gmail.com>
Wed, 17 Jun 2009 23:24:04 +0000 (20:24 -0300)
committerBruno Deferrari <utizoc@gmail.com>
Wed, 17 Jun 2009 23:24:04 +0000 (20:24 -0300)
extra/tokyo/remotedb/authors.txt [new file with mode: 0644]
extra/tokyo/remotedb/remotedb.factor [new file with mode: 0644]
extra/tokyo/remotedb/summary.txt [new file with mode: 0644]

diff --git a/extra/tokyo/remotedb/authors.txt b/extra/tokyo/remotedb/authors.txt
new file mode 100644 (file)
index 0000000..f4a8cb1
--- /dev/null
@@ -0,0 +1 @@
+Bruno Deferrari
diff --git a/extra/tokyo/remotedb/remotedb.factor b/extra/tokyo/remotedb/remotedb.factor
new file mode 100644 (file)
index 0000000..2ccf41a
--- /dev/null
@@ -0,0 +1,60 @@
+! Copyright (C) 2009 Bruno Deferrari
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types arrays assocs destructors
+kernel locals sequences serialize vectors
+tokyo.alien.tcrdb tokyo.alien.tcutil tokyo.utils ;
+IN: tokyo.remotedb
+
+TUPLE: tokyo-remotedb handle disposed ;
+
+INSTANCE: tokyo-remotedb assoc
+
+: <tokyo-remotedb> ( host port -- tokyo-remotedb )
+    [ tcrdbnew dup ] 2dip tcrdbopen drop
+    tokyo-remotedb new [ (>>handle) ] keep ;
+
+M: tokyo-remotedb dispose* [ tcrdbdel f ] change-handle drop ;
+
+M:: tokyo-remotedb at* ( key db -- value/f ? )
+    0 <int>          :> sizeout
+    db handle>>      :> handle
+    key object>bytes :> kbytes
+    kbytes length    :> key-size
+    handle kbytes key-size sizeout tcrdbget :> output
+    output [
+        [ memory>object ] [ tcfree ] bi t
+    ] [ f f ] if* ;
+
+M: tokyo-remotedb assoc-size ( db -- size ) handle>> tcrdbrnum ;
+
+! FIXME: make this nicer
+M:: tokyo-remotedb >alist ( db -- alist )
+    db handle>>            :> handle
+    0 <int>                :> size-out
+    db assoc-size <vector> :> keys
+    handle tcrdbiterinit drop
+    [ handle size-out tcrdbiternext dup ] [
+        [ memory>object ] [ tcfree ] bi
+        keys push
+    ] while drop
+    keys [ dup db at 2array ] { } map-as ;
+
+M:: tokyo-remotedb set-at ( value key db -- )
+    db handle>>        :> handle
+    key object>bytes   :> kbytes
+    kbytes length      :> key-size
+    value object>bytes :> vbytes
+    vbytes length      :> value-size
+    handle kbytes key-size vbytes value-size tcrdbput drop ;
+
+M:: tokyo-remotedb delete-at ( key db -- )
+    db handle>>      :> handle
+    key object>bytes :> kbytes
+    kbytes length    :> key-size
+    handle kbytes key-size tcrdbout drop ;
+
+M: tokyo-remotedb clear-assoc ( db -- ) handle>> tcrdbvanish drop ;
+
+M: tokyo-remotedb equal? assoc= ;
+
+M: tokyo-remotedb hashcode* assoc-hashcode ;
diff --git a/extra/tokyo/remotedb/summary.txt b/extra/tokyo/remotedb/summary.txt
new file mode 100644 (file)
index 0000000..ef5b9af
--- /dev/null
@@ -0,0 +1 @@
+Higher level API for Tokyo Tyrant's Remote database API. Implements the associative protocol.