static void * dbfn_read_with_length(open_db *dbblock, uschar *key, int *length) { void *yield; EXIM_DATUM key_datum, result_datum; EXIM_DATUM_INIT(key_datum); /* Some DBM libraries require the datum */ EXIM_DATUM_INIT(result_datum); /* to be cleared before use. */ EXIM_DATUM_DATA(key_datum) = CS key; EXIM_DATUM_SIZE(key_datum) = Ustrlen(key) + 1; if (!EXIM_DBGET(dbblock->dbptr, key_datum, result_datum)) return NULL; yield = store_get(EXIM_DATUM_SIZE(result_datum)); memcpy(yield, EXIM_DATUM_DATA(result_datum), EXIM_DATUM_SIZE(result_datum)); if (length != NULL) *length = EXIM_DATUM_SIZE(result_datum); EXIM_DATUM_FREE(result_datum); /* Some DBM libs require freeing */ return yield; }
int dbmdb_find(void *handle, uschar *filename, uschar *keystring, int length, uschar **result, uschar **errmsg, BOOL *do_cache) { EXIM_DB *d = (EXIM_DB *)handle; EXIM_DATUM key, data; filename = filename; /* Keep picky compilers happy */ errmsg = errmsg; do_cache = do_cache; EXIM_DATUM_INIT(key); /* Some DBM libraries require datums to */ EXIM_DATUM_INIT(data); /* be cleared before use. */ EXIM_DATUM_DATA(key) = CS keystring; EXIM_DATUM_SIZE(key) = length + 1; if (EXIM_DBGET(d, key, data)) { *result = string_copyn(US EXIM_DATUM_DATA(data), EXIM_DATUM_SIZE(data)); EXIM_DATUM_FREE(data); /* Some DBM libraries need a free() call */ return OK; } return FAIL; }