From: Bruno Deferrari Date: Wed, 17 Jun 2009 12:15:53 +0000 (-0300) Subject: tokyo.cabinet.abstract: Implement >alist, and correctly free memory returned by tokyo... X-Git-Tag: 0.97~6105^2^2~7 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=5b58a7814e9c1fabc95fb3394b63c0a7e919d7d6 tokyo.cabinet.abstract: Implement >alist, and correctly free memory returned by tokyo cabinet --- diff --git a/extra/tokyo/alien/tcutil/tcutil.factor b/extra/tokyo/alien/tcutil/tcutil.factor index 910f14e67d..25df54d013 100644 --- a/extra/tokyo/alien/tcutil/tcutil.factor +++ b/extra/tokyo/alien/tcutil/tcutil.factor @@ -31,6 +31,7 @@ FUNCTION: void* tclistval ( TCLIST* list, int index, int* sp ) ; FUNCTION: char* tclistval2 ( TCLIST* list, int index ) ; FUNCTION: void tclistpush ( TCLIST* list, void* ptr, int size ) ; FUNCTION: void tclistpush2 ( TCLIST* list, char* str ) ; +FUNCTION: void tcfree ( void* ptr ) ; TYPEDEF: void* TCCMP TYPEDEF: void* TCCODEC diff --git a/extra/tokyo/cabinet/abstract/abstract.factor b/extra/tokyo/cabinet/abstract/abstract.factor index 6f3c5768b8..a6ce2408d9 100644 --- a/extra/tokyo/cabinet/abstract/abstract.factor +++ b/extra/tokyo/cabinet/abstract/abstract.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Bruno Deferrari ! See http://factorcode.org/license.txt for BSD license. -USING: accessors alien.c-types assocs destructors kernel libc locals -sequences serialize tokyo.alien.tcadb ; +USING: accessors alien.c-types arrays assocs destructors kernel libc locals +sequences serialize tokyo.alien.tcadb tokyo.alien.tcutil vectors ; IN: tokyo.cabinet.abstract TUPLE: tokyo-abstractdb handle disposed ; @@ -21,14 +21,22 @@ M:: tokyo-abstractdb at* ( key db -- value/f ? ) kbytes length :> key-size handle kbytes key-size sizeout tcadbget :> output output [ - [ sizeout *int memory>byte-array bytes>object t ] [ drop ] bi + [ sizeout *int memory>byte-array ] [ tcfree ] bi bytes>object t ] [ f f ] if* ; M: tokyo-abstractdb assoc-size ( db -- size ) handle>> tcadbrnum ; -! FIXME: implement -! M: tokyo-abstractdb >alist ( db -- alist ) -! handle>> ; +! FIXME: make this nicer +M:: tokyo-abstractdb >alist ( db -- alist ) + db handle>> :> handle + 0 :> size-out + db assoc-size :> keys + handle tcadbiterinit drop + [ handle size-out tcadbiternext dup ] [ + [ size-out *int memory>byte-array ] [ tcfree ] bi + bytes>object keys push + ] while drop + keys [ dup db at 2array ] { } map-as ; M:: tokyo-abstractdb set-at ( value key db -- ) db handle>> :> handle