(module lshift/bdb/bdb-ec (:database :database* (:search-key stomping-caching-search) (:search-key* stomping-caching-search) (:cursor call-with-cursor*) (:cursor+ call-with-cursor*) (:cursor* call-with-cursor*)) (import srfi-42) (import lshift/bdb/bdb) (import lshift/bdb/bdb-tuple) (import s2j) (define-generic-java-methods get-data set-data) (define-syntax :database (syntax-rules (index) ((:database cc k v (index i) db) (:cursor+ cc k v (index i) cursor-first!* cursor-next!* (open-cursor db '()))) ((:database cc k v db) (:cursor+ cc k v cursor-first!* cursor-next!* (open-cursor db '()))))) (define-syntax :database* (syntax-rules (index) ((:database* cc k v (index i) db) (:cursor* cc k v (index i) cursor-first!* cursor-next!* (open-cursor db '()))) ((:database* cc k v db) (:cursor* cc k v cursor-first!* cursor-next!* (open-cursor db '()))))) (define (stomping-caching-search key) (lambda (c result-key v) (set-data result-key (get-data key)) (cursor-search-key!* c result-key v))) (define-syntax :search-key (syntax-rules (index) ((:search-key cc v (index i) key0 db) (let ((firster (stomping-caching-search (scheme->database-entry key0)))) (:cursor+ cc dummy v (index i) firster cursor-next-dup!* (open-cursor db '())))) ((:search-key cc v key0 db) (let ((firster (stomping-caching-search (scheme->database-entry key0)))) (:cursor+ cc dummy v firster cursor-next-dup!* (open-cursor db '())))))) (define-syntax :search-key* (syntax-rules (index) ((:search-key* cc v (index i) key0 db) (let ((firster (stomping-caching-search key0))) (:cursor* cc dummy v (index i) firster cursor-next-dup!* (open-cursor db '())))) ((:search-key* cc v key0 db) (let ((firster (stomping-caching-search key0))) (:cursor* cc dummy v firster cursor-next-dup!* (open-cursor db '())))))) (define-syntax :cursor (syntax-rules (index) ((:cursor cc k v (index i) firster nexter cursor0) (:parallel cc (:cursor k v firster nexter cursor0) (:integers i))) ((:cursor cc k v firster nexter cursor0) (call-with-cursor* cursor0 (lambda (cursor) (:do cc (let ()) ((status (firster cursor))) status (let ((k (car status)) (v (cdr status)))) #t ((nexter cursor)))))))) (define-syntax :cursor+ (syntax-rules (index) ((:cursor+ cc k v (index i) firster nexter cursor0) (:parallel cc (:cursor+ k v firster nexter cursor0) (:integers i))) ((:cursor+ cc k v firster nexter cursor0) (call-with-cursor* cursor0 (lambda (cursor) (:do cc (let ((key (make-database-entry)) (data (make-database-entry)))) ((status (firster cursor key data))) (operation-status-success? status) (let ((k (database-entry->scheme key)) (v (database-entry->scheme data)))) #t ((nexter cursor key data)))))))) (define-syntax :cursor* (syntax-rules (index) ((:cursor* cc k v (index i) firster nexter cursor0) (:parallel cc (:cursor* k v firster nexter cursor0) (:integers i))) ((:cursor* cc k v firster nexter cursor0) (call-with-cursor* cursor0 (lambda (cursor) (:do cc (let ((k (make-database-entry)) (v (make-database-entry)))) ((status (firster cursor k v))) (operation-status-success? status) (let ()) #t ((nexter cursor k v)))))))) )