tokyo.cabinet.abstract: Implement >alist, and correctly free memory returned by tokyo cabinet

db4
Bruno Deferrari 2009-06-17 09:15:53 -03:00
parent c331807cff
commit 5b58a7814e
2 changed files with 15 additions and 6 deletions

View File

@ -31,6 +31,7 @@ FUNCTION: void* tclistval ( TCLIST* list, int index, int* sp ) ;
FUNCTION: char* tclistval2 ( TCLIST* list, int index ) ; FUNCTION: char* tclistval2 ( TCLIST* list, int index ) ;
FUNCTION: void tclistpush ( TCLIST* list, void* ptr, int size ) ; FUNCTION: void tclistpush ( TCLIST* list, void* ptr, int size ) ;
FUNCTION: void tclistpush2 ( TCLIST* list, char* str ) ; FUNCTION: void tclistpush2 ( TCLIST* list, char* str ) ;
FUNCTION: void tcfree ( void* ptr ) ;
TYPEDEF: void* TCCMP TYPEDEF: void* TCCMP
TYPEDEF: void* TCCODEC TYPEDEF: void* TCCODEC

View File

@ -1,7 +1,7 @@
! Copyright (C) 2009 Bruno Deferrari ! Copyright (C) 2009 Bruno Deferrari
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types assocs destructors kernel libc locals USING: accessors alien.c-types arrays assocs destructors kernel libc locals
sequences serialize tokyo.alien.tcadb ; sequences serialize tokyo.alien.tcadb tokyo.alien.tcutil vectors ;
IN: tokyo.cabinet.abstract IN: tokyo.cabinet.abstract
TUPLE: tokyo-abstractdb handle disposed ; TUPLE: tokyo-abstractdb handle disposed ;
@ -21,14 +21,22 @@ M:: tokyo-abstractdb at* ( key db -- value/f ? )
kbytes length :> key-size kbytes length :> key-size
handle kbytes key-size sizeout tcadbget :> output handle kbytes key-size sizeout tcadbget :> output
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* ; ] [ f f ] if* ;
M: tokyo-abstractdb assoc-size ( db -- size ) handle>> tcadbrnum ; M: tokyo-abstractdb assoc-size ( db -- size ) handle>> tcadbrnum ;
! FIXME: implement ! FIXME: make this nicer
! M: tokyo-abstractdb >alist ( db -- alist ) M:: tokyo-abstractdb >alist ( db -- alist )
! handle>> ; db handle>> :> handle
0 <int> :> size-out
db assoc-size <vector> :> 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 -- ) M:: tokyo-abstractdb set-at ( value key db -- )
db handle>> :> handle db handle>> :> handle