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 }