]> git.sur5r.net Git - openldap/commitdiff
more cleanup for the backend API change
authorJong Hyuk Choi <jongchoi@openldap.org>
Tue, 22 Apr 2003 17:59:54 +0000 (17:59 +0000)
committerJong Hyuk Choi <jongchoi@openldap.org>
Tue, 22 Apr 2003 17:59:54 +0000 (17:59 +0000)
servers/slapd/syncrepl.c

index c9cb4ed2f506519984feebb7609dcdd086f31145..737e89a41ec35bd1189cb29b9f8f8f9b693b5091 100644 (file)
 
 #ifdef LDAP_SYNCREPL
 
-static Entry* syncrepl_message_to_entry( LDAP *, Backend*, LDAPMessage *,
-               Modifications *, int*, struct berval *, struct berval * );
-static int syncrepl_entry( LDAP *, Backend*, Entry*, Modifications*, int,
-                               struct berval*, struct berval*, int );
-static int syncrepl_del_nonpresent( LDAP *, Backend * );
-static void syncrepl_add_glue( LDAP *, Connection*, Operation*, Backend*,
-                              Entry*, Modifications*, int,
-                              struct berval*, struct berval* );
-static void syncrepl_updateCookie( LDAP *, Backend *, struct berval *,
-                               struct berval * );
-static int slap_mods_check_syncrepl( Backend *, Modifications **,
-                               const char **, char *, size_t, void *ctx );
-static int slap_mods_opattrs_syncrepl( Backend *, Operation *, Modifications *,
-                       Modifications **, const char **, char *, size_t );
-static int slap_mods2entry_syncrepl( Modifications *, Entry **, int,
-                               const char **, char *, size_t );
+static Entry*
+syncrepl_message_to_entry ( LDAP *, Operation *, LDAPMessage *, Modifications *,
+                           int*, struct berval *, struct berval * );
+
+static int
+syncrepl_entry( LDAP *, Operation*, Entry*, Modifications*,
+               int, struct berval*, struct berval*, int );
+
+static int
+syncrepl_del_nonpresent( LDAP *, Operation * );
+
+static void
+syncrepl_add_glue( LDAP *, Operation*, Entry*, Modifications*, int,
+                  struct berval*, struct berval* );
+
+static void
+syncrepl_updateCookie( LDAP *, Operation *, struct berval *, struct berval * );
+
+static int
+slap_mods_check_syncrepl( Operation *, Modifications **,
+                         const char **, char *, size_t, void *ctx );
+
+static int
+slap_mods_opattrs_syncrepl( Operation *, Modifications *, Modifications **,
+                           const char **, char *, size_t );
+
+static int
+slap_mods2entry_syncrepl( Modifications *, Entry **, int,
+                         const char **, char *, size_t );
 
 /* callback functions */
 static int cookie_callback( struct slap_op *, struct slap_rep * );
@@ -324,7 +337,8 @@ do_syncrepl(
 
        op.o_tag = LDAP_REQ_SEARCH;
        op.o_protocol = LDAP_VERSION3;
-       ber_dupbv( &op.o_ndn, &be->be_rootndn );
+       op.o_ndn = be->be_rootndn;
+       psub = be->be_nsuffix[0];
        op.o_callback = &cb;
        op.o_time = slap_get_time();
        op.o_managedsait = 1;
@@ -337,6 +351,9 @@ do_syncrepl(
        /* search subentry to retrieve cookie */
        si->syncCookie = NULL;
 
+       op.o_bd = be;
+       op.o_conn = &conn;
+       op.o_connid = op.o_conn->c_connid;
        op.ors_scope = LDAP_SCOPE_BASE;
        op.ors_deref = LDAP_DEREF_NEVER;
        op.ors_slimit = -1;
@@ -431,8 +448,8 @@ do_syncrepl(
 #endif
                }
                si->attrs = tmp;
-               si->attrs[ n++ ] = strndup( descs[i]->ad_cname.bv_val,
-                                                 descs[i]->ad_cname.bv_len );
+               si->attrs[ n++ ] = ( char * ) strndup( descs[i]->ad_cname.bv_val,
+                                                      descs[i]->ad_cname.bv_len );
                si->attrs[ n ] = NULL;
        }
 
@@ -456,40 +473,15 @@ do_syncrepl(
                {
                        switch( ldap_msgtype( msg ) ) {
                        case LDAP_RES_SEARCH_ENTRY:
-                               entry = syncrepl_message_to_entry( ld, be, msg, modlist, &syncstate, &syncUUID, &syncCookie );
-#if 0
-                               if ( rctrls ) {
-                                       rctrlp = *rctrls;
-                                       ctrl_ber = ber_init( &rctrlp->ldctl_value );
-                                       ber_scanf( ctrl_ber, "{em",
-                                                       &syncstate,
-                                                       &syncUUID );
-                                       if ( ber_peek_tag( ctrl_ber, &len )
-                                               == LDAP_SYNC_TAG_COOKIE ) {
-                                               ber_scanf( ctrl_ber, "m}", &syncCookie );
-                                       }
-                               } else {
-#ifdef NEW_LOGGING
-                                       LDAP_LOG( OPERATION, ERR,"do_syncrepl: "
-                                               " rctrls absent\n",
-                                               0, 0, 0 );
-#else
-                                       Debug( LDAP_DEBUG_ANY, "do_syncrepl :"
-                                               " rctrls absent\n",
-                                               0, 0, 0 );
-                                       break;
-#endif
-                               }
-#endif
-                               syncrepl_entry( ld, be, entry, modlist,
+                               entry = syncrepl_message_to_entry( ld, &op, msg, modlist, &syncstate, &syncUUID, &syncCookie );
+                               syncrepl_entry( ld, &op, entry, modlist,
                                                syncstate, &syncUUID,
                                                &syncCookie,
                                                !syncinfo_arrived );
                                if ( syncCookie.bv_len ) {
-                                       syncrepl_updateCookie( ld, be, &psub,
+                                       syncrepl_updateCookie( ld, &op, &psub,
                                                               &syncCookie );
                                }
-                               ber_free( ctrl_ber, 1 );
                                break;
 
                        case LDAP_RES_SEARCH_REFERENCE:
@@ -526,7 +518,7 @@ do_syncrepl(
                                } else {
                                        if ( syncCookie.bv_len ) {
                                                syncrepl_updateCookie( ld,
-                                                               be, &psub,
+                                                               &op, &psub,
                                                               &syncCookie );
                                        }
                                        goto restart;
@@ -543,7 +535,7 @@ restart_loop:
                                        ber_scanf( res_ber, "{e", &syncstate );
 
                                        if ( syncstate == LDAP_SYNC_REFRESH_DONE ) {
-                                               syncrepl_del_nonpresent( ld, be );
+                                               syncrepl_del_nonpresent( ld, &op );
                                        } else if ( syncstate != LDAP_SYNC_NEW_COOKIE ) {
 #ifdef NEW_LOGGING
                                                LDAP_LOG( OPERATION, ERR,
@@ -635,7 +627,7 @@ done:
 static Entry*
 syncrepl_message_to_entry(
        LDAP            *ld,
-       Backend         *be,
+       Operation       *op,
        LDAPMessage     *msg,
        Modifications   *modlist,
        int             *syncstate,
@@ -649,6 +641,7 @@ syncrepl_message_to_entry(
        Modifications   tmp;
        Modifications   *mod;
        Modifications   **modtail = &modlist;
+       Backend         *be = op->o_bd;
 
        const char      *text;
        char txtbuf[SLAP_TEXT_BUFLEN];
@@ -662,7 +655,6 @@ syncrepl_message_to_entry(
        int             rc;
        char            *a;
 
-       Operation op = {0};
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
 
        ber_len_t       len;
@@ -683,8 +675,7 @@ syncrepl_message_to_entry(
                return NULL;
        }
 
-       op.o_tag = LDAP_REQ_ADD;
-       ber_dupbv( &op.o_ndn, &be->be_rootndn );
+       op->o_tag = LDAP_REQ_ADD;
 
        rc = ldap_get_dn_ber( ld, msg, &ber, &bdn );
 
@@ -717,6 +708,7 @@ syncrepl_message_to_entry(
                mod->sml_desc = NULL;
                mod->sml_type = tmp.sml_type;
                mod->sml_bvalues = tmp.sml_bvalues;
+               mod->sml_nvalues = tmp.sml_bvalues;
 
                *modtail = mod;
                modtail = &mod->sml_next;
@@ -781,7 +773,7 @@ syncrepl_message_to_entry(
 #endif
         }
 
-       rc = slap_mods_check_syncrepl( be, &modlist, &text, txtbuf, textlen, NULL );
+       rc = slap_mods_check_syncrepl( op, &modlist, &text, txtbuf, textlen, NULL );
 
        if ( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
@@ -794,7 +786,7 @@ syncrepl_message_to_entry(
                return NULL;
        }
        
-       rc = slap_mods_opattrs_syncrepl( be, &op, modlist, modtail,
+       rc = slap_mods_opattrs_syncrepl( op, modlist, modtail,
                                         &text,txtbuf, textlen );
        
        if( rc != LDAP_SUCCESS ) {
@@ -839,7 +831,7 @@ syncuuid_cmp( const void* v_uuid1, const void* v_uuid2 )
 static int
 syncrepl_entry(
        LDAP *ld,
-       Backend* be,
+       Operation *op,
        Entry* e,
        Modifications* modlist,
        int syncstate,
@@ -848,18 +840,15 @@ syncrepl_entry(
        int refresh
 )
 {
+       Backend *be = op->o_bd;
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
        slap_callback   cb;
        struct berval   normdn = {0, NULL};
        struct berval   prettydn = {0, NULL};
-       struct berval   pbase = {0, NULL};
-       struct berval   nbase = {0, NULL};
-       struct berval   base_bv = {0, NULL};
        struct berval   csn_bv = {0, NULL};
        struct berval   *syncuuid_bv = NULL;
        char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
 
-       Operation op = {0};
        SlapReply       rs = {REP_RESULT};
        int rc;
 
@@ -897,19 +886,10 @@ syncrepl_entry(
        free(e->e_nname.bv_val);
        e->e_name = prettydn;
        e->e_nname = normdn;
-       op.o_req_dn = e->e_name;
-       op.o_req_ndn = e->e_nname;
-
-       ber_str2bv( si->base, strlen(si->base), 1, &base_bv ); 
-       dnPrettyNormal( 0, &base_bv, &pbase, &nbase, NULL );
-
-       op.o_protocol = LDAP_VERSION3;
-       ber_dupbv( &op.o_ndn, &be->be_rootndn );
-       op.o_callback = &cb;
-       op.o_time = slap_get_time();
-       op.o_managedsait = 1;
-       op.o_threadctx = si->ctx;
+       op->o_req_dn = e->e_name;
+       op->o_req_ndn = e->e_nname;
 
+       op->o_callback = &cb;
        cb.sc_response = null_callback;
        cb.sc_private = si;
 
@@ -917,20 +897,23 @@ syncrepl_entry(
        case LDAP_SYNC_ADD :
        case LDAP_SYNC_MODIFY :
 sync_add_retry:
-               op.o_tag = LDAP_REQ_MODIFY;
-               op.orm_modlist = modlist;
-               rc = be->be_modify( &op, &rs );
+               op->o_tag = LDAP_REQ_MODIFY;
+               op->orm_modlist = modlist;
+               rc = be->be_modify( op, &rs );
                if ( rc != LDAP_SUCCESS ) {
-                       if ( rc == LDAP_REFERRAL || rc == LDAP_NO_SUCH_OBJECT || rc == DB_NOTFOUND ) {
-                               op.o_tag = LDAP_REQ_ADD;
-                               op.ora_e = e;
-                               rc = be->be_add( &op, &rs );
+                       if ( rc == LDAP_REFERRAL ||
+                            rc == LDAP_NO_SUCH_OBJECT ||
+                            rc == DB_NOTFOUND ) {
+                               op->o_tag = LDAP_REQ_ADD;
+                               op->ora_e = e;
+                               rc = be->be_add( op, &rs );
                                if ( rc != LDAP_SUCCESS ) {
                                        if ( rc == LDAP_ALREADY_EXISTS ) {
                                                goto sync_add_retry;
-                                       } else if ( rc == LDAP_REFERRAL || rc == LDAP_NO_SUCH_OBJECT || rc == DB_NOTFOUND ) {
-                                               syncrepl_add_glue(ld, si->conn,
-                                                       &op, be, e,
+                                       } else if ( rc == LDAP_REFERRAL ||
+                                                   rc == LDAP_NO_SUCH_OBJECT ||
+                                                   rc == DB_NOTFOUND ) {
+                                               syncrepl_add_glue(ld, op, e,
                                                        modlist, syncstate,
                                                        syncUUID, syncCookie);
                                        } else {
@@ -959,7 +942,8 @@ sync_add_retry:
                si->e = NULL;
                break;
        case LDAP_SYNC_DELETE :
-               be->be_delete( &op, &rs );
+               op->o_tag = LDAP_REQ_DELETE;
+               be->be_delete( op, &rs );
                entry_free( e );
                si->e = NULL;
                break;
@@ -978,53 +962,44 @@ sync_add_retry:
 static int
 syncrepl_del_nonpresent(
        LDAP *ld,
-       Backend* be
+       Operation *op
 )
 {
+       Backend* be = op->o_bd;
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
        slap_callback   cb;
        struct berval   base_bv = {0, NULL};
        Filter *filter;
-       Operation op = {0};
        SlapReply       rs = {REP_RESULT};
        struct berval   filterstr_bv;
 
        ber_str2bv( si->base, strlen(si->base), 1, &base_bv ); 
-       dnPrettyNormal(0, &base_bv, &op.o_req_dn, &op.o_req_ndn, NULL );
+       dnPrettyNormal(0, &base_bv, &op->o_req_dn, &op->o_req_ndn, NULL );
 
        filter = str2filter( si->filterstr );
 
-       op.o_tag = LDAP_REQ_SEARCH;
-       op.o_protocol = LDAP_VERSION3;
-       ber_dupbv( &op.o_ndn, &be->be_rootndn );
-       op.o_callback = &cb;
-       op.o_time = slap_get_time();
-       op.o_managedsait = 1;
-       op.o_threadctx = si->ctx;
-
        cb.sc_response = nonpresent_callback;
        cb.sc_private = si;
 
-       op.ors_scope = LDAP_SCOPE_BASE;
-       op.ors_deref = LDAP_DEREF_NEVER;
-       op.ors_slimit = -1;
-       op.ors_tlimit = -1;
-       op.ors_attrsonly = 0;
-       op.ors_attrs = NULL;
-       op.ors_filter = str2filter( si->filterstr );
-       ber_str2bv( si->filterstr, strlen( si->filterstr ),
-                                       1, &op.ors_filterstr );
-
-       be->be_search( &op, &rs );
+       op->o_callback = &cb;
+       op->o_tag = LDAP_REQ_SEARCH;
+       op->ors_scope = LDAP_SCOPE_BASE;
+       op->ors_deref = LDAP_DEREF_NEVER;
+       op->ors_slimit = -1;
+       op->ors_tlimit = -1;
+       op->ors_attrsonly = 0;
+       op->ors_attrs = NULL;
+       op->ors_filter = str2filter( si->filterstr );
+       ber_str2bv( si->filterstr, strlen( si->filterstr ), 1, &op->ors_filterstr );
+
+       be->be_search( op, &rs );
 }
 
 
 static void
 syncrepl_add_glue(
        LDAP *ld,
-       Connection* conn,
        Operation* op,
-       Backend *be,
        Entry *e,
        Modifications* modlist,
        int syncstate,
@@ -1032,6 +1007,7 @@ syncrepl_add_glue(
        struct berval* syncCookie
 )
 {
+       Backend *be = op->o_bd;
        syncinfo_t *si = op->o_callback->sc_private;
        struct berval   uuid_bv = {0, NULL};
        slap_callback cb;
@@ -1046,6 +1022,7 @@ syncrepl_add_glue(
        struct berval rdn = {0, NULL};
        Entry   *glue;
        SlapReply       rs = {REP_RESULT};
+       Connection *conn = op->o_conn;
 
        op->o_tag = LDAP_REQ_ADD;
        op->o_callback = &cb;
@@ -1121,11 +1098,12 @@ syncrepl_add_glue(
 static void
 syncrepl_updateCookie(
        LDAP *ld,
-       Backend *be,
+       Operation *op,
        struct berval *pdn,
        struct berval *syncCookie
 )
 {
+       Backend *be = op->o_bd;
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
        Modifications *mod;
        Modifications *modlist;
@@ -1136,23 +1114,25 @@ syncrepl_updateCookie(
        struct berval* ssbva;
        struct berval* scbva;
 
-       char* substr;
+       char substr[64];
+       char rdnstr[67];
        const char      *text;
        char txtbuf[SLAP_TEXT_BUFLEN];
        size_t textlen = sizeof txtbuf;
 
        Entry* e;
        int rc;
+
+       struct berval sub_bv = { 0, NULL };
+       struct berval psubrdn = { 0, NULL };
        
        slap_callback cb;
-       Operation op = {0};
        SlapReply       rs = {REP_RESULT};
 
        ocbva = ( struct berval * ) ch_calloc( 4, sizeof( struct berval ));
        cnbva = ( struct berval * ) ch_calloc( 2, sizeof( struct berval ));
        ssbva = ( struct berval * ) ch_calloc( 2, sizeof( struct berval ));
        scbva = ( struct berval * ) ch_calloc( 2, sizeof( struct berval ));
-       substr = ( char * ) ch_calloc( 64, sizeof( char ));
 
        /* update in memory cookie */
        if ( si->syncCookie != NULL ) {
@@ -1172,11 +1152,14 @@ syncrepl_updateCookie(
        mod->sml_desc = NULL;
        ber_str2bv( "objectClass", strlen("objectClass"), 0, &mod->sml_type );
        mod->sml_bvalues = ocbva;
+       mod->sml_nvalues = ocbva;
        *modtail = mod;
        modtail = &mod->sml_next;
 
        sprintf( substr, "syncrepl%d", si->id );
+       sprintf( rdnstr, "cn=%s", substr );
        ber_str2bv( substr, strlen( substr ), 1, &cnbva[0] );
+       ber_str2bv( rdnstr, strlen( rdnstr ), 1, &psubrdn );
        free( substr );
        cnbva[1].bv_len = 0;
        cnbva[1].bv_val = NULL;
@@ -1186,6 +1169,7 @@ syncrepl_updateCookie(
        mod->sml_desc = NULL;
        ber_str2bv( "cn", strlen("cn"), 0, &mod->sml_type );
        mod->sml_bvalues = cnbva;
+       mod->sml_nvalues = cnbva;
        *modtail = mod;
        modtail = &mod->sml_next;
 
@@ -1199,6 +1183,7 @@ syncrepl_updateCookie(
        ber_str2bv( "syncreplCookie", strlen("syncreplCookie"),
                                                0, &mod->sml_type );
        mod->sml_bvalues = scbva;
+       mod->sml_nvalues = scbva;
        *modtail = mod;
        modtail = &mod->sml_next;
 
@@ -1212,10 +1197,11 @@ syncrepl_updateCookie(
        ber_str2bv( "subtreeSpecification",
                        strlen("subtreeSpecification"), 0, &mod->sml_type );
        mod->sml_bvalues = ssbva;
+       mod->sml_nvalues = ssbva;
        *modtail = mod;
        modtail = &mod->sml_next;
 
-       rc = slap_mods_check_syncrepl( be, &modlist, &text, txtbuf, textlen, NULL );
+       rc = slap_mods_check_syncrepl( op, &modlist, &text, txtbuf, textlen, NULL );
 
        if ( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
@@ -1227,9 +1213,8 @@ syncrepl_updateCookie(
 #endif
        }
 
-       op.o_tag = LDAP_REQ_ADD;
-       rc = slap_mods_opattrs_syncrepl( be, &op, modlist, modtail,
-                                        &text,txtbuf, textlen );
+       op->o_tag = LDAP_REQ_ADD;
+       rc = slap_mods_opattrs_syncrepl( op, modlist, modtail, &text,txtbuf, textlen );
 
        if( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
@@ -1242,7 +1227,9 @@ syncrepl_updateCookie(
        }
 
        e = ( Entry * ) ch_calloc( 1, sizeof( Entry ));
-       dnPrettyNormal( NULL, pdn, &e->e_name, &e->e_nname, NULL );
+
+       build_new_dn( &sub_bv, pdn, &psubrdn );
+       dnPrettyNormal( NULL, &sub_bv, &e->e_name, &e->e_nname, NULL );
 
        e->e_attrs = NULL;
 
@@ -1258,18 +1245,12 @@ syncrepl_updateCookie(
 #endif
        }
 
-       op.o_protocol = LDAP_VERSION3;
-       ber_dupbv( &op.o_ndn, &be->be_rootndn );
-       op.o_callback = &cb;
-       op.o_time = slap_get_time();
-       op.o_managedsait = 1;
-       op.o_threadctx = si->ctx;
-
        cb.sc_response = null_callback;
        cb.sc_private = si;
 
-       op.o_req_dn = e->e_name;
-       op.o_req_ndn = e->e_nname;
+       op->o_callback = &cb;
+       op->o_req_dn = e->e_name;
+       op->o_req_ndn = e->e_nname;
 
        /*
        for( mod = modlist; mod != NULL; mod = mod->sml_next ) {
@@ -1279,16 +1260,16 @@ syncrepl_updateCookie(
 
        /* update persistent cookie */
 update_cookie_retry:
-       op.o_tag = LDAP_REQ_MODIFY;
-       op.orm_modlist = modlist;
-       rc = be->be_modify( &op, &rs );
+       op->o_tag = LDAP_REQ_MODIFY;
+       op->orm_modlist = modlist;
+       rc = be->be_modify( op, &rs );
        if ( rc != LDAP_SUCCESS ) {
                if ( rc == LDAP_REFERRAL ||
                     rc == LDAP_NO_SUCH_OBJECT ||
                     rc == DB_NOTFOUND ) {
-                       op.o_tag = LDAP_REQ_ADD;
-                       op.ora_e = e;
-                       rc = be->be_add( &op, &rs );
+                       op->o_tag = LDAP_REQ_ADD;
+                       op->ora_e = e;
+                       rc = be->be_add( op, &rs );
                        if ( rc != LDAP_SUCCESS ) {
                                if ( rc == LDAP_ALREADY_EXISTS ) {
                                        goto update_cookie_retry;
@@ -1331,7 +1312,7 @@ update_cookie_retry:
 
 static
 int slap_mods_check_syncrepl(
-       Backend *be,
+       Operation *op,
         Modifications **mlp,
         const char **text,
         char *textbuf,
@@ -1339,6 +1320,7 @@ int slap_mods_check_syncrepl(
        void *ctx )
 {
         int rc;
+       Backend *be = op->o_bd;
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
        AttributeDescription** descs;
        int i;
@@ -1532,7 +1514,6 @@ int slap_mods_check_syncrepl(
 
 static
 int slap_mods_opattrs_syncrepl(
-        Backend *be,
         Operation *op,
         Modifications *mods,
         Modifications **modtail,
@@ -1544,10 +1525,10 @@ int slap_mods_opattrs_syncrepl(
         char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
         char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
         Modifications *mod;
+       Backend *be = op->o_bd;
        syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
 
-        int mop = op->o_tag == LDAP_REQ_ADD
-                ? LDAP_MOD_ADD : LDAP_MOD_REPLACE;
+        int mop = op->o_tag == LDAP_REQ_ADD ? LDAP_MOD_ADD : LDAP_MOD_REPLACE;
 
         assert( modtail != NULL );
         assert( *modtail == NULL );