mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-28 10:39:34 -05:00
LCUP persistent search code drop
This commit is contained in:
parent
97e526cb2d
commit
8074294f1d
19 changed files with 269 additions and 14 deletions
|
|
@ -202,7 +202,9 @@ typedef struct ldapcontrol {
|
|||
#define LDAP_CONTROL_PAGEDRESULTS "1.2.840.113556.1.4.319"
|
||||
#endif
|
||||
|
||||
/*
|
||||
#define LDAP_CLIENT_UPDATE 1
|
||||
*/
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
#define LDAP_CONTROL_CLIENT_UPDATE "1.3.6.1.4.1.4203.666.5.3"
|
||||
#define LDAP_CONTROL_ENTRY_UPDATE "1.3.6.1.4.1.4203.666.5.4"
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ SRCS = main.c daemon.c connection.c search.c filter.c add.c cr.c \
|
|||
schemaparse.c ad.c at.c mr.c syntax.c oc.c saslauthz.c \
|
||||
oidm.c starttls.c index.c sets.c referral.c \
|
||||
root_dse.c sasl.c module.c suffixalias.c mra.c mods.c \
|
||||
limits.c backglue.c operational.c matchedValues.c \
|
||||
limits.c backglue.c operational.c matchedValues.c lcup.c \
|
||||
$(@PLAT@_SRCS)
|
||||
|
||||
OBJS = main.o daemon.o connection.o search.o filter.o add.o cr.o \
|
||||
|
|
@ -32,7 +32,7 @@ OBJS = main.o daemon.o connection.o search.o filter.o add.o cr.o \
|
|||
schemaparse.o ad.o at.o mr.o syntax.o oc.o saslauthz.o \
|
||||
oidm.o starttls.o index.o sets.o referral.o \
|
||||
root_dse.o sasl.o module.o suffixalias.o mra.o mods.o \
|
||||
limits.o backglue.o operational.o matchedValues.o \
|
||||
limits.o backglue.o operational.o matchedValues.o lcup.o \
|
||||
$(@PLAT@_OBJS)
|
||||
|
||||
LDAP_INCDIR= ../../include
|
||||
|
|
|
|||
|
|
@ -30,9 +30,12 @@ do_abandon(
|
|||
Operation *op
|
||||
)
|
||||
{
|
||||
ber_int_t id;
|
||||
ber_int_t id;
|
||||
Operation *o;
|
||||
int rc;
|
||||
int rc;
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "conn: %d do_abandon\n", conn->c_connid, 0, 0);
|
||||
|
|
@ -105,6 +108,16 @@ do_abandon(
|
|||
}
|
||||
|
||||
done:
|
||||
|
||||
#if LDAP_CLIENT_UPDATE
|
||||
for ( i = 0; i < nbackends; i++ ) {
|
||||
if ( strncmp( backends[i].be_type, "bdb", 3 ) ) continue;
|
||||
if ( bdb_abandon( &backends[i], conn, id ) == LDAP_SUCCESS ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
|
|
|
|||
|
|
@ -4,12 +4,12 @@ SRCS = init.c tools.c config.c \
|
|||
add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
|
||||
extended.c passwd.c referral.c attribute.c group.c operational.c \
|
||||
attr.c index.c key.c dbcache.c filterindex.c \
|
||||
dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c cache.c
|
||||
dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c cache.c lcup.c
|
||||
OBJS = init.lo tools.lo config.lo \
|
||||
add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \
|
||||
extended.lo passwd.lo referral.lo attribute.lo group.lo operational.lo \
|
||||
attr.lo index.lo key.lo dbcache.lo filterindex.lo \
|
||||
dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo cache.lo
|
||||
dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo cache.lo lcup.lo
|
||||
|
||||
LDAP_INCDIR= ../../../include
|
||||
LDAP_LIBDIR= ../../../libraries
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ bdb_add(
|
|||
#endif
|
||||
int noop = 0;
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
Operation* ps_list;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG ( OPERATION, ARGS, "==> bdb_add: %s\n", e->e_dn, 0, 0 );
|
||||
#else
|
||||
|
|
@ -458,6 +462,7 @@ retry: /* transaction retry */
|
|||
goto return_results;
|
||||
}
|
||||
|
||||
|
||||
if( op->o_noop ) {
|
||||
if (( rc=TXN_ABORT( ltid )) != 0 ) {
|
||||
text = "txn_abort (no-op) failed";
|
||||
|
|
@ -542,6 +547,14 @@ return_results:
|
|||
send_ldap_result( conn, op, rc,
|
||||
NULL, text, NULL, NULL );
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !noop ) {
|
||||
LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch( be, conn, op, ps_list, e, LCUP_PSEARCH_BY_ADD );
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
if( rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
|
||||
ldap_pvt_thread_yield();
|
||||
TXN_CHECKPOINT( bdb->bi_dbenv,
|
||||
|
|
@ -557,3 +570,4 @@ done:
|
|||
|
||||
return ( ( rc == LDAP_SUCCESS ) ? noop : rc );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,9 @@ struct bdb_info {
|
|||
|
||||
ID bi_lastid;
|
||||
ldap_pvt_thread_mutex_t bi_lastid_mutex;
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
LDAP_LIST_HEAD(pl, slap_op) psearch_list;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define bi_id2entry bi_databases[BDB_ID2ENTRY]
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@ bdb_delete(
|
|||
|
||||
int noop = 0;
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
Operation* ps_list;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG ( OPERATION, ARGS, "==> bdb_delete: %s\n", dn->bv_val, 0, 0 );
|
||||
#else
|
||||
|
|
@ -489,6 +493,14 @@ retry: /* transaction retry */
|
|||
return_results:
|
||||
send_ldap_result( conn, op, rc, NULL, text, NULL, NULL );
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !noop ) {
|
||||
LDAP_LIST_FOREACH( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch( be, conn, op, ps_list, e, LCUP_PSEARCH_BY_DELETE );
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
if(rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
|
||||
ldap_pvt_thread_yield();
|
||||
TXN_CHECKPOINT( bdb->bi_dbenv,
|
||||
|
|
|
|||
|
|
@ -93,6 +93,10 @@ bdb_db_init( BackendDB *be )
|
|||
|
||||
bdb->bi_lock_detect = DB_LOCK_DEFAULT;
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
LDAP_LIST_INIT (&bdb->psearch_list);
|
||||
#endif
|
||||
|
||||
ldap_pvt_thread_mutex_init( &bdb->bi_database_mutex );
|
||||
ldap_pvt_thread_mutex_init( &bdb->bi_lastid_mutex );
|
||||
ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_mutex );
|
||||
|
|
|
|||
|
|
@ -277,6 +277,12 @@ bdb_modify(
|
|||
|
||||
int noop = 0;
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
Operation* ps_list;
|
||||
struct psid_entry* pm_list;
|
||||
struct psid_entry* pm_prev;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG ( OPERATION, ENTRY, "bdb_modify: %s\n", dn->bv_val, 0, 0 );
|
||||
#else
|
||||
|
|
@ -295,6 +301,17 @@ retry: /* transaction retry */
|
|||
Debug(LDAP_DEBUG_TRACE,
|
||||
"bdb_modify: retrying...\n", 0, 0, 0);
|
||||
#endif
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
#endif
|
||||
|
||||
rc = TXN_ABORT( ltid );
|
||||
ltid = NULL;
|
||||
op->o_private = NULL;
|
||||
|
|
@ -405,6 +422,14 @@ retry: /* transaction retry */
|
|||
ber_bvarray_free( refs );
|
||||
goto done;
|
||||
}
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !op->o_noop ) {
|
||||
LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch(be, conn, op, ps_list, e, LCUP_PSEARCH_BY_PREMODIFY );
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
/* Modify the entry */
|
||||
rc = bdb_modify_internal( be, conn, op, ltid, modlist, e,
|
||||
|
|
@ -493,6 +518,24 @@ return_results:
|
|||
send_ldap_result( conn, op, rc,
|
||||
NULL, text, NULL, NULL );
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !op->o_noop ) {
|
||||
/* Loop through in-scope entries for each psearch spec */
|
||||
LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch( be, conn, op, ps_list, e, LCUP_PSEARCH_BY_MODIFY );
|
||||
}
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
bdb_psearch(be, conn, op, pm_list->ps->op,
|
||||
e, LCUP_PSEARCH_BY_SCOPEOUT);
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
if( rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
|
||||
ldap_pvt_thread_yield();
|
||||
TXN_CHECKPOINT( bdb->bi_dbenv,
|
||||
|
|
@ -501,6 +544,15 @@ return_results:
|
|||
|
||||
done:
|
||||
if( ltid != NULL ) {
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
#endif
|
||||
TXN_ABORT( ltid );
|
||||
op->o_private = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,12 @@ bdb_modrdn(
|
|||
|
||||
int noop = 0;
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
Operation* ps_list;
|
||||
struct psid_entry* pm_list;
|
||||
struct psid_entry* pm_prev;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG ( OPERATION, ENTRY, "==>bdb_modrdn(%s,%s,%s)\n",
|
||||
dn->bv_val,newrdn->bv_val, newSuperior ? newSuperior->bv_val : "NULL" );
|
||||
|
|
@ -88,6 +94,17 @@ retry: /* transaction retry */
|
|||
#else
|
||||
Debug( LDAP_DEBUG_TRACE, "==>bdb_modrdn: retrying...\n", 0, 0, 0 );
|
||||
#endif
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
#endif
|
||||
|
||||
rc = TXN_ABORT( ltid );
|
||||
ltid = NULL;
|
||||
op->o_private = NULL;
|
||||
|
|
@ -708,6 +725,14 @@ retry: /* transaction retry */
|
|||
goto return_results;
|
||||
}
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !op->o_noop ) {
|
||||
LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch(be, conn, op, ps_list, e, LCUP_PSEARCH_BY_PREMODIFY );
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
/* modify entry */
|
||||
rc = bdb_modify_internal( be, conn, op, ltid, &mod[0], e,
|
||||
&text, textbuf, textlen );
|
||||
|
|
@ -802,6 +827,24 @@ return_results:
|
|||
send_ldap_result( conn, op, rc,
|
||||
NULL, text, NULL, NULL );
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( rc == LDAP_SUCCESS && !op->o_noop ) {
|
||||
/* Loop through in-scope entries for each psearch spec */
|
||||
LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
|
||||
bdb_psearch( be, conn, op, ps_list, e, LCUP_PSEARCH_BY_MODIFY );
|
||||
}
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
bdb_psearch(be, conn, op, pm_list->ps->op,
|
||||
e, LCUP_PSEARCH_BY_SCOPEOUT);
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
if( rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
|
||||
ldap_pvt_thread_yield();
|
||||
TXN_CHECKPOINT( bdb->bi_dbenv,
|
||||
|
|
@ -844,6 +887,15 @@ done:
|
|||
}
|
||||
|
||||
if( ltid != NULL ) {
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
pm_list = LDAP_LIST_FIRST(&op->premodify_list);
|
||||
while ( pm_list != NULL ) {
|
||||
LDAP_LIST_REMOVE ( pm_list, link );
|
||||
pm_prev = pm_list;
|
||||
pm_list = LDAP_LIST_NEXT ( pm_list, link );
|
||||
free (pm_prev);
|
||||
}
|
||||
#endif
|
||||
TXN_ABORT( ltid );
|
||||
op->o_private = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -364,6 +364,40 @@ int bdb_cache_delete_entry(
|
|||
);
|
||||
void bdb_cache_release_all( Cache *cache );
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
int bdb_abandon(
|
||||
BackendDB *be,
|
||||
Connection *conn,
|
||||
ber_int_t id
|
||||
);
|
||||
|
||||
int bdb_add_psearch_spec(
|
||||
BackendDB *be,
|
||||
Connection *conn,
|
||||
Operation *op,
|
||||
struct berval *base,
|
||||
struct berval *nbase,
|
||||
int scope,
|
||||
int deref,
|
||||
int slimit,
|
||||
int tlimit,
|
||||
Filter *filter,
|
||||
struct berval *fstr,
|
||||
AttributeName *attrs,
|
||||
int attrsonly
|
||||
);
|
||||
|
||||
int bdb_psearch(
|
||||
BackendDB *be,
|
||||
Connection *conn,
|
||||
Operation *op,
|
||||
Operation *ps_op,
|
||||
Entry *entry,
|
||||
int psearch_type
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BDB_REUSE_LOCKERS
|
||||
|
||||
int bdb_locker_id( Operation *op, DB_ENV *env, int *locker );
|
||||
|
|
|
|||
|
|
@ -81,6 +81,15 @@ bdb_search(
|
|||
0, 0, 0);
|
||||
#endif
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( op->o_clientupdate_type & SLAP_LCUP_PERSIST ) {
|
||||
bdb_add_psearch_spec( be, conn, op, base, base, scope,
|
||||
deref, slimit, tlimit, filter, filterstr, attrs, attrsonly );
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
manageDSAit = get_manageDSAit( op );
|
||||
|
||||
rc = LOCK_ID (bdb->bi_dbenv, &locker );
|
||||
|
|
@ -866,7 +875,7 @@ done:
|
|||
bdb_cache_return_entry_r ( bdb->bi_dbenv, &bdb->bi_cache, e, &lock );
|
||||
}
|
||||
|
||||
#ifdef LDAP_CLIENT_UDATE
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( op->o_clientupdate_type & SLAP_LCUP_SYNC ) {
|
||||
if ( csnfeq.f_ava != NULL && csnfeq.f_av_value.bv_val != NULL ) {
|
||||
ch_free( csnfeq.f_av_value.bv_val );
|
||||
|
|
|
|||
|
|
@ -1041,7 +1041,11 @@ operations_error:
|
|||
|
||||
LDAP_STAILQ_REMOVE( &conn->c_ops, arg->co_op, slap_op, o_next);
|
||||
LDAP_STAILQ_NEXT(arg->co_op, o_next) = NULL;
|
||||
slap_op_free( arg->co_op );
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( !( arg->co_op->o_clientupdate_type & SLAP_LCUP_PERSIST ) ) {
|
||||
slap_op_free( arg->co_op );
|
||||
}
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
arg->co_op = NULL;
|
||||
arg->co_conn = NULL;
|
||||
free( (char *) arg );
|
||||
|
|
|
|||
|
|
@ -318,6 +318,9 @@ int get_ctrls(
|
|||
case LDAP_REQ_UNBIND:
|
||||
tagmask = SLAP_CTRL_UNBIND;
|
||||
break;
|
||||
case LDAP_REQ_ABANDON:
|
||||
tagmask = SLAP_CTRL_ABANDON;
|
||||
break;
|
||||
case LDAP_REQ_EXTENDED:
|
||||
/* FIXME: check list of extended operations */
|
||||
tagmask = ~0U;
|
||||
|
|
|
|||
|
|
@ -395,6 +395,10 @@ int main( int argc, char **argv )
|
|||
goto destroy;
|
||||
}
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
build_uuid_attr();
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TLS
|
||||
/* Library defaults to full certificate checking. This is correct when
|
||||
* a client is verifying a server because all servers should have a
|
||||
|
|
|
|||
|
|
@ -1057,6 +1057,14 @@ LDAP_SLAPD_F (int) value_add_one LDAP_P((
|
|||
BerVarray *vals,
|
||||
struct berval *addval ));
|
||||
|
||||
/*
|
||||
* lcup.c
|
||||
*/
|
||||
|
||||
extern AttributeName uuid_attr[2];
|
||||
|
||||
LDAP_SLAPD_F (int) build_uuid_attr LDAP_P ((void));
|
||||
|
||||
/*
|
||||
* Other...
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -322,12 +322,17 @@ do_search(
|
|||
}
|
||||
|
||||
return_results:;
|
||||
if( pbase.bv_val != NULL) free( pbase.bv_val );
|
||||
if( nbase.bv_val != NULL) free( nbase.bv_val );
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
if ( !( op->o_clientupdate_type & SLAP_LCUP_PERSIST ) )
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
{
|
||||
if( pbase.bv_val != NULL) free( pbase.bv_val );
|
||||
if( nbase.bv_val != NULL) free( nbase.bv_val );
|
||||
|
||||
if( fstr.bv_val != NULL) free( fstr.bv_val );
|
||||
if( filter != NULL) filter_free( filter );
|
||||
if( an != NULL ) free( an );
|
||||
if( fstr.bv_val != NULL) free( fstr.bv_val );
|
||||
if( filter != NULL) filter_free( filter );
|
||||
if( an != NULL ) free( an );
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1567,6 +1567,39 @@ typedef struct slap_paged_state {
|
|||
ID ps_id;
|
||||
} PagedResultsState;
|
||||
|
||||
|
||||
#ifdef LDAP_CLIENT_UPDATE
|
||||
#define LCUP_PSEARCH_BY_ADD 0x01
|
||||
#define LCUP_PSEARCH_BY_DELETE 0x02
|
||||
#define LCUP_PSEARCH_BY_PREMODIFY 0x03
|
||||
#define LCUP_PSEARCH_BY_MODIFY 0x04
|
||||
#define LCUP_PSEARCH_BY_SCOPEOUT 0x05
|
||||
|
||||
struct lcup_search_spec {
|
||||
struct slap_op *op;
|
||||
struct berval *base;
|
||||
struct berval *nbase;
|
||||
int scope;
|
||||
int deref;
|
||||
int slimit;
|
||||
int tlimit;
|
||||
Filter *filter;
|
||||
struct berval *filterstr;
|
||||
AttributeName *attrs;
|
||||
int attrsonly;
|
||||
struct lcup_entry *elist;
|
||||
ldap_pvt_thread_mutex_t elist_mutex;
|
||||
int entry_count;
|
||||
LDAP_LIST_ENTRY(lcup_search_spec) link;
|
||||
};
|
||||
|
||||
struct psid_entry {
|
||||
struct lcup_search_spec* ps;
|
||||
LDAP_LIST_ENTRY(psid_entry) link;
|
||||
};
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
|
||||
/*
|
||||
* represents an operation pending from an ldap client
|
||||
*/
|
||||
|
|
@ -1608,6 +1641,9 @@ typedef struct slap_op {
|
|||
#define SLAP_LCUP_SYNC_AND_PERSIST (0x3)
|
||||
ber_int_t o_clientupdate_interval;
|
||||
struct berval o_clientupdate_state;
|
||||
LDAP_LIST_HEAD(lss, lcup_search_spec) psearch_spec;
|
||||
LDAP_LIST_HEAD(pe, psid_entry) premodify_list;
|
||||
LDAP_LIST_ENTRY(slap_op) link;
|
||||
#endif /* LDAP_CLIENT_UPDATE */
|
||||
|
||||
#ifdef LDAP_CONNECTIONLESS
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ SLAPD_OBJS = ../config.o ../ch_malloc.o ../cr.o ../backend.o \
|
|||
../entry.o ../dn.o ../filter.o ../str2filter.o ../ava.o \
|
||||
../init.o ../controls.o ../kerberos.o ../passwd.o \
|
||||
../index.o ../extended.o ../starttls.o ../sets.o ../mra.o \
|
||||
../referral.o ../backglue.o ../oidm.o ../mods.o
|
||||
../referral.o ../backglue.o ../oidm.o ../mods.o ../operation.o ../lcup.o
|
||||
|
||||
SLAPOBJS = $(SLAPD_OBJS) slapcommon.o mimic.o
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue