static int _gdbm_fetch (mu_dbm_file_t db, struct mu_dbm_datum const *key, struct mu_dbm_datum *ret) { struct gdbm_descr *gd = db->db_descr; int rc; datum keydat, content; keydat.dptr = key->mu_dptr; keydat.dsize = key->mu_dsize; gdbm_errno = 0; content = gdbm_fetch (gd->file, keydat); if (content.dptr == NULL) { if (gdbm_errno == GDBM_ITEM_NOT_FOUND) return MU_ERR_NOENT; else { db->db_errno.n = gdbm_errno; return MU_ERR_FAILURE; } } mu_dbm_datum_free (ret); rc = _gdbm_conv_datum (db, ret, content, 1); if (rc) { free (content.dptr); return rc; } return 0; }
static int _gdbm_nextkey (mu_dbm_file_t db, struct mu_dbm_datum *ret) { struct gdbm_descr *gd = db->db_descr; int rc; datum key; if (!gd->prev.dptr) return MU_ERR_NOENT; key = gdbm_nextkey (gd->file, gd->prev); if (key.dptr == NULL) { if (gdbm_errno == GDBM_ITEM_NOT_FOUND) return MU_ERR_NOENT; else { db->db_errno.n = gdbm_errno; return MU_ERR_FAILURE; } } mu_dbm_datum_free (ret); rc = _gdbm_conv_datum (db, ret, key, 0); if (rc) { free (key.dptr); return rc; } free (gd->prev.dptr); gd->prev = key; return 0; }
static int _ndbm_fetch (mu_dbm_file_t db, struct mu_dbm_datum const *key, struct mu_dbm_datum *ret) { datum keydat, content; keydat.dptr = key->mu_dptr; keydat.dsize = key->mu_dsize; errno = 0; content = dbm_fetch (db->db_descr, keydat); mu_dbm_datum_free (ret); if (content.dptr == NULL) return MU_ERR_NOENT; return _ndbm_conv_datum (db, ret, content); }
static int _tc_nextkey (mu_dbm_file_t db, struct mu_dbm_datum *ret) { TCHDB *hdb = db->db_descr; void *ptr; int retsize; ptr = tchdbiternext (hdb, &retsize); if (ptr) { mu_dbm_datum_free (ret); ret->mu_dptr = ptr; ret->mu_dsize = retsize; return 0; } else if ((db->db_errno.n = tchdbecode (hdb)) == TCENOREC) return MU_ERR_NOENT; return MU_ERR_FAILURE; }