Mercurial > hg > xemacs-beta
comparison src/database.c @ 398:74fd4e045ea6 r21-2-29
Import from CVS: tag r21-2-29
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:13:30 +0200 |
parents | 7d59cb494b73 |
children | a86b2b5e0111 |
comparison
equal
deleted
inserted
replaced
397:f4aeb21a5bad | 398:74fd4e045ea6 |
---|---|
73 Lisp_Object Vdatabase_coding_system; | 73 Lisp_Object Vdatabase_coding_system; |
74 #endif | 74 #endif |
75 | 75 |
76 Lisp_Object Qdatabasep; | 76 Lisp_Object Qdatabasep; |
77 | 77 |
78 struct Lisp_Database; | |
79 typedef struct Lisp_Database Lisp_Database; | |
80 | |
81 typedef struct | 78 typedef struct |
82 { | 79 { |
83 Lisp_Object (*get_subtype) (Lisp_Database *); | 80 Lisp_Object (*get_subtype) (Lisp_Database *); |
84 Lisp_Object (*get_type) (Lisp_Database *); | 81 Lisp_Object (*get_type) (Lisp_Database *); |
85 Lisp_Object (*get) (Lisp_Database *, Lisp_Object); | 82 Lisp_Object (*get) (Lisp_Database *, Lisp_Object); |
111 }; | 108 }; |
112 | 109 |
113 #define XDATABASE(x) XRECORD (x, database, Lisp_Database) | 110 #define XDATABASE(x) XRECORD (x, database, Lisp_Database) |
114 #define XSETDATABASE(x, p) XSETRECORD (x, p, database) | 111 #define XSETDATABASE(x, p) XSETRECORD (x, p, database) |
115 #define DATABASEP(x) RECORDP (x, database) | 112 #define DATABASEP(x) RECORDP (x, database) |
116 #define GC_DATABASEP(x) GC_RECORDP (x, database) | |
117 #define CHECK_DATABASE(x) CHECK_RECORD (x, database) | 113 #define CHECK_DATABASE(x) CHECK_RECORD (x, database) |
118 #define CONCHECK_DATABASE(x) CONCHECK_RECORD (x, database) | 114 #define CONCHECK_DATABASE(x) CONCHECK_RECORD (x, database) |
119 #define DATABASE_LIVE_P(x) (x->live_p) | 115 #define DATABASE_LIVE_P(x) (x->live_p) |
120 | 116 |
121 #define CHECK_LIVE_DATABASE(db) do { \ | 117 #define CHECK_LIVE_DATABASE(db) do { \ |
126 | 122 |
127 | 123 |
128 static Lisp_Database * | 124 static Lisp_Database * |
129 allocate_database (void) | 125 allocate_database (void) |
130 { | 126 { |
131 Lisp_Database *db = alloc_lcrecord_type (Lisp_Database, lrecord_database); | 127 Lisp_Database *db = alloc_lcrecord_type (Lisp_Database, &lrecord_database); |
132 | 128 |
133 db->fname = Qnil; | 129 db->fname = Qnil; |
134 db->live_p = 0; | 130 db->live_p = 0; |
135 #ifdef HAVE_BERKELEY_DB | 131 #ifdef HAVE_BERKELEY_DB |
136 db->db_handle = NULL; | 132 db->db_handle = NULL; |
146 #endif | 142 #endif |
147 return db; | 143 return db; |
148 } | 144 } |
149 | 145 |
150 static Lisp_Object | 146 static Lisp_Object |
151 mark_database (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 147 mark_database (Lisp_Object obj) |
152 { | 148 { |
153 Lisp_Database *db = XDATABASE (obj); | 149 Lisp_Database *db = XDATABASE (obj); |
154 | 150 return db->fname; |
155 markobj (db->fname); | |
156 return Qnil; | |
157 } | 151 } |
158 | 152 |
159 static void | 153 static void |
160 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | 154 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) |
161 { | 155 { |
193 db->funcs->close (db); | 187 db->funcs->close (db); |
194 } | 188 } |
195 | 189 |
196 DEFINE_LRECORD_IMPLEMENTATION ("database", database, | 190 DEFINE_LRECORD_IMPLEMENTATION ("database", database, |
197 mark_database, print_database, | 191 mark_database, print_database, |
198 finalize_database, 0, 0, | 192 finalize_database, 0, 0, 0, |
199 Lisp_Database); | 193 Lisp_Database); |
200 | 194 |
201 DEFUN ("close-database", Fclose_database, 1, 1, 0, /* | 195 DEFUN ("close-database", Fclose_database, 1, 1, 0, /* |
202 Close database DATABASE. | 196 Close database DATABASE. |
203 */ | 197 */ |
490 #if DB_VERSION_MAJOR == 1 | 484 #if DB_VERSION_MAJOR == 1 |
491 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST); | 485 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST); |
492 status == 0; | 486 status == 0; |
493 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT)) | 487 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT)) |
494 { | 488 { |
495 /* ### Needs mule-izing */ | 489 /* #### Needs mule-izing */ |
496 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); | 490 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); |
497 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); | 491 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); |
498 call2 (func, key, val); | 492 call2 (func, key, val); |
499 } | 493 } |
500 #else | 494 #else |
503 | 497 |
504 #if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 | 498 #if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 |
505 status = dbp->cursor (dbp, NULL, &dbcp, 0); | 499 status = dbp->cursor (dbp, NULL, &dbcp, 0); |
506 #else | 500 #else |
507 status = dbp->cursor (dbp, NULL, &dbcp); | 501 status = dbp->cursor (dbp, NULL, &dbcp); |
508 #endif | 502 #endif |
509 for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); | 503 for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); |
510 status == 0; | 504 status == 0; |
511 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) | 505 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) |
512 { | 506 { |
513 /* ### Needs mule-izing */ | 507 /* #### Needs mule-izing */ |
514 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); | 508 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); |
515 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); | 509 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); |
516 call2 (func, key, val); | 510 call2 (func, key, val); |
517 } | 511 } |
518 dbcp->c_close (dbcp); | 512 dbcp->c_close (dbcp); |
582 CHECK_STRING (file); | 576 CHECK_STRING (file); |
583 GCPRO2 (file, access_); | 577 GCPRO2 (file, access_); |
584 file = Fexpand_file_name (file, Qnil); | 578 file = Fexpand_file_name (file, Qnil); |
585 UNGCPRO; | 579 UNGCPRO; |
586 | 580 |
587 GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (XSTRING_DATA (file), filename); | 581 TO_EXTERNAL_FORMAT (LISP_STRING, file, |
582 C_STRING_ALLOCA, filename, | |
583 Qfile_name); | |
588 | 584 |
589 if (NILP (access_)) | 585 if (NILP (access_)) |
590 { | 586 { |
591 accessmask = O_RDWR | O_CREAT; | 587 accessmask = O_RDWR | O_CREAT; |
592 } | 588 } |