GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcurses/tinfo/hashed_db.c Lines: 0 0 0.0 %
Date: 2017-11-13 Branches: 0 0 0.0 %

Line Branch Exec Source
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 */