- int result = -1;
-
-#if 0 /* noop is masked SLAP_CTRL_UPDATE */
- if( op->o_noop ) {
- result = 0;
- } else
-#endif
- if (IS_PSEARCH) {
- int premodify_found = 0;
- int entry_sync_state;
-
- if ( ps_type == LDAP_PSEARCH_BY_ADD ||
- ps_type == LDAP_PSEARCH_BY_DELETE ||
- ps_type == LDAP_PSEARCH_BY_MODIFY ||
- ps_type == LDAP_PSEARCH_BY_SCOPEOUT )
- {
- if ( ps_type == LDAP_PSEARCH_BY_MODIFY ) {
- struct psid_entry* psid_e;
- LDAP_LIST_FOREACH( psid_e,
- &op->o_pm_list, ps_link)
- {
- if( psid_e->ps_op == sop ) {
- premodify_found = 1;
- LDAP_LIST_REMOVE(psid_e, ps_link);
- break;
- }
- }
- if (psid_e != NULL) free (psid_e);
- }
- if ( ps_type == LDAP_PSEARCH_BY_ADD ) {
- entry_sync_state = LDAP_SYNC_ADD;
- } else if ( ps_type == LDAP_PSEARCH_BY_DELETE ) {
- entry_sync_state = LDAP_SYNC_DELETE;
- } else if ( ps_type == LDAP_PSEARCH_BY_MODIFY ) {
- if ( premodify_found ) {
- entry_sync_state = LDAP_SYNC_MODIFY;
- } else {
- entry_sync_state = LDAP_SYNC_ADD;
- }
- } else if ( ps_type == LDAP_PSEARCH_BY_SCOPEOUT ) {
- entry_sync_state = LDAP_SYNC_DELETE;
- } else {
- rs->sr_err = LDAP_OTHER;
- goto done;
- }
- if ( sop->o_sync_slog_size != -1 ) {
- if ( entry_sync_state == LDAP_SYNC_DELETE ) {
- result = slap_add_session_log( op, sop, e );
- } else {
- result = 1;
- }
- } else {
- struct berval cookie;
- slap_compose_sync_cookie( sop, &cookie,
- search_context_csn,
- sop->o_sync_state.sid,
- sop->o_sync_state.rid );
- rs->sr_err = slap_build_sync_state_ctrl( sop,
- rs, e, entry_sync_state, ctrls,
- num_ctrls++, 1, &cookie );
- if ( rs->sr_err != LDAP_SUCCESS ) goto done;
- rs->sr_attrs = attrs;
- rs->sr_ctrls = ctrls;
- result = send_search_entry( sop, rs );
- if ( cookie.bv_val )
- ch_free( cookie.bv_val );
- sl_free( ctrls[num_ctrls-1]->ldctl_value.bv_val,
- sop->o_tmpmemctx );
- sl_free( ctrls[--num_ctrls], sop->o_tmpmemctx );
- ctrls[num_ctrls] = NULL;
- rs->sr_ctrls = NULL;
- }
- } else if ( ps_type == LDAP_PSEARCH_BY_PREMODIFY ) {
- struct psid_entry* psid_e;
- psid_e = (struct psid_entry *) ch_calloc (1,
- sizeof(struct psid_entry));
- psid_e->ps_op = sop;
- LDAP_LIST_INSERT_HEAD( &op->o_pm_list,
- psid_e, ps_link );
-
- } else {
-#ifdef NEW_LOGGING
- LDAP_LOG ( OPERATION, RESULTS,
- "bdb_search: invalid ps_type (%d) \n",
- ps_type, 0, 0);
-#else
- Debug( LDAP_DEBUG_TRACE,
- "bdb_search: invalid ps_type (%d) \n",
- ps_type, 0, 0);
-#endif
- }
- } else {
- if ( sop->o_sync_mode & SLAP_SYNC_REFRESH ) {
-
- if ( rc_sync == LDAP_COMPARE_TRUE ) { /* ADD */
- rs->sr_err = slap_build_sync_state_ctrl( sop,
- rs, e, entry_sync_state, ctrls,
- num_ctrls++, 0, NULL );
- if ( rs->sr_err != LDAP_SUCCESS ) goto done;
- rs->sr_ctrls = ctrls;
- rs->sr_attrs = sop->oq_search.rs_attrs;
- result = send_search_entry( sop, rs );
- sl_free( ctrls[num_ctrls-1]->ldctl_value.bv_val,
- sop->o_tmpmemctx );
- sl_free( ctrls[--num_ctrls], sop->o_tmpmemctx );
- ctrls[num_ctrls] = NULL;
- rs->sr_ctrls = NULL;
- } else { /* PRESENT */
- if ( sync_send_present_mode ) {
- result = slap_build_syncUUID_set( sop,
- &syncUUID_set, e );
- if ( result <= 0 ) {
- result = -1;
- } else {
- syncUUID_set_cnt++;
- if ( syncUUID_set_cnt == SLAP_SYNCUUID_SET_SIZE ) {
- rs->sr_err = LDAP_SUCCESS;
- rs->sr_rspoid = LDAP_SYNC_INFO;
- rs->sr_ctrls = NULL;
- result = slap_send_syncinfo( sop, rs,
- LDAP_TAG_SYNC_ID_SET,
- NULL, 0, syncUUID_set, 0 );
- if ( result != LDAP_SUCCESS )
- result = -1;
- ber_bvarray_free_x( syncUUID_set,
- sop->o_tmpmemctx );
- syncUUID_set = NULL;
- syncUUID_set_cnt = 0;
- }
- }
- } else {
- result = 1;
- }
- }
- } else {
- rs->sr_attrs = sop->oq_search.rs_attrs;
- rs->sr_ctrls = NULL;
- result = send_search_entry( sop, rs );
- }
- }