Changeset 24295 for lang/scheme
- Timestamp:
- 11/19/08 19:12:38 (7 weeks ago)
- Location:
- lang/scheme/gauche-tokyocabinet/trunk
- Files:
-
- 8 modified
-
DIST (modified) (1 diff)
-
DIST_EXCLUDE_X (modified) (1 diff)
-
configure.ac (modified) (1 diff)
-
dbm/tokyocabinet.scm (modified) (11 diffs)
-
test.scm (modified) (1 diff)
-
tokyocabinet.c (modified) (11 diffs)
-
tokyocabinet.h (modified) (6 diffs)
-
tokyocabinetlib.stub (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/scheme/gauche-tokyocabinet/trunk/DIST
r10453 r24295 32 32 echo DIST > DIST_EXCLUDE_X 33 33 echo DIST_EXCLUDE_X >> DIST_EXCLUDE_X 34 echo .svn >> DIST_EXCLUDE_X 34 35 if [ -f DIST_EXCLUDE ]; then cat DIST_EXCLUDE >> DIST_EXCLUDE_X; fi 35 36 find . -name CVS -print -prune >> DIST_EXCLUDE_X -
lang/scheme/gauche-tokyocabinet/trunk/DIST_EXCLUDE_X
r10453 r24295 1 1 DIST 2 2 DIST_EXCLUDE_X 3 .svn -
lang/scheme/gauche-tokyocabinet/trunk/configure.ac
r10542 r24295 6 6 7 7 AC_PREREQ(2.54) 8 AC_INIT(Gauche-tokyocabinet, 0. 1, y.hayamizu@gmail.com)8 AC_INIT(Gauche-tokyocabinet, 0.2, y.hayamizu@gmail.com) 9 9 dnl If you want to use the system name (OS, architecture, etc) in the 10 10 dnl configure, uncomment the following line. In such a case, you need -
lang/scheme/gauche-tokyocabinet/trunk/dbm/tokyocabinet.scm
r10538 r24295 5 5 (define-module dbm.tokyocabinet 6 6 (extend dbm) 7 (export <tcbdb> 7 (export <tcbdb> <tchdb> 8 8 9 9 ;; low level interface … … 11 11 tcbdb-open tcbdb-close 12 12 tcbdb-put2 tcbdb-get2 tcbdb-out2 13 14 tchdb-new tchdb-ecode 15 tchdb-open tchdb-close 16 tchdb-put2 tchdb-get2 tchdb-out2 17 18 ;; B+ tree specific API 13 19 tcbdbcur-new 14 20 tcbdbcur-first tcbdbcur-last 15 21 tcbdbcur-prev tcbdbcur-next 16 22 tcbdbcur-key2 tcbdbcur-val2 17 tcbdb-fold tcbdb-map tcbdb-for-each 18 23 24 ;; Hash specific API 25 tchdb-iterinit 26 tchdb-iternext2 tchdb-iternext3 27 19 28 |BDBOREADER| |BDBOWRITER| |BDBOCREAT| 20 29 |BDBOTRUNC| |BDBONOLCK| |BDBOLCKNB| 21 30 31 |HDBOREADER| |HDBOWRITER| |HDBOCREAT| 32 |HDBOTRUNC| |HDBONOLCK| |HDBOLCKNB| 33 22 34 |TCESUCCESS| |TCETHREAD| |TCEINVALID| 23 35 |TCENOFILE| |TCENOPERM| |TCEMETA| … … 37 49 (define-class <tcbdb-meta> (<dbm-meta>) 38 50 ()) 51 (define-class <tchdb-meta> (<dbm-meta>) 52 ()) 39 53 40 54 (define-class <tcbdb> (<dbm>) … … 43 57 (nolock :init-keyword :nolock :initform #f)) 44 58 :metaclass <tcbdb-meta>) 45 46 ;;; 47 ;;; low level interfaces 48 ;;; 49 50 (define (tcbdb-fold bdb proc knil) 51 (let1 cur (tcbdbcur-new bdb) 52 (if (not (tcbdbcur-first cur)) 53 knil 54 (let loop((continue? #t) (ret knil)) 55 (if (not continue?) 56 ret 57 (let1 newret (proc (tcbdbcur-key2 cur) (tcbdbcur-val2 cur) ret) 58 (loop (tcbdbcur-next cur) newret))))))) 59 60 (define (tcbdb-map bdb proc) 61 (reverse (tcbdb-fold bdb 62 (lambda (key val kdr) 63 (cons (proc key val) kdr)) 64 ()))) 65 66 (define (tcbdb-for-each bdb proc) 67 (tcbdb-fold bdb 68 (lambda (key val kdr) 69 (proc key val)) 70 ()) 71 (begin)) 59 (define-class <tchdb> (<dbm>) 60 ((raw-tchdb :accessor raw-tchdb-of :initform #f) 61 (noblock-lock :init-keyword :noblock-lock :initform #f) 62 (nolock :init-keyword :nolock :initform #f)) 63 :metaclass <tchdb-meta>) 72 64 73 65 … … 80 72 self 81 73 (unless (slot-bound? self 'path) 82 (error "path must be s etto open TokyoCabinet BDB database"))74 (error "path must be specified in order to open TokyoCabinet BDB database")) 83 75 (when (raw-tcbdb-of self) 84 (error " gdbm~S already opened" self))76 (error "tcbdb ~S already opened" self)) 85 77 (let* ((path (slot-ref self 'path)) 86 78 (nolock (slot-ref self 'nolock)) … … 100 92 self))) 101 93 ) 94 (define-method dbm-open ((self <tchdb>)) 95 (next-method) 96 self 97 (unless (slot-bound? self 'path) 98 (error "path must be specified in order to open TokyoCabinet HDB database")) 99 (when (raw-tchdb-of self) 100 (error "tchdb ~S already opened" self)) 101 (let* ((path (slot-ref self 'path)) 102 (nolock (slot-ref self 'nolock)) 103 (noblock-lock (slot-ref self 'noblock-lock)) 104 (omode (case (slot-ref self 'rw-mode) 105 ((:read) |HDBOREADER|) 106 ((:write) (logior |HDBOCREAT| |HDBOWRITER| 107 (if nolock |HDBONOLCK| 0) 108 (if noblock-lock |HDBOLCKNB| 0))) 109 ((:create) (logior |HDBOWRITER| |HDBOTRUNC| |HDBOCREAT| 110 (if nolock |HDBONOLCK| 0) 111 (if noblock-lock |HDBOLCKNB| 0))))) 112 (raw-tchdb (tchdb-new))) 113 (and (tchdb-open raw-tchdb path omode) 114 (begin 115 (slot-set! self 'raw-tchdb raw-tchdb) 116 self))) 117 ) 102 118 103 119 (define-method dbm-close ((self <tcbdb>)) … … 106 122 (begin (slot-set! self 'raw-tcbdb #f) 107 123 #t)))) 124 (define-method dbm-close ((self <tchdb>)) 125 (let ((raw-tchdb (raw-tchdb-of self))) 126 (and raw-tchdb (tchdb-close raw-tchdb) 127 (begin (slot-set! self 'raw-tchdb #f) 128 #t)))) 108 129 109 130 (define-method dbm-closed? ((self <tcbdb>)) 110 131 (not (slot-ref self 'raw-tcbdb))) 132 (define-method dbm-closed? ((self <tchdb>)) 133 (not (slot-ref self 'raw-tchdb))) 111 134 112 135 (define-method dbm-put! ((self <tcbdb>) key value) … … 120 143 (error "tokyocabinet bdb: database is opened as read only") 121 144 #f))))) 145 (define-method dbm-put! ((self <tchdb>) key value) 146 (next-method) 147 (let ((key (%dbm-k2s self key)) 148 (value (%dbm-v2s self value))) 149 (let1 ret (tchdb-put2 (raw-tchdb-of self) key value) 150 (if ret 151 ret 152 (if (eq? :read (slot-ref self 'rw-mode)) 153 (error "tokyocabinet hdb: database is opened as read only") 154 #f))))) 122 155 123 156 (define-method dbm-get ((self <tcbdb>) key . args) … … 131 164 key self) 132 165 (car args)))))) 166 (define-method dbm-get ((self <tchdb>) key . args) 167 (next-method) 168 (let ((key (%dbm-k2s self key))) 169 (let1 ret (tchdb-get2 (raw-tchdb-of self) key) 170 (if ret 171 (%dbm-s2v self ret) 172 (if (null? args) 173 (errorf "tokyocabinet hdb: not data for key ~s in database ~s" 174 key self) 175 (car args)))))) 133 176 134 177 (define-method dbm-exists? ((self <tcbdb>) key) 135 178 (and (tcbdb-get2 (raw-tcbdb-of self) (%dbm-k2s self key)) #t)) 179 (define-method dbm-exists? ((self <tchdb>) key) 180 (and (tchdb-get2 (raw-tchdb-of self) (%dbm-k2s self key)) #t)) 136 181 137 182 (define-method dbm-delete! ((self <tcbdb>) key) … … 139 184 (if (eq? :read (slot-ref self 'rw-mode)) 140 185 (error "tokyocabinet bdb: database is opened as read only") 186 #f))) 187 (define-method dbm-delete! ((self <tchdb>) key) 188 (or (tchdb-out2 (raw-tchdb-of self) (%dbm-k2s self key)) 189 (if (eq? :read (slot-ref self 'rw-mode)) 190 (error "tokyocabinet hdb: database is opened as read only") 141 191 #f))) 142 192 … … 153 203 ret) 154 204 (loop (tcbdbcur-next cur) newret))))))) 205 (define-method dbm-fold ((self <tchdb>) proc knil) 206 (let1 raw-hdb (raw-tchdb-of self) 207 (unless (tchdb-iterinit raw-hdb) 208 (error "tokyocabint hdb: iter init failed!")) 209 (let loop((continue? #t) (ret knil)) 210 (if (not continue?) 211 ret 212 (receive (cont? key val) 213 (tchdb-iternext3 raw-hdb) 214 (loop cont? 215 (proc (%dbm-s2k self key) 216 (%dbm-s2v self val) 217 ret))))))) 218 155 219 156 220 ;; Epilogue -
lang/scheme/gauche-tokyocabinet/trunk/test.scm
r10508 r24295 207 207 208 208 (full-test <tcbdb>) 209 (full-test <tchdb>) 209 210 210 211 ;; epilogue 211 212 (test-end) 212 213 213 214 215 216 -
lang/scheme/gauche-tokyocabinet/trunk/tokyocabinet.c
r10508 r24295 6 6 7 7 #define TCCALL(call) ((call) ? SCM_TRUE : SCM_FALSE) 8 9 /* 10 * The following function is a dummy one; replace it for 11 * your C function definitions. 12 */ 8 // #define DEBUG_GAUCHE_TOKYOCABINET 9 10 /* These variables are for temporary use. */ 11 static TCXSTR * xkey; 12 static TCXSTR * xvalue; 13 13 14 14 15 static void tcbdb_finalize(ScmObj obj, void *data) … … 17 18 tcbdbclose(bdb->bdb); 18 19 } 20 static void tchdb_finalize(ScmObj obj, void *data) 21 { 22 ScmRawTchdb *hdb = SCM_RAW_TCHDB(obj); 23 tchdbclose(hdb->hdb); 24 } 25 26 19 27 20 28 static void tcbdb_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx){ 21 29 Scm_Printf(out, "#<tcbdb-file>"); 22 30 } 31 static void tchdb_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx){ 32 Scm_Printf(out, "#<tchdb-file>"); 33 } 34 35 23 36 24 37 ScmObj test_tokyocabinet(void) … … 26 39 return SCM_MAKE_STR("tokyocabinet is working"); 27 40 } 41 42 28 43 29 44 ScmObj Scm_tcbdb_ecode(ScmRawTcbdb* bdb){ 30 45 return SCM_MAKE_INT(tcbdbecode(SCM_RAW_TCBDB(bdb)->bdb)); 31 46 } 47 ScmObj Scm_tchdb_ecode(ScmRawTchdb* hdb){ 48 return SCM_MAKE_INT(tchdbecode(SCM_RAW_TCHDB(hdb)->hdb)); 49 } 50 51 32 52 33 53 ScmObj Scm_tcbdb_new(void){ … … 38 58 return SCM_OBJ(ret); 39 59 } 60 ScmObj Scm_tchdb_new(void){ 61 ScmRawTchdb *ret = SCM_NEW(ScmRawTchdb); 62 SCM_SET_CLASS(ret, SCM_CLASS_RAW_TCHDB); 63 Scm_RegisterFinalizer(SCM_OBJ(ret), tchdb_finalize, NULL); 64 ret->hdb = tchdbnew(); 65 return SCM_OBJ(ret); 66 } 67 68 40 69 41 70 ScmObj Scm_tcbdb_open(ScmRawTcbdb* bdb, ScmString* path, int omode){ … … 44 73 , omode)); 45 74 } 75 ScmObj Scm_tchdb_open(ScmRawTchdb* hdb, ScmString* path, int omode){ 76 ScmObj ret = TCCALL(tchdbopen(hdb->hdb 77 , Scm_GetString(path) 78 , omode)); 79 } 80 81 46 82 47 83 ScmObj Scm_tcbdb_close(ScmRawTcbdb* bdb){ 48 84 return TCCALL(tcbdbclose(bdb->bdb)); 49 85 } 86 ScmObj Scm_tchdb_close(ScmRawTchdb* hdb){ 87 return TCCALL(tchdbclose(hdb->hdb)); 88 } 89 90 50 91 51 92 ScmObj Scm_tcbdb_put2(ScmRawTcbdb* bdb, ScmString* key, ScmString* val){ … … 54 95 , Scm_GetString(val))); 55 96 } 97 ScmObj Scm_tchdb_put2(ScmRawTchdb* hdb, ScmString* key, ScmString* val){ 98 return TCCALL(tchdbput2(hdb->hdb 99 , Scm_GetString(key) 100 , Scm_GetString(val))); 101 } 102 103 104 56 105 ScmObj Scm_tcbdb_get2(ScmRawTcbdb* bdb, ScmString* key){ 57 106 char * val = tcbdbget2(bdb->bdb … … 64 113 return ret; 65 114 } 115 ScmObj Scm_tchdb_get2(ScmRawTchdb* hdb, ScmString* key){ 116 char * val = tchdbget2(hdb->hdb 117 , Scm_GetString(key)); 118 if(val == NULL){ 119 return SCM_FALSE; 120 } 121 122 ScmObj ret = SCM_MAKE_STR(val); 123 return ret; 124 } 125 126 66 127 67 128 ScmObj Scm_tcbdb_out2(ScmRawTcbdb* bdb, ScmString* key){ … … 69 130 , Scm_GetString(key))); 70 131 } 71 132 ScmObj Scm_tchdb_out2(ScmRawTchdb* hdb, ScmString* key){ 133 return TCCALL(tchdbout2(hdb->hdb 134 , Scm_GetString(key))); 135 } 136 137 138 /* 139 B+ tree specific API from here 140 */ 72 141 static void tcbdbcur_finalize(ScmObj obj, void *data) 73 142 { … … 123 192 124 193 /* 194 B+ tree specific API until here 195 */ 196 197 198 /* 199 Hash specific API from here 200 */ 201 202 203 204 /* 205 Hash specific API until here 206 */ 207 208 extern ScmObj Scm_tchdb_iterinit(ScmRawTchdb* hdb){ 209 #ifdef DEBUG_GAUCHE_TOKYOCABINET 210 puts("Scm_tchdb_iterinit"); 211 #endif 212 return TCCALL(tchdbiterinit(hdb->hdb)); 213 } 214 215 extern ScmObj Scm_tchdb_iternext2(ScmRawTchdb* hdb){ 216 char * key = tchdbiternext2(hdb->hdb); 217 if (key == NULL){ 218 return SCM_FALSE; 219 } 220 221 /* 222 *key is newly malloced in tchdbiternext2, so 223 SCM_MAKE_STR is appropriate, because it does not 224 copy its argument (STM_MAKE_STR_COPYING does) 225 */ 226 return SCM_MAKE_STR(key); 227 } 228 229 230 231 extern ScmObj Scm_tchdb_iternext3(ScmRawTchdb* hdb){ 232 #ifdef DEBUG_GAUCHE_TOKYOCABINET 233 printf("Scm_tchdb_iternext3( 0x%x )", (uintptr_t) hdb); 234 #endif 235 ScmObj ret_iternext, key, val; 236 237 #ifdef DEBUG_GAUCHE_TOKYOCABINET 238 printf("call tchdbiternext3( 0x%x , 0x%x , 0x%x )" 239 , (uintptr_t) hdb->hdb 240 , (uintptr_t) xkey 241 , (uintptr_t) xvalue); 242 #endif 243 ret_iternext = TCCALL(tchdbiternext3(hdb->hdb, xkey, xvalue)); 244 key = SCM_MAKE_STR_COPYING(tcxstrptr(xkey)); 245 val = SCM_MAKE_STR_COPYING(tcxstrptr(xvalue)); 246 return Scm_Values3(ret_iternext, key, val); 247 } 248 249 250 251 /* 125 252 * Module initialization function. 126 253 */ … … 130 257 { 131 258 ScmModule *mod; 259 260 xkey = tcxstrnew(); 261 xvalue = tcxstrnew(); 132 262 133 263 /* Register this DSO to Gauche */ … … 137 267 mod = SCM_MODULE(SCM_FIND_MODULE("dbm.tokyocabinet", TRUE)); 138 268 Scm_InitStaticClass(&Scm_RawTcbdbClass, "<raw-tcbdb>", mod, NULL, 0); 269 Scm_InitStaticClass(&Scm_RawTchdbClass, "<raw-tchdb>", mod, NULL, 0); 139 270 140 271 /* Register stub-generated procedures */ -
lang/scheme/gauche-tokyocabinet/trunk/tokyocabinet.h
r10508 r24295 12 12 #include <tcutil.h> 13 13 #include <tcbdb.h> 14 #include <tchdb.h> 14 15 #include <stdlib.h> 15 16 #include <stdbool.h> 16 17 #include <stdint.h> 18 19 20 17 21 18 22 SCM_DECL_BEGIN … … 48 52 49 53 // (insert-class-decl "raw-tcbdb") 54 // (insert-class-decl "raw-tchdb") 50 55 SCM_CLASS_DECL(Scm_RawTcbdbClass); 56 SCM_CLASS_DECL(Scm_RawTchdbClass); 57 58 59 51 60 static void raw_tcbdb_print(ScmObj, ScmPort *, ScmWriteContext*); 61 static void raw_tchdb_print(ScmObj, ScmPort *, ScmWriteContext*); 62 63 52 64 53 65 #define SCM_CLASS_RAW_TCBDB (&Scm_RawTcbdbClass) 54 66 #define SCM_RAW_TCBDB(obj) ((ScmRawTcbdb*)obj) 55 67 #define SCM_RAW_TCBDB_P(obj) SCM_XTYPEP(obj, SCM_CLASS_RAW_TCBDB) 68 69 #define SCM_CLASS_RAW_TCHDB (&Scm_RawTchdbClass) 70 #define SCM_RAW_TCHDB(obj) ((ScmRawTchdb*)obj) 71 #define SCM_RAW_TCHDB_P(obj) SCM_XTYPEP(obj, SCM_CLASS_RAW_TCHDB) 72 73 56 74 57 75 typedef struct ScmRawTcbdbRec { … … 60 78 // write manually 61 79 } ScmRawTcbdb; 80 81 typedef struct ScmRawTchdbRec { 82 SCM_HEADER; 83 TCHDB* hdb; 84 // write manually 85 } ScmRawTchdb; 86 62 87 63 88 … … 77 102 78 103 104 79 105 static void tcbdb_finalize(ScmObj obj, void *data); 80 106 static void tcbdb_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx); 107 108 static void tchdb_finalize(ScmObj obj, void *data); 109 static void tchdb_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx); 110 111 81 112 82 113 extern ScmObj test_tokyocabinet(void); … … 88 119 extern ScmObj Scm_tcbdb_get2(ScmRawTcbdb* bdb, ScmString* key); 89 120 extern ScmObj Scm_tcbdb_out2(ScmRawTcbdb* bdb, ScmString* key); 121 122 extern ScmObj Scm_tchdb_ecode(ScmRawTchdb* bdb); 123 extern ScmObj Scm_tchdb_new(void); 124 extern ScmObj Scm_tchdb_open(ScmRawTchdb* bdb, ScmString* path, int omode); 125 extern ScmObj Scm_tchdb_close(ScmRawTchdb* bdb); 126 extern ScmObj Scm_tchdb_put2(ScmRawTchdb* bdb, ScmString* key, ScmString* val); 127 extern ScmObj Scm_tchdb_get2(ScmRawTchdb* bdb, ScmString* key); 128 extern ScmObj Scm_tchdb_out2(ScmRawTchdb* bdb, ScmString* key); 129 extern ScmObj Scm_tchdbcur_new(ScmRawTchdb* bdb); 130 131 132 133 /* B+ tree specific API */ 90 134 extern ScmObj Scm_tcbdbcur_new(ScmRawTcbdb* bdb); 91 135 extern ScmObj Scm_tcbdbcur_del(ScmTcbdbcur* cur); … … 97 141 extern ScmObj Scm_tcbdbcur_val2(ScmTcbdbcur* cur); 98 142 143 144 /* Hash specific API */ 145 extern ScmObj Scm_tchdb_iterinit(ScmRawTchdb* hdb); 146 extern ScmObj Scm_tchdb_iternext2(ScmRawTchdb* hdb); 147 extern ScmObj Scm_tchdb_iternext3(ScmRawTchdb* hdb); 148 149 99 150 /* Epilogue */ 100 151 SCM_DECL_END -
lang/scheme/gauche-tokyocabinet/trunk/tokyocabinetlib.stub
r10508 r24295 14 14 () 15 15 ()) 16 (define-cclass <raw-tchdb> "ScmRawTchdb*" "Scm_RawTchdbClass" 17 () 18 ()) 19 20 16 21 17 22 (define-cclass <tcbdbcur> "ScmTcbdbcur*" "Scm_TcbdbcurClass" … … 19 24 ()) 20 25 26 21 27 (define-cproc test-tokyocabinet () 22 28 (return "test_tokyocabinet")) 23 29 30 31 24 32 (define-cproc tcbdb-ecode (bdb::<raw-tcbdb>) 25 33 (return "Scm_tcbdb_ecode")) 34 (define-cproc tchdb-ecode (hdb::<raw-tchdb>) 35 (return "Scm_tchdb_ecode")) 36 37 26 38 27 39 (define-cproc tcbdb-new () 28 40 (call "Scm_tcbdb_new")) 41 (define-cproc tchdb-new () 42 (call "Scm_tchdb_new")) 43 29 44 30 45 (define-cproc tcbdb-open (bdb::<raw-tcbdb> … … 32 47 omode::<fixnum>) 33 48 (call "Scm_tcbdb_open")) 49 (define-cproc tchdb-open (hdb::<raw-tchdb> 50 path::<string> 51 omode::<fixnum>) 52 (call "Scm_tchdb_open")) 53 34 54 35 55 (define-cproc tcbdb-close (bdb::<raw-tcbdb>) 36 56 (call "Scm_tcbdb_close")) 57 (define-cproc tchdb-close (hdb::<raw-tchdb>) 58 (call "Scm_tchdb_close")) 59 37 60 38 61 (define-cproc tcbdb-put2 (bdb::<raw-tcbdb> … … 40 63 val::<string>) 41 64 (call "Scm_tcbdb_put2")) 65 (define-cproc tchdb-put2 (hdb::<raw-tchdb> 66 key::<string> 67 val::<string>) 68 (call "Scm_tchdb_put2")) 69 42 70 43 71 (define-cproc tcbdb-get2 (bdb::<raw-tcbdb> … … 45 73 46 74 (call "Scm_tcbdb_get2")) 75 (define-cproc tchdb-get2 (hdb::<raw-tchdb> 76 key::<string>) 77 78 (call "Scm_tchdb_get2")) 79 47 80 48 81 (define-cproc tcbdb-out2 (bdb::<raw-tcbdb> … … 50 83 51 84 (call "Scm_tcbdb_out2")) 85 (define-cproc tchdb-out2 (hdb::<raw-tchdb> 86 key::<string>) 52 87 88 (call "Scm_tchdb_out2")) 89 90 ;; B+ tree specific API 53 91 (define-cproc tcbdbcur-new (bdb::<raw-tcbdb>) 54 92 (call "Scm_tcbdbcur_new")) 55 56 93 (define-cproc tcbdbcur-first (cur::<tcbdbcur>) 57 94 (call "Scm_tcbdbcur_first")) 58 59 95 (define-cproc tcbdbcur-last (cur::<tcbdbcur>) 60 96 (call "Scm_tcbdbcur_last")) 61 62 97 (define-cproc tcbdbcur-prev (cur::<tcbdbcur>) 63 98 (call "Scm_tcbdbcur_prev")) 64 65 99 (define-cproc tcbdbcur-next (cur::<tcbdbcur>) 66 100 (call "Scm_tcbdbcur_next")) 67 68 101 (define-cproc tcbdbcur-key2 (cur::<tcbdbcur>) 69 102 (call "Scm_tcbdbcur_key2")) 70 71 103 (define-cproc tcbdbcur-val2 (cur::<tcbdbcur>) 72 104 (call "Scm_tcbdbcur_val2")) 105
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)