annotate src/database.c @ 177:6075d714658b r20-3b15

Import from CVS: tag r20-3b15
author cvs
date Mon, 13 Aug 2007 09:51:16 +0200
parents 8eaf7971accc
children 3d6bfa290dbd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Database access routines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 Copyright (C) 1996, William M. Perry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 /* Written by Bill Perry */
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
24 /* Hacked on by Martin Buchholz */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 #include <config.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 #include "lisp.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 #include <errno.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
30 #ifndef HAVE_DATABASE
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
31 #error database.c being compiled, but HAVE_DATABASE not defined!
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
32 #endif /* HAVE_DATABASE */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
33
157
6b37e6ddd302 Import from CVS: tag r20-3b5
cvs
parents: 151
diff changeset
34 #include "database.h" /* Our include file */
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
35
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 #ifdef HAVE_BERKELEY_DB
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
37 /* Work around Berkeley DB's use of int types which are defined
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
38 slightly differently in the not quite yet standard <inttypes.h>.
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
39 See db.h for details of why we're resorting to this... */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
40 #ifdef HAVE_INTTYPES_H
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
41 #define __BIT_TYPES_DEFINED__
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
42 #include <inttypes.h>
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
43 typedef uint8_t u_int8_t;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
44 typedef uint16_t u_int16_t;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
45 typedef uint32_t u_int32_t;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
46 #ifdef WE_DONT_NEED_QUADS
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
47 typedef uint64_t u_int64_t;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
48 #endif /* WE_DONT_NEED_QUADS */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
49 #endif /* HAVE_INTTYPES_H */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
50 #include DB_H_PATH /* Berkeley db's header file */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 Lisp_Object Qberkeley_db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 Lisp_Object Qhash;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 Lisp_Object Qbtree;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 Lisp_Object Qrecno;
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
55 #endif /* HAVE_BERKELEY_DB */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
56
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
57 #ifdef HAVE_DBM
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
58 #include <ndbm.h>
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
59 Lisp_Object Qdbm;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
60 #endif /* HAVE_DBM */
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
61
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
62 Lisp_Object Qdatabasep;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 typedef enum { DB_DBM, DB_BERKELEY, DB_UNKNOWN } XEMACS_DB_TYPE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 struct database_struct;
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
67 typedef struct database_struct database_struct;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
69 typedef struct
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 CONST char * (*get_subtype) (struct database_struct *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 CONST char * (*get_type) (struct database_struct *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 void * (*open_file) (CONST char *, Lisp_Object, int, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 Lisp_Object (*get) (struct database_struct *, Lisp_Object);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 int (*put) (struct database_struct *, Lisp_Object, Lisp_Object, Lisp_Object);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 int (*rem) (struct database_struct *, Lisp_Object);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 void (*map) (struct database_struct *, Lisp_Object);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 Lisp_Object (*get_lisp_type) (struct database_struct *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 void (*close) (struct database_struct *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 Lisp_Object (*last_error) (struct database_struct *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 } DB_FUNCS;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 struct database_struct
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 struct lcrecord_header header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 Lisp_Object fname;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 XEMACS_DB_TYPE type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 int mode;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
89 int access_;
94
1040fe1366ac Import from CVS: tag xemacs-20-0f2
cvs
parents: 70
diff changeset
90 int dberrno;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 void *db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 DB_FUNCS *funcs;
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
93 #ifdef MULE
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
94 Lisp_Object coding_system;
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
95 #endif
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 #define XDATABASE(x) XRECORD (x, database, struct database_struct)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 #define XSETDATABASE(x, p) XSETRECORD (x, p, database)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 #define DATABASEP(x) RECORDP (x, database)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 #define GC_DATABASEP(x) GC_RECORDP (x, database)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 #define CHECK_DATABASE(x) CHECK_RECORD (x, database)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 #define DATABASE_LIVE_P(x) (x->db_handle)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 static Lisp_Object mark_database (Lisp_Object, void (*) (Lisp_Object));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 static void print_database (Lisp_Object, Lisp_Object, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 static void finalize_database (void *, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 DEFINE_LRECORD_IMPLEMENTATION ("database", database,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 mark_database, print_database,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 finalize_database, 0, 0,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 struct database_struct);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 static struct database_struct *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 new_database (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 struct database_struct *dbase
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 = alloc_lcrecord (sizeof (struct database_struct), lrecord_database);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 dbase->fname = Qnil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 dbase->db_handle = NULL;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
120 dbase->access_ = 0;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 dbase->mode = 0;
94
1040fe1366ac Import from CVS: tag xemacs-20-0f2
cvs
parents: 70
diff changeset
122 dbase->dberrno = 0;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 dbase->type = DB_UNKNOWN;
149
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
124 #ifdef MULE
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
125 dbase->coding_system = Fget_coding_system (Qbinary);
538048ae2ab8 Import from CVS: tag r20-3b1
cvs
parents: 94
diff changeset
126 #endif
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
127 return dbase;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 mark_database (Lisp_Object obj, void (*markobj) (Lisp_Object))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 struct database_struct *dbase = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 ((markobj) (dbase->fname));
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
136 return Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 struct database_struct *dbase = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 char buf[200];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 if (print_readably)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 error ("printing unreadable object #<database 0x%x>", dbase->header.uid);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 CONST char *type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 CONST char *subtype;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 CONST char *perms;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 perms = (!dbase->db_handle) ? "closed" :
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
156 (dbase->access_ & O_WRONLY) ? "writeonly" :
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
157 (dbase->access_ & O_RDWR) ? "readwrite" : "readonly";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 type = dbase->funcs->get_type (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 subtype = dbase->funcs->get_subtype (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 sprintf (buf, "#<database %s (%s/%s/%s) 0x%x>",
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
163 XSTRING_DATA (dbase->fname), type, subtype, perms,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 dbase->header.uid);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 write_c_string (buf, printcharfun);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 finalize_database (void *header, int for_disksave)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 struct database_struct *db = (struct database_struct *) header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 if (for_disksave)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 Lisp_Object obj;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 XSETOBJ (obj, Lisp_Record, (void *) db);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 signal_simple_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 ("Can't dump an emacs containing window system objects", obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 db->funcs->close (db);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
185 DEFUN ("close-database", Fdatabase_close, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 Close database OBJ.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
187 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
188 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 db = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 if (DATABASE_LIVE_P (db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 db->funcs->close (db);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 signal_simple_error ("Attempting to access closed database", obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
199 return Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
202 DEFUN ("database-type", Fdatabase_type, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 Return the type of database OBJ.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
204 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
205 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 db = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 return db->funcs->get_lisp_type (db);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
214 DEFUN ("database-subtype", Fdatabase_subtype, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 Return the subtype of database OBJ, if any.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
216 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
217 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 db = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
224 return intern (db->funcs->get_subtype (db));
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
227 DEFUN ("database-live-p", Fdatabase_live_p, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 Return t iff OBJ is an active database, else nil.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
229 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
230 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 db = XDATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
236 return DATABASE_LIVE_P (db) ? Qt : Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
239 DEFUN ("database-file-name", Fdatabase_file_name, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 Return the filename associated with the database OBJ.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
241 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
242 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 db = XDATABASE (obj);
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
247 return db->fname;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
250 DEFUN ("databasep", Fdatabasep, 1, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 Return t iff OBJ is a database, else nil.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
252 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
253 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
255 return DATABASEP (obj) ? Qt : Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 #ifdef HAVE_DBM
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 dbm_map (struct database_struct *db, Lisp_Object func)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 datum keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 DBM *handle = (DBM *)db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 Lisp_Object key, val;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 for (keydatum = dbm_firstkey (handle);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 keydatum.dptr != NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 keydatum = dbm_nextkey (handle))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 valdatum = dbm_fetch (handle, keydatum);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 key = make_string ((unsigned char *) keydatum.dptr, keydatum.dsize);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 val = make_string ((unsigned char *) valdatum.dptr, valdatum.dsize);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 call2 (func, key, val);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 dbm_get (struct database_struct *db, Lisp_Object key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 datum keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 DBM *handle = (DBM *)db->db_handle;
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
282 keydatum.dptr = (char *) XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
283 keydatum.dsize = XSTRING_LENGTH (key);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 valdatum = dbm_fetch (handle, keydatum);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 return (valdatum.dptr
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 ? make_string ((unsigned char *) valdatum.dptr, valdatum.dsize)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 : Qnil);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 dbm_put (struct database_struct *db,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 Lisp_Object key,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 Lisp_Object val,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 Lisp_Object replace)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 DBM *handle = (DBM *)db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 datum keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
300 valdatum.dptr = (char *) XSTRING_DATA (val);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
301 valdatum.dsize = XSTRING_LENGTH (val);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
302 keydatum.dptr = (char *) XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
303 keydatum.dsize = XSTRING_LENGTH (key);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 return (!dbm_store (handle, keydatum, valdatum,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (NILP (replace)) ? DBM_INSERT : DBM_REPLACE));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 dbm_remove (struct database_struct *db, Lisp_Object key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 datum keydatum;
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
313 keydatum.dptr = (char *) XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
314 keydatum.dsize = XSTRING_LENGTH (key);
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
315 return dbm_delete (db->db_handle, keydatum);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 dbm_lisp_type (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
321 return Qdbm;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 static CONST char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 dbm_type (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
327 return "dbm";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 static CONST char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 dbm_subtype (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
333 return "nil";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 static void *
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
337 new_dbm_file (CONST char *file, Lisp_Object subtype, int access_, int mode)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 DBM *db = NULL;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
340 db = dbm_open ((char *) file, access_, mode);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 return (void *) db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 dbm_lasterr (struct database_struct *dbp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 {
151
59463afc5666 Import from CVS: tag r20-3b2
cvs
parents: 149
diff changeset
347 return lisp_strerror (dbp->dberrno);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 dbm_closeit (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 if (db->db_handle)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 dbm_close ((DBM *)db->db_handle);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 db->db_handle = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 static DB_FUNCS ndbm_func_block =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 dbm_subtype,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 dbm_type,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 new_dbm_file,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 dbm_get,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 dbm_put,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 dbm_remove,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 dbm_map,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 dbm_lisp_type,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 dbm_closeit,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 dbm_lasterr
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 #ifdef HAVE_BERKELEY_DB
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 berkdb_lisp_type (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
377 return Qberkeley_db;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 static CONST char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 berkdb_type (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
383 return "berkeley";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 static CONST char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 berkdb_subtype (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 DB *temp = (DB *)db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 if (!temp)
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
392 return "nil";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394 switch (temp->type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 case DB_BTREE:
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
397 return "btree";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 case DB_HASH:
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
399 return "hash";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 case DB_RECNO:
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
401 return "recno";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 }
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
403 return "unknown";
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 static void *
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
407 berkdb_open (CONST char *file, Lisp_Object subtype, int access_, int mode)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 DB *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 DBTYPE real_subtype;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412 if (EQ (subtype, Qhash) || NILP (subtype))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413 real_subtype = DB_HASH;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 else if (EQ (subtype, Qbtree))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 real_subtype = DB_BTREE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 else if (EQ (subtype, Qrecno))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 real_subtype = DB_RECNO;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 signal_simple_error ("Unsupported subtype", subtype);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
421 db = dbopen (file, access_, mode, real_subtype, NULL);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 return (void *) db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 berkdb_lasterr (struct database_struct *dbp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 {
151
59463afc5666 Import from CVS: tag r20-3b2
cvs
parents: 149
diff changeset
429 return lisp_strerror (dbp->dberrno);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432 static Lisp_Object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433 berkdb_get (struct database_struct *db, Lisp_Object key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435 DBT keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436 DB *dbp = (DB *) db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 int status = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
439 keydatum.data = XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
440 keydatum.size = XSTRING_LENGTH (key);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 status = dbp->get (dbp, &keydatum, &valdatum, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 if (!status)
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
445 return make_string (valdatum.data, valdatum.size);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446
94
1040fe1366ac Import from CVS: tag xemacs-20-0f2
cvs
parents: 70
diff changeset
447 db->dberrno = (status == 1) ? -1 : errno;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
448 return Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 berkdb_put (struct database_struct *db,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 Lisp_Object key,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 Lisp_Object val,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 Lisp_Object replace)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 DBT keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458 DB *dbp = (DB *) db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 int status = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
461 keydatum.data = XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
462 keydatum.size = XSTRING_LENGTH (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
463 valdatum.data = XSTRING_DATA (val);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
464 valdatum.size = XSTRING_LENGTH (val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 status = dbp->put (dbp, &keydatum, &valdatum, NILP (replace)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 ? R_NOOVERWRITE : 0);
94
1040fe1366ac Import from CVS: tag xemacs-20-0f2
cvs
parents: 70
diff changeset
467 db->dberrno = (status == 1) ? -1 : errno;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 return status;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 berkdb_remove (struct database_struct *db, Lisp_Object key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474 DBT keydatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 DB *dbp = (DB *) db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476 int status;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
478 keydatum.data = XSTRING_DATA (key);
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
479 keydatum.size = XSTRING_LENGTH (key);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 status = dbp->del (dbp, &keydatum, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 if (!status)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484
94
1040fe1366ac Import from CVS: tag xemacs-20-0f2
cvs
parents: 70
diff changeset
485 db->dberrno = (status == 1) ? -1 : errno;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
486 return 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
487 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
488
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
489 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
490 berkdb_map (struct database_struct *db, Lisp_Object func)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
491 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
492 DBT keydatum, valdatum;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
493 Lisp_Object key, val;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
494 DB *dbp = (DB *) db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
495 int status;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
496
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
497 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
498 status == 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
499 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
500 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
501 key = make_string (keydatum.data, keydatum.size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
502 val = make_string (valdatum.data, valdatum.size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503 call2 (func, key, val);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508 berkdb_close (struct database_struct *db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510 DB *dbp = (DB *)db->db_handle;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511 if (dbp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 dbp->sync (dbp, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514 dbp->close (dbp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516 db->db_handle = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
517 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
518
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
519 static DB_FUNCS berk_func_block =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
520 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
521 berkdb_subtype,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
522 berkdb_type,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523 berkdb_open,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 berkdb_get,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525 berkdb_put,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526 berkdb_remove,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 berkdb_map,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528 berkdb_lisp_type,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529 berkdb_close,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 berkdb_lasterr
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
531 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
532 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
533
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
534 DEFUN ("database-last-error", Fdatabase_error, 0, 1, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
535 Return the last error associated with database OBJ.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
536 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
537 (obj))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
538 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
539 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
540
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
541 if (NILP (obj))
151
59463afc5666 Import from CVS: tag r20-3b2
cvs
parents: 149
diff changeset
542 return lisp_strerror (errno);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
543
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
544 CHECK_DATABASE (obj);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
545 db = XDATABASE (obj);
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
546 return db->funcs->last_error (db);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
547 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
548
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
549 DEFUN ("open-database", Fmake_database, 1, 5, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
550 Open database FILE, using database method TYPE and SUBTYPE, with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
551 access rights ACCESS and permissions MODE. ACCESS can be any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
552 combination of 'r' 'w' and '+', for read, write, and creation flags.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
553 */
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
554 (file, type, subtype, access_, mode))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
555 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
556 Lisp_Object retval = Qnil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
557 int modemask;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
558 int accessmask = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
559 XEMACS_DB_TYPE the_type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
560 DB_FUNCS *funcblock;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
561 struct database_struct *dbase = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
562 void *db = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
563
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents: 48
diff changeset
564 CHECK_STRING (file);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
565
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
566 if (NILP (access_))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
567 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
568 accessmask = O_RDWR | O_CREAT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
569 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
570 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
571 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
572 char *acc;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
573 CHECK_STRING (access_);
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
574 acc = (char *) XSTRING_DATA (access_);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
575
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
576 if (strchr (acc, '+'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
577 accessmask |= O_CREAT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
578
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
579 if (strchr (acc, 'r') && strchr (acc, 'w'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
580 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
581 accessmask |= O_RDWR;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
582 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
583 else if (strchr (acc, 'w'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
584 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
585 accessmask |= O_WRONLY;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
586 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
587 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
588 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
589 accessmask |= O_RDONLY;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
590 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
591 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
592
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
593 if (NILP (mode))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
594 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
595 modemask = 493; /* rwxr-xr-x */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
596 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
597 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
598 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
599 CHECK_INT (mode);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
600 modemask = XINT (mode);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
601 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
602
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
603 #ifdef HAVE_DBM
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
604 if (NILP (type) || EQ (type, Qdbm))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
605 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
606 the_type = DB_DBM;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
607 funcblock = &ndbm_func_block;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
608 goto db_done;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
609 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
610 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
611
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
612 #ifdef HAVE_BERKELEY_DB
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
613 if (NILP (type) || EQ (type, Qberkeley_db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
614 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
615
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
616 funcblock = &berk_func_block;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
617 the_type = DB_BERKELEY;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
618 goto db_done;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
619 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
620 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
621
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
622 signal_simple_error ("Unsupported database type", type);
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
623 return Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
624
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
625 db_done:
14
9ee227acff29 Import from CVS: tag r19-15b90
cvs
parents: 0
diff changeset
626 db = funcblock->open_file ((char *) XSTRING_DATA (file), subtype,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
627 accessmask, modemask);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
628
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
629 if (!db)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
630 {
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
631 return Qnil;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
632 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
633
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
634 dbase = new_database ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
635 dbase->fname = file;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
636 dbase->type = the_type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
637 dbase->mode = modemask;
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
638 dbase->access_ = accessmask;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
639 dbase->db_handle = db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
640 dbase->funcs = funcblock;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
641 XSETDATABASE (retval, dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
642
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
643 return retval;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
644 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
645
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
646 DEFUN ("put-database", Fputdatabase, 3, 4, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
647 Store KEY and VAL in DATABASE. If optinal fourth arg REPLACE is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
648 non-nil, replace any existing entry in the database.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
649 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
650 (key, val, dbase, replace))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
651 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
652 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
653 int status;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
654 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 173
diff changeset
655
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
656 CHECK_DATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
657 CHECK_STRING (key);
177
6075d714658b Import from CVS: tag r20-3b15
cvs
parents: 173
diff changeset
658 CHECK_STRING (val);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
659 db = XDATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
660 if (!DATABASE_LIVE_P (db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
661 signal_simple_error ("Attempting to access closed database", dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
662
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
663 GCPRO4 (key, val, dbase, replace);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
664 status = db->funcs->put (db, key, val, replace);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
665 UNGCPRO;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
666 return status ? Qt : Qnil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
667 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
668
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
669 DEFUN ("remove-database", Fremdatabase, 2, 2, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
670 Remove KEY from DATABASE.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
671 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
672 (key, dbase))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
673 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
674 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
675 CHECK_DATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
676 CHECK_STRING (key);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
677
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
678 db = XDATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
679 if (!DATABASE_LIVE_P (db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
680 signal_simple_error ("Attempting to access closed database", dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
681 return db->funcs->rem (db, key) ? Qt : Qnil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
682 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
683
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
684 DEFUN ("get-database", Fgetdatabase, 2, 3, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
685 Find value for KEY in DATABASE.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
686 If there is no corresponding value, return DEFAULT (defaults to nil).
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
687 */
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
688 (key, dbase, default_))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
689 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
690 Lisp_Object retval;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
691 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
692
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
693 CHECK_DATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
694 CHECK_STRING (key);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
695 db = XDATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
696 if (!DATABASE_LIVE_P (db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
697 signal_simple_error ("Attempting to access closed database", dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
698
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
699 retval = db->funcs->get (db, key);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
700
173
8eaf7971accc Import from CVS: tag r20-3b13
cvs
parents: 157
diff changeset
701 return NILP (retval) ? default_ : retval;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
702 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
703
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
704 DEFUN ("map-database", Fmapdatabase, 2, 2, 0, /*
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
705 Map FUNCTION over entries in DATABASE, calling it with two args,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
706 each key and value in the database.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
707 */
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
708 (function, dbase))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
709 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
710 struct gcpro gcpro1, gcpro2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
711 struct database_struct *db;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
712
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
713 CHECK_DATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
714 GCPRO2 (dbase, function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
715
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
716 db = XDATABASE (dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
717 if (!DATABASE_LIVE_P (db))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
718 signal_simple_error ("Attempting to access closed database", dbase);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
719 db->funcs->map (db, function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
720 UNGCPRO;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
721 return Qnil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
722 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
723
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
724 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
725 syms_of_dbm (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
726 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
727 defsymbol (&Qdatabasep, "databasep");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
728 #ifdef HAVE_DBM
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
729 defsymbol (&Qdbm, "dbm");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
730 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
731 #ifdef HAVE_BERKELEY_DB
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
732 defsymbol (&Qberkeley_db, "berkeley-db");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
733 defsymbol (&Qhash, "hash");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
734 defsymbol (&Qbtree, "btree");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
735 defsymbol (&Qrecno, "recno");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
736 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
737
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
738 DEFSUBR (Fmake_database);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
739 DEFSUBR (Fdatabasep);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
740 DEFSUBR (Fmapdatabase);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
741 DEFSUBR (Fputdatabase);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
742 DEFSUBR (Fgetdatabase);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
743 DEFSUBR (Fremdatabase);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
744 DEFSUBR (Fdatabase_type);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
745 DEFSUBR (Fdatabase_subtype);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
746 DEFSUBR (Fdatabase_error);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
747 DEFSUBR (Fdatabase_live_p);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
748 DEFSUBR (Fdatabase_file_name);
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents: 14
diff changeset
749 DEFSUBR (Fdatabase_close);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
750 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
751
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
752 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
753 vars_of_dbm (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
754 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
755 #ifdef HAVE_DBM
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
756 Fprovide (Qdbm);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
757 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
758 #ifdef HAVE_BERKELEY_DB
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
759 Fprovide (Qberkeley_db);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
760 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
761 }