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