mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Reworked callback layout, added send_search_entry callback
This commit is contained in:
parent
b17f72ef8a
commit
af862f8c6b
@ -170,6 +170,7 @@ typedef struct glue_state {
|
||||
char *matched;
|
||||
int nrefs;
|
||||
BVarray refs;
|
||||
slap_callback *prevcb;
|
||||
} glue_state;
|
||||
|
||||
static void
|
||||
@ -188,7 +189,7 @@ glue_back_response (
|
||||
LDAPControl **ctrls
|
||||
)
|
||||
{
|
||||
glue_state *gs = op->o_glue;
|
||||
glue_state *gs = op->o_callback->sc_private;
|
||||
|
||||
if (err == LDAP_SUCCESS || gs->err != LDAP_SUCCESS)
|
||||
gs->err = err;
|
||||
@ -240,13 +241,38 @@ glue_back_sresult (
|
||||
int nentries
|
||||
)
|
||||
{
|
||||
glue_state *gs = op->o_glue;
|
||||
glue_state *gs = op->o_callback->sc_private;
|
||||
|
||||
gs->nentries += nentries;
|
||||
glue_back_response (c, op, 0, 0, err, matched, text, refs,
|
||||
NULL, NULL, NULL, ctrls);
|
||||
}
|
||||
|
||||
static int
|
||||
glue_back_sendentry (
|
||||
BackendDB *be,
|
||||
Connection *c,
|
||||
Operation *op,
|
||||
Entry *e,
|
||||
AttributeName *an,
|
||||
int ao,
|
||||
LDAPControl **ctrls
|
||||
)
|
||||
{
|
||||
slap_callback *tmp = op->o_callback;
|
||||
glue_state *gs = tmp->sc_private;
|
||||
int rc;
|
||||
|
||||
op->o_callback = gs->prevcb;
|
||||
if (op->o_callback && op->o_callback->sc_sendentry) {
|
||||
rc = op->o_callback->sc_sendentry(be, c, op, e, an, ao, ctrls);
|
||||
} else {
|
||||
rc = send_search_entry(be, c, op, e, an, ao, ctrls);
|
||||
}
|
||||
op->o_callback = tmp;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
glue_back_search (
|
||||
BackendDB *b0,
|
||||
@ -268,9 +294,12 @@ glue_back_search (
|
||||
BackendDB *be;
|
||||
int i, rc, t2limit = 0, s2limit = 0;
|
||||
long stoptime = 0;
|
||||
glue_state gs = {0};
|
||||
struct berval bv;
|
||||
glue_state gs = {0};
|
||||
slap_callback cb = {glue_back_response, glue_back_sresult,
|
||||
glue_back_sendentry, &gs};
|
||||
|
||||
gs.prevcb = op->o_callback;
|
||||
|
||||
if (tlimit) {
|
||||
stoptime = slap_get_time () + tlimit;
|
||||
@ -293,9 +322,7 @@ glue_back_search (
|
||||
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
case LDAP_SCOPE_SUBTREE:
|
||||
op->o_glue = &gs;
|
||||
op->o_sresult = glue_back_sresult;
|
||||
op->o_response = glue_back_response;
|
||||
op->o_callback = &cb;
|
||||
|
||||
/*
|
||||
* Execute in reverse order, most general first
|
||||
@ -349,9 +376,7 @@ glue_back_search (
|
||||
}
|
||||
break;
|
||||
}
|
||||
op->o_sresult = NULL;
|
||||
op->o_response = NULL;
|
||||
op->o_glue = NULL;
|
||||
op->o_callback = gs.prevcb;
|
||||
|
||||
send_search_result (conn, op, gs.err, gs.matched, NULL,
|
||||
gs.refs, NULL, gs.nentries);
|
||||
|
@ -187,8 +187,8 @@ send_ldap_response(
|
||||
int rc;
|
||||
long bytes;
|
||||
|
||||
if (op->o_response) {
|
||||
op->o_response( conn, op, tag, msgid, err, matched,
|
||||
if (op->o_callback && op->o_callback->sc_response) {
|
||||
op->o_callback->sc_response( conn, op, tag, msgid, err, matched,
|
||||
text, ref, resoid, resdata, sasldata, ctrls );
|
||||
return;
|
||||
}
|
||||
@ -548,8 +548,8 @@ send_search_result(
|
||||
|
||||
assert( !LDAP_API_ERROR( err ) );
|
||||
|
||||
if (op->o_sresult) {
|
||||
op->o_sresult(conn, op, err, matched, text, refs,
|
||||
if (op->o_callback && op->o_callback->sc_sresult) {
|
||||
op->o_callback->sc_sresult(conn, op, err, matched, text, refs,
|
||||
ctrls, nentries);
|
||||
return;
|
||||
}
|
||||
@ -631,6 +631,11 @@ send_search_entry(
|
||||
|
||||
AttributeDescription *ad_entry = slap_schema.si_ad_entry;
|
||||
|
||||
if (op->o_callback && op->o_callback->sc_sendentry) {
|
||||
return op->o_callback->sc_sendentry( be, conn, op, e, attrs,
|
||||
attrsonly, ctrls );
|
||||
}
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG(( "operation", LDAP_LEVEL_ENTRY,
|
||||
"send_search_entry: conn %d dn=\"%s\"%s\n",
|
||||
|
@ -1360,6 +1360,16 @@ typedef void (slap_sresult)( struct slap_conn *, struct slap_op *,
|
||||
ber_int_t, const char *, const char *, BVarray,
|
||||
LDAPControl **, int nentries);
|
||||
|
||||
typedef int (slap_sendentry)( BackendDB *, struct slap_conn *,
|
||||
struct slap_op *, Entry *, AttributeName *, int, LDAPControl **);
|
||||
|
||||
typedef struct slap_callback {
|
||||
slap_response *sc_response;
|
||||
slap_sresult *sc_sresult;
|
||||
slap_sendentry *sc_sendentry;
|
||||
void *sc_private;
|
||||
} slap_callback;
|
||||
|
||||
/*
|
||||
* represents an operation pending from an ldap client
|
||||
*/
|
||||
@ -1388,11 +1398,9 @@ typedef struct slap_op {
|
||||
AuthorizationInformation o_authz;
|
||||
|
||||
BerElement *o_ber; /* ber of the request */
|
||||
slap_response *o_response; /* callback function */
|
||||
slap_sresult *o_sresult; /* search result callback */
|
||||
slap_callback *o_callback; /* callback pointers */
|
||||
LDAPControl **o_ctrls; /* controls */
|
||||
|
||||
void *o_glue; /* for the glue backend */
|
||||
void *o_private; /* anything the backend needs */
|
||||
|
||||
LDAP_STAILQ_ENTRY(slap_op) o_next; /* next operation in list */
|
||||
|
Loading…
Reference in New Issue
Block a user