X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackglue.c;h=b3ca5d48322e997f3a384d0736eb455339b88b80;hb=eb3e92481bfbc655164e5c66aa3499a4315ac6ea;hp=f8df9b2006f42f7bb8ca9ca27b525d6f0ea8388a;hpb=044b6464459bc710b5a31c4954bdd5387f2f03ba;p=openldap diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index f8df9b2006..b3ca5d4832 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -52,6 +52,8 @@ static slap_overinst glue; static int glueMode; static BackendDB *glueBack; +static BackendDB glueBackDone; +#define GLUEBACK_DONE (&glueBackDone) static slap_response glue_op_response; @@ -591,7 +593,7 @@ glue_tool_entry_close ( { int rc = 0; - if (glueBack) { + if (glueBack && glueBack != GLUEBACK_DONE) { if (!glueBack->be_entry_close) return 0; rc = glueBack->be_entry_close (glueBack); @@ -740,6 +742,7 @@ glue_tool_entry_first ( slap_overinst *on = glue_tool_inst( b0->bd_info ); glueinfo *gi = on->on_bi.bi_private; int i; + ID rc; /* If we're starting from scratch, start at the most general */ if (!glueBack) { @@ -759,7 +762,26 @@ glue_tool_entry_first ( glueBack->be_entry_open (glueBack, glueMode) != 0) return NOID; - return glueBack->be_entry_first (glueBack); + rc = glueBack->be_entry_first (glueBack); + while ( rc == NOID ) { + if ( glueBack && glueBack->be_entry_close ) + glueBack->be_entry_close (glueBack); + for (i=0; igi_nodes; i++) { + if (gi->gi_n[i].gn_be == glueBack) + break; + } + if (i == 0) { + glueBack = GLUEBACK_DONE; + break; + } else { + glueBack = gi->gi_n[i-1].gn_be; + rc = glue_tool_entry_first (b0); + if ( glueBack == GLUEBACK_DONE ) { + break; + } + } + } + return rc; } static ID @@ -786,11 +808,14 @@ glue_tool_entry_next ( break; } if (i == 0) { - glueBack = NULL; + glueBack = GLUEBACK_DONE; break; } else { glueBack = gi->gi_n[i-1].gn_be; rc = glue_tool_entry_first (b0); + if ( glueBack == GLUEBACK_DONE ) { + break; + } } } return rc; @@ -1003,8 +1028,10 @@ glue_db_init( SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_GLUE_INSTANCE; - if ( ga_list ) + if ( ga_list ) { + be->bd_info = (BackendInfo *)oi; glue_sub_attach( 1 ); + } return 0; }