xref: /openbsd/lib/libcurses/tinfo/hashed_db.c (revision 73471bf0)
1 /* $OpenBSD: hashed_db.c,v 1.1 2010/01/12 23:22:06 nicm Exp $ */
2 
3 /****************************************************************************
4  * Copyright (c) 2006 Free Software Foundation, Inc.                        *
5  *                                                                          *
6  * Permission is hereby granted, free of charge, to any person obtaining a  *
7  * copy of this software and associated documentation files (the            *
8  * "Software"), to deal in the Software without restriction, including      *
9  * without limitation the rights to use, copy, modify, merge, publish,      *
10  * distribute, distribute with modifications, sublicense, and/or sell       *
11  * copies of the Software, and to permit persons to whom the Software is    *
12  * furnished to do so, subject to the following conditions:                 *
13  *                                                                          *
14  * The above copyright notice and this permission notice shall be included  *
15  * in all copies or substantial portions of the Software.                   *
16  *                                                                          *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24  *                                                                          *
25  * Except as contained in this notice, the name(s) of the above copyright   *
26  * holders shall not be used in advertising or otherwise to promote the     *
27  * sale, use or other dealings in this Software without prior written       *
28  * authorization.                                                           *
29  ****************************************************************************/
30 
31 /****************************************************************************
32  *  Author: Thomas E. Dickey                        2006                    *
33  ****************************************************************************/
34 
35 #include <curses.priv.h>
36 #include <tic.h>
37 #include <hashed_db.h>
38 
39 #if USE_HASHED_DB
40 
41 MODULE_ID("$Id: hashed_db.c,v 1.1 2010/01/12 23:22:06 nicm Exp $")
42 
43 #if HASHED_DB_API >= 2
44 static DBC *cursor;
45 #endif
46 
47 /*
48  * Open the database.
49  */
50 NCURSES_EXPORT(DB *)
51 _nc_db_open(const char *path, bool modify)
52 {
53     DB *result = 0;
54 
55 #if HASHED_DB_API >= 4
56     db_create(&result, NULL, 0);
57     result->open(result,
58 		 NULL,
59 		 path,
60 		 NULL,
61 		 DB_HASH,
62 		 modify ? DB_CREATE : DB_RDONLY,
63 		 0644);
64 #elif HASHED_DB_API >= 3
65     db_create(&result, NULL, 0);
66     result->open(result,
67 		 path,
68 		 NULL,
69 		 DB_HASH,
70 		 modify ? DB_CREATE : DB_RDONLY,
71 		 0644);
72 #elif HASHED_DB_API >= 2
73     int code;
74 
75     if ((code = db_open(path,
76 			DB_HASH,
77 			modify ? DB_CREATE : DB_RDONLY,
78 			0644,
79 			(DB_ENV *) 0,
80 			(DB_INFO *) 0,
81 			&result)) != 0) {
82 	T(("cannot open %s: %s", path, strerror(code)));
83 	result = 0;
84     } else {
85 	T(("opened %s", path));
86     }
87 #else
88     result = dbopen(path,
89 		    modify ? (O_CREAT | O_RDWR) : O_RDONLY,
90 		    0644,
91 		    DB_HASH,
92 		    NULL);
93     if (result != 0) {
94 	T(("opened %s", path));
95     }
96 #endif
97     return result;
98 }
99 
100 /*
101  * Close the database.  Do not attempt to use the 'db' handle after this call.
102  */
103 NCURSES_EXPORT(int)
104 _nc_db_close(DB * db)
105 {
106     int result;
107 
108 #if HASHED_DB_API >= 2
109     result = db->close(db, 0);
110 #else
111     result = db->close(db);
112 #endif
113     return result;
114 }
115 
116 /*
117  * Write a record to the database.
118  *
119  * Returns 0 on success.
120  *
121  * FIXME:  the FreeBSD cap_mkdb program assumes the database could have
122  * duplicates.  There appears to be no good reason for that (review/fix).
123  */
124 NCURSES_EXPORT(int)
125 _nc_db_put(DB * db, DBT * key, DBT * data)
126 {
127     int result;
128 #if HASHED_DB_API >= 2
129     /* remove any pre-existing value, since we do not want duplicates */
130     (void) db->del(db, NULL, key, 0);
131     result = db->put(db, NULL, key, data, DB_NOOVERWRITE);
132 #else
133     result = db->put(db, key, data, R_NOOVERWRITE);
134 #endif
135     return result;
136 }
137 
138 /*
139  * Read a record from the database.
140  *
141  * Returns 0 on success.
142  */
143 NCURSES_EXPORT(int)
144 _nc_db_get(DB * db, DBT * key, DBT * data)
145 {
146     int result;
147 
148     memset(data, 0, sizeof(*data));
149 #if HASHED_DB_API >= 2
150     result = db->get(db, NULL, key, data, 0);
151 #else
152     result = db->get(db, key, data, 0);
153 #endif
154     return result;
155 }
156 
157 /*
158  * Read the first record from the database, ignoring order.
159  *
160  * Returns 0 on success.
161  */
162 NCURSES_EXPORT(int)
163 _nc_db_first(DB * db, DBT * key, DBT * data)
164 {
165     int result;
166 
167     memset(key, 0, sizeof(*key));
168     memset(data, 0, sizeof(*data));
169 #if HASHED_DB_API >= 2
170     if ((result = db->cursor(db, NULL, &cursor, 0)) == 0) {
171 	result = cursor->c_get(cursor, key, data, DB_FIRST);
172     }
173 #else
174     result = db->seq(db, key, data, 0);
175 #endif
176     return result;
177 }
178 
179 /*
180  * Read the next record from the database, ignoring order.
181  *
182  * Returns 0 on success.
183  */
184 NCURSES_EXPORT(int)
185 _nc_db_next(DB * db, DBT * key, DBT * data)
186 {
187     int result;
188 
189 #if HASHED_DB_API >= 2
190     (void) db;
191     if (cursor != 0) {
192 	result = cursor->c_get(cursor, key, data, DB_NEXT);
193     } else {
194 	result = -1;
195     }
196 #else
197     result = db->seq(db, key, data, 0);
198 #endif
199     return result;
200 }
201 
202 /*
203  * Check if a record is a terminfo index record.  Index records are those that
204  * contain only an alias pointing to a list of aliases.
205  */
206 NCURSES_EXPORT(bool)
207 _nc_db_have_index(DBT * key, DBT * data, char **buffer, int *size)
208 {
209     bool result = FALSE;
210     int used = data->size - 1;
211     char *have = (char *) data->data;
212 
213     (void) key;
214     if (*have++ == 2) {
215 	result = TRUE;
216     }
217     /*
218      * Update params in any case for consistency with _nc_db_have_data().
219      */
220     *buffer = have;
221     *size = used;
222     return result;
223 }
224 
225 /*
226  * Check if a record is the terminfo data record.  Ignore index records, e.g.,
227  * those that contain only an alias pointing to a list of aliases.
228  */
229 NCURSES_EXPORT(bool)
230 _nc_db_have_data(DBT * key, DBT * data, char **buffer, int *size)
231 {
232     bool result = FALSE;
233     int used = data->size - 1;
234     char *have = (char *) data->data;
235 
236     if (*have++ == 0) {
237 	if (data->size > key->size
238 	    && IS_TIC_MAGIC(have)) {
239 	    result = TRUE;
240 	}
241     }
242     /*
243      * Update params in any case to make it simple to follow a index record
244      * to the data record.
245      */
246     *buffer = have;
247     *size = used;
248     return result;
249 }
250 
251 #else
252 
253 extern
254 NCURSES_EXPORT(void)
255 _nc_hashed_db(void);
256 
257 NCURSES_EXPORT(void)
258 _nc_hashed_db(void)
259 {
260 }
261 
262 #endif /* USE_HASHED_DB */
263