00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #include "db_config.h"
00046
00047 #ifndef NO_SYSTEM_INCLUDES
00048 #include <sys/types.h>
00049
00050 #include <fcntl.h>
00051 #include <string.h>
00052 #endif
00053
00054 #define DB_DBM_HSEARCH 1
00055 #include "db_int.h"
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 static DBM *__cur_db;
00091
00092 static void __db_no_open __P((void));
00093
00094 int
00095 __db_dbm_init(file)
00096 char *file;
00097 {
00098 if (__cur_db != NULL)
00099 dbm_close(__cur_db);
00100 if ((__cur_db =
00101 dbm_open(file, O_CREAT | O_RDWR, __db_omode(OWNER_RW))) != NULL)
00102 return (0);
00103 if ((__cur_db = dbm_open(file, O_RDONLY, 0)) != NULL)
00104 return (0);
00105 return (-1);
00106 }
00107
00108 int
00109 __db_dbm_close()
00110 {
00111 if (__cur_db != NULL) {
00112 dbm_close(__cur_db);
00113 __cur_db = NULL;
00114 }
00115 return (0);
00116 }
00117
00118 datum
00119 __db_dbm_fetch(key)
00120 datum key;
00121 {
00122 datum item;
00123
00124 if (__cur_db == NULL) {
00125 __db_no_open();
00126 item.dptr = NULL;
00127 item.dsize = 0;
00128 return (item);
00129 }
00130 return (dbm_fetch(__cur_db, key));
00131 }
00132
00133 datum
00134 __db_dbm_firstkey()
00135 {
00136 datum item;
00137
00138 if (__cur_db == NULL) {
00139 __db_no_open();
00140 item.dptr = NULL;
00141 item.dsize = 0;
00142 return (item);
00143 }
00144 return (dbm_firstkey(__cur_db));
00145 }
00146
00147 datum
00148 __db_dbm_nextkey(key)
00149 datum key;
00150 {
00151 datum item;
00152
00153 COMPQUIET(key.dsize, 0);
00154
00155 if (__cur_db == NULL) {
00156 __db_no_open();
00157 item.dptr = NULL;
00158 item.dsize = 0;
00159 return (item);
00160 }
00161 return (dbm_nextkey(__cur_db));
00162 }
00163
00164 int
00165 __db_dbm_delete(key)
00166 datum key;
00167 {
00168 if (__cur_db == NULL) {
00169 __db_no_open();
00170 return (-1);
00171 }
00172 return (dbm_delete(__cur_db, key));
00173 }
00174
00175 int
00176 __db_dbm_store(key, dat)
00177 datum key, dat;
00178 {
00179 if (__cur_db == NULL) {
00180 __db_no_open();
00181 return (-1);
00182 }
00183 return (dbm_store(__cur_db, key, dat, DBM_REPLACE));
00184 }
00185
00186 static void
00187 __db_no_open()
00188 {
00189 (void)fprintf(stderr, "dbm: no open database.\n");
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 DBM *
00203 __db_ndbm_open(file, oflags, mode)
00204 const char *file;
00205 int oflags, mode;
00206 {
00207 DB *dbp;
00208 DBC *dbc;
00209 int ret;
00210 char path[MAXPATHLEN];
00211
00212
00213
00214
00215
00216
00217
00218 if (strlen(file) + strlen(DBM_SUFFIX) + 1 > sizeof(path)) {
00219 __os_set_errno(ENAMETOOLONG);
00220 return (NULL);
00221 }
00222 (void)strcpy(path, file);
00223 (void)strcat(path, DBM_SUFFIX);
00224 if ((ret = db_create(&dbp, NULL, 0)) != 0) {
00225 __os_set_errno(ret);
00226 return (NULL);
00227 }
00228
00229
00230
00231
00232
00233 if (oflags & O_WRONLY) {
00234 oflags &= ~O_WRONLY;
00235 oflags |= O_RDWR;
00236 }
00237
00238 if ((ret = dbp->set_pagesize(dbp, 4096)) != 0 ||
00239 (ret = dbp->set_h_ffactor(dbp, 40)) != 0 ||
00240 (ret = dbp->set_h_nelem(dbp, 1)) != 0 ||
00241 (ret = dbp->open(dbp, NULL,
00242 path, NULL, DB_HASH, __db_oflags(oflags), mode)) != 0) {
00243 __os_set_errno(ret);
00244 return (NULL);
00245 }
00246
00247 if ((ret = dbp->cursor(dbp, NULL, &dbc, 0)) != 0) {
00248 (void)dbp->close(dbp, 0);
00249 __os_set_errno(ret);
00250 return (NULL);
00251 }
00252
00253 return ((DBM *)dbc);
00254 }
00255
00256
00257
00258
00259
00260 void
00261 __db_ndbm_close(dbm)
00262 DBM *dbm;
00263 {
00264 DBC *dbc;
00265
00266 dbc = (DBC *)dbm;
00267
00268 (void)dbc->dbp->close(dbc->dbp, 0);
00269 }
00270
00271
00272
00273
00274
00275
00276 datum
00277 __db_ndbm_fetch(dbm, key)
00278 DBM *dbm;
00279 datum key;
00280 {
00281 DBC *dbc;
00282 DBT _key, _data;
00283 datum data;
00284 int ret;
00285
00286 dbc = (DBC *)dbm;
00287
00288 memset(&_key, 0, sizeof(DBT));
00289 memset(&_data, 0, sizeof(DBT));
00290 _key.size = (u_int32_t)key.dsize;
00291 _key.data = key.dptr;
00292
00293
00294
00295
00296
00297
00298 if ((ret = dbc->dbp->get(dbc->dbp, NULL, &_key, &_data, 0)) == 0) {
00299 data.dptr = _data.data;
00300 data.dsize = (int)_data.size;
00301 } else {
00302 data.dptr = NULL;
00303 data.dsize = 0;
00304 if (ret == DB_NOTFOUND)
00305 __os_set_errno(ENOENT);
00306 else {
00307 __os_set_errno(ret);
00308 F_SET(dbc->dbp, DB_AM_DBM_ERROR);
00309 }
00310 }
00311 return (data);
00312 }
00313
00314
00315
00316
00317
00318
00319 datum
00320 __db_ndbm_firstkey(dbm)
00321 DBM *dbm;
00322 {
00323 DBC *dbc;
00324 DBT _key, _data;
00325 datum key;
00326 int ret;
00327
00328 dbc = (DBC *)dbm;
00329
00330 memset(&_key, 0, sizeof(DBT));
00331 memset(&_data, 0, sizeof(DBT));
00332
00333 if ((ret = dbc->c_get(dbc, &_key, &_data, DB_FIRST)) == 0) {
00334 key.dptr = _key.data;
00335 key.dsize = (int)_key.size;
00336 } else {
00337 key.dptr = NULL;
00338 key.dsize = 0;
00339 if (ret == DB_NOTFOUND)
00340 __os_set_errno(ENOENT);
00341 else {
00342 __os_set_errno(ret);
00343 F_SET(dbc->dbp, DB_AM_DBM_ERROR);
00344 }
00345 }
00346 return (key);
00347 }
00348
00349
00350
00351
00352
00353
00354 datum
00355 __db_ndbm_nextkey(dbm)
00356 DBM *dbm;
00357 {
00358 DBC *dbc;
00359 DBT _key, _data;
00360 datum key;
00361 int ret;
00362
00363 dbc = (DBC *)dbm;
00364
00365 memset(&_key, 0, sizeof(DBT));
00366 memset(&_data, 0, sizeof(DBT));
00367
00368 if ((ret = dbc->c_get(dbc, &_key, &_data, DB_NEXT)) == 0) {
00369 key.dptr = _key.data;
00370 key.dsize = (int)_key.size;
00371 } else {
00372 key.dptr = NULL;
00373 key.dsize = 0;
00374 if (ret == DB_NOTFOUND)
00375 __os_set_errno(ENOENT);
00376 else {
00377 __os_set_errno(ret);
00378 F_SET(dbc->dbp, DB_AM_DBM_ERROR);
00379 }
00380 }
00381 return (key);
00382 }
00383
00384
00385
00386
00387
00388
00389 int
00390 __db_ndbm_delete(dbm, key)
00391 DBM *dbm;
00392 datum key;
00393 {
00394 DBC *dbc;
00395 DBT _key;
00396 int ret;
00397
00398 dbc = (DBC *)dbm;
00399
00400 memset(&_key, 0, sizeof(DBT));
00401 _key.data = key.dptr;
00402 _key.size = (u_int32_t)key.dsize;
00403
00404 if ((ret = dbc->dbp->del(dbc->dbp, NULL, &_key, 0)) == 0)
00405 return (0);
00406
00407 if (ret == DB_NOTFOUND)
00408 __os_set_errno(ENOENT);
00409 else {
00410 __os_set_errno(ret);
00411 F_SET(dbc->dbp, DB_AM_DBM_ERROR);
00412 }
00413 return (-1);
00414 }
00415
00416
00417
00418
00419
00420
00421
00422 int
00423 __db_ndbm_store(dbm, key, data, flags)
00424 DBM *dbm;
00425 datum key, data;
00426 int flags;
00427 {
00428 DBC *dbc;
00429 DBT _key, _data;
00430 int ret;
00431
00432 dbc = (DBC *)dbm;
00433
00434 memset(&_key, 0, sizeof(DBT));
00435 _key.data = key.dptr;
00436 _key.size = (u_int32_t)key.dsize;
00437
00438 memset(&_data, 0, sizeof(DBT));
00439 _data.data = data.dptr;
00440 _data.size = (u_int32_t)data.dsize;
00441
00442 if ((ret = dbc->dbp->put(dbc->dbp, NULL,
00443 &_key, &_data, flags == DBM_INSERT ? DB_NOOVERWRITE : 0)) == 0)
00444 return (0);
00445
00446 if (ret == DB_KEYEXIST)
00447 return (1);
00448
00449 __os_set_errno(ret);
00450 F_SET(dbc->dbp, DB_AM_DBM_ERROR);
00451 return (-1);
00452 }
00453
00454 int
00455 __db_ndbm_error(dbm)
00456 DBM *dbm;
00457 {
00458 DBC *dbc;
00459
00460 dbc = (DBC *)dbm;
00461
00462 return (F_ISSET(dbc->dbp, DB_AM_DBM_ERROR));
00463 }
00464
00465 int
00466 __db_ndbm_clearerr(dbm)
00467 DBM *dbm;
00468 {
00469 DBC *dbc;
00470
00471 dbc = (DBC *)dbm;
00472
00473 F_CLR(dbc->dbp, DB_AM_DBM_ERROR);
00474 return (0);
00475 }
00476
00477
00478
00479
00480
00481
00482 int
00483 __db_ndbm_rdonly(dbm)
00484 DBM *dbm;
00485 {
00486 DBC *dbc;
00487
00488 dbc = (DBC *)dbm;
00489
00490 return (F_ISSET(dbc->dbp, DB_AM_RDONLY) ? 1 : 0);
00491 }
00492
00493
00494
00495
00496
00497
00498
00499 int
00500 __db_ndbm_dirfno(dbm)
00501 DBM *dbm;
00502 {
00503 return (dbm_pagfno(dbm));
00504 }
00505
00506 int
00507 __db_ndbm_pagfno(dbm)
00508 DBM *dbm;
00509 {
00510 DBC *dbc;
00511 int fd;
00512
00513 dbc = (DBC *)dbm;
00514
00515 (void)dbc->dbp->fd(dbc->dbp, &fd);
00516 return (fd);
00517 }