Mercurial > hg > xemacs-beta
comparison src/database.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | b8cc9ab3f761 |
children | 41dbb7a9d5f2 |
comparison
equal
deleted
inserted
replaced
411:12e008d41344 | 412:697ef44129c6 |
---|---|
51 #ifdef WE_DONT_NEED_QUADS | 51 #ifdef WE_DONT_NEED_QUADS |
52 typedef uint64_t u_int64_t; | 52 typedef uint64_t u_int64_t; |
53 #endif /* WE_DONT_NEED_QUADS */ | 53 #endif /* WE_DONT_NEED_QUADS */ |
54 #endif /* HAVE_INTTYPES_H */ | 54 #endif /* HAVE_INTTYPES_H */ |
55 #endif /* !(defined __GLIBC__ && __GLIBC_MINOR__ >= 1) */ | 55 #endif /* !(defined __GLIBC__ && __GLIBC_MINOR__ >= 1) */ |
56 #include DB_H_FILE /* Berkeley db's header file */ | 56 #include DB_H_PATH /* Berkeley db's header file */ |
57 #ifndef DB_VERSION_MAJOR | 57 #ifndef DB_VERSION_MAJOR |
58 # define DB_VERSION_MAJOR 1 | 58 # define DB_VERSION_MAJOR 1 |
59 #endif /* DB_VERSION_MAJOR */ | 59 #endif /* DB_VERSION_MAJOR */ |
60 Lisp_Object Qberkeley_db; | 60 Lisp_Object Qberkeley_db; |
61 Lisp_Object Qhash, Qbtree, Qrecno, Qunknown; | 61 Lisp_Object Qhash, Qbtree, Qrecno, Qunknown; |
72 We really need coding-system aliases. -- martin */ | 72 We really need coding-system aliases. -- martin */ |
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 | |
78 struct Lisp_Database; | |
79 typedef struct Lisp_Database Lisp_Database; | |
77 | 80 |
78 typedef struct | 81 typedef struct |
79 { | 82 { |
80 Lisp_Object (*get_subtype) (Lisp_Database *); | 83 Lisp_Object (*get_subtype) (Lisp_Database *); |
81 Lisp_Object (*get_type) (Lisp_Database *); | 84 Lisp_Object (*get_type) (Lisp_Database *); |
108 }; | 111 }; |
109 | 112 |
110 #define XDATABASE(x) XRECORD (x, database, Lisp_Database) | 113 #define XDATABASE(x) XRECORD (x, database, Lisp_Database) |
111 #define XSETDATABASE(x, p) XSETRECORD (x, p, database) | 114 #define XSETDATABASE(x, p) XSETRECORD (x, p, database) |
112 #define DATABASEP(x) RECORDP (x, database) | 115 #define DATABASEP(x) RECORDP (x, database) |
116 #define GC_DATABASEP(x) GC_RECORDP (x, database) | |
113 #define CHECK_DATABASE(x) CHECK_RECORD (x, database) | 117 #define CHECK_DATABASE(x) CHECK_RECORD (x, database) |
114 #define CONCHECK_DATABASE(x) CONCHECK_RECORD (x, database) | 118 #define CONCHECK_DATABASE(x) CONCHECK_RECORD (x, database) |
115 #define DATABASE_LIVE_P(x) (x->live_p) | 119 #define DATABASE_LIVE_P(x) (x->live_p) |
116 | 120 |
117 #define CHECK_LIVE_DATABASE(db) do { \ | 121 #define CHECK_LIVE_DATABASE(db) do { \ |
142 #endif | 146 #endif |
143 return db; | 147 return db; |
144 } | 148 } |
145 | 149 |
146 static Lisp_Object | 150 static Lisp_Object |
147 mark_database (Lisp_Object obj) | 151 mark_database (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
148 { | 152 { |
149 Lisp_Database *db = XDATABASE (obj); | 153 Lisp_Database *db = XDATABASE (obj); |
150 return db->fname; | 154 |
155 markobj (db->fname); | |
156 return Qnil; | |
151 } | 157 } |
152 | 158 |
153 static void | 159 static void |
154 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | 160 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) |
155 { | 161 { |
187 db->funcs->close (db); | 193 db->funcs->close (db); |
188 } | 194 } |
189 | 195 |
190 DEFINE_LRECORD_IMPLEMENTATION ("database", database, | 196 DEFINE_LRECORD_IMPLEMENTATION ("database", database, |
191 mark_database, print_database, | 197 mark_database, print_database, |
192 finalize_database, 0, 0, 0, | 198 finalize_database, 0, 0, |
193 Lisp_Database); | 199 Lisp_Database); |
194 | 200 |
195 DEFUN ("close-database", Fclose_database, 1, 1, 0, /* | 201 DEFUN ("close-database", Fclose_database, 1, 1, 0, /* |
196 Close database DATABASE. | 202 Close database DATABASE. |
197 */ | 203 */ |
484 #if DB_VERSION_MAJOR == 1 | 490 #if DB_VERSION_MAJOR == 1 |
485 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST); | 491 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST); |
486 status == 0; | 492 status == 0; |
487 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT)) | 493 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT)) |
488 { | 494 { |
489 /* #### Needs mule-izing */ | 495 /* ### Needs mule-izing */ |
490 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); | 496 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); |
491 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); | 497 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); |
492 call2 (func, key, val); | 498 call2 (func, key, val); |
493 } | 499 } |
494 #else | 500 #else |
497 | 503 |
498 #if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 | 504 #if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 |
499 status = dbp->cursor (dbp, NULL, &dbcp, 0); | 505 status = dbp->cursor (dbp, NULL, &dbcp, 0); |
500 #else | 506 #else |
501 status = dbp->cursor (dbp, NULL, &dbcp); | 507 status = dbp->cursor (dbp, NULL, &dbcp); |
502 #endif | 508 #endif |
503 for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); | 509 for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); |
504 status == 0; | 510 status == 0; |
505 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) | 511 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) |
506 { | 512 { |
507 /* #### Needs mule-izing */ | 513 /* ### Needs mule-izing */ |
508 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); | 514 key = make_string ((Bufbyte *) keydatum.data, keydatum.size); |
509 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); | 515 val = make_string ((Bufbyte *) valdatum.data, valdatum.size); |
510 call2 (func, key, val); | 516 call2 (func, key, val); |
511 } | 517 } |
512 dbcp->c_close (dbcp); | 518 dbcp->c_close (dbcp); |
576 CHECK_STRING (file); | 582 CHECK_STRING (file); |
577 GCPRO2 (file, access_); | 583 GCPRO2 (file, access_); |
578 file = Fexpand_file_name (file, Qnil); | 584 file = Fexpand_file_name (file, Qnil); |
579 UNGCPRO; | 585 UNGCPRO; |
580 | 586 |
581 TO_EXTERNAL_FORMAT (LISP_STRING, file, | 587 GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (XSTRING_DATA (file), filename); |
582 C_STRING_ALLOCA, filename, | |
583 Qfile_name); | |
584 | 588 |
585 if (NILP (access_)) | 589 if (NILP (access_)) |
586 { | 590 { |
587 accessmask = O_RDWR | O_CREAT; | 591 accessmask = O_RDWR | O_CREAT; |
588 } | 592 } |
757 } | 761 } |
758 | 762 |
759 void | 763 void |
760 syms_of_database (void) | 764 syms_of_database (void) |
761 { | 765 { |
762 INIT_LRECORD_IMPLEMENTATION (database); | |
763 | |
764 defsymbol (&Qdatabasep, "databasep"); | 766 defsymbol (&Qdatabasep, "databasep"); |
765 #ifdef HAVE_DBM | 767 #ifdef HAVE_DBM |
766 defsymbol (&Qdbm, "dbm"); | 768 defsymbol (&Qdbm, "dbm"); |
767 #endif | 769 #endif |
768 #ifdef HAVE_BERKELEY_DB | 770 #ifdef HAVE_BERKELEY_DB |