Implements only the initial stubs to the drivers.
{
struct client_dict *dict = cmd->dict;
struct dict_lookup_result result;
+ const char *const values[] = { value, NULL };
i_zero(&result);
if (error != NULL) {
} else switch (reply) {
case DICT_PROTOCOL_REPLY_OK:
result.value = value;
+ result.values = values;
result.ret = 1;
break;
case DICT_PROTOCOL_REPLY_NOTFOUND:
struct sql_dict_lookup_context *ctx)
{
struct dict_lookup_result result;
+ const char *values[2] = { NULL, NULL };
i_zero(&result);
result.ret = sql_result_next_row(sql_result);
"not found", which is probably what is usually
wanted. */
result.ret = 0;
+ } else {
+ values[0] = result.value;
+ result.values = values;
}
}
ctx->callback(&result, ctx->context);
i_zero(&result);
result.ret = dict_lookup(dict, pool_datastack_create(),
key, &result.value, &result.error);
+ const char *const values[] = { result.value, NULL };
+ result.values = values;
callback(&result, context);
return;
}
struct dict_lookup_result {
int ret;
+
+ /* First returned value (ret > 0) */
const char *value;
+ /* NULL-terminated list of all returned values (ret > 0) */
+ const char *const *values;
+
+ /* Error message for a failed lookup (ret < 0) */
const char *error;
};
/* try extract value */
const char *const *values = ldap_entry_get_attribute(entry, op->map->value_attribute);
if (values != NULL) {
+ const char **new_values;
+
if (op->dict->set->debug > 0)
i_debug("ldap_dict_lookup_callback got attribute %s", op->map->value_attribute);
op->res.ret = 1;
- op->res.value = p_strdup(op->pool, values[0]);
+ new_values = p_new(op->pool, const char *, 2);
+ new_values[0] = p_strdup(op->pool, values[0]);
+ op->res.values = new_values;
+ op->res.value = op->res.values[0];
} else {
if (op->dict->set->debug > 0)
i_debug("ldap_dict_lookup_callback dit not get attribute %s", op->map->value_attribute);