[gambit-list] Mnesia

Marc Feeley feeley at iro.umontreal.ca
Thu Jan 17 22:02:37 EST 2008


On 17-Jan-08, at 3:53 PM, Joe Hosteny wrote:

> Hi all,
>
> 	Apologies if this is the wrong place, but it is somewhat Termite
> specific.
>
> 	Has anyone taken a close look at Mnesia, to the point of considering
> doing something like it using Termite? I'm not necessarily thinking of
> an architectural clone, but perhaps something similarly geared towards
> horizontal scalability that has native code queries?

Can you refresh my memory concerning the features of Mnesia? ;)

If I recall correctly it is a "in RAM memory" database, and you can  
dump or restore the database to/from the filesystem.  Those operations  
are possible with Gambit's table datatype (hash tables) and the  
serialization/deserialization procedures.  Here's a simple example.

(define db (make-table))

(define (dump obj fn)
   (let ((v (object->u8vector obj)))
     (with-output-to-file
         fn
       (lambda ()
         (write-subu8vector v 0 (u8vector-length v))))))

(define (restore fn)
   (let ((x (call-with-input-file
                fn
              (lambda (p)
                (list->u8vector (read-all p read-u8))))))
     (u8vector->object x)))

(define-type hacker
   id: 1A673423-70D6-4922-92A6-0C2D43DA5CC6
   name
   language
   proc)

(table-set! db "Marc" (make-hacker "Marc" "Scheme" dump))
(table-set! db "James" (make-hacker "James" "Java" restore))
(table-set! db "Bjarne" (make-hacker "Bjarne" "C++" (lambda (x) x)))

(dump db "mydb")

(define db2 (restore "mydb"))

(define m (table-ref db2 "Marc"))

(pp (hacker-proc m)) ;; prints: (lambda (obj fn) (let ((v ...

Marc

P.S. While trying out this example I noticed a small bug in the  
deserialization of tables.  You'll need to get the latest patch from  
the Gambit repository for this to work properly.




More information about the Gambit-list mailing list