]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backover.c
Forced commit, partially revert prev commit
[openldap] / servers / slapd / backover.c
index bd95b393610b1a3cc9a67a62efc60c1980a61c90..874ccf065abf33ff4f1657c6ffffa69c7ed12c02 100644 (file)
@@ -51,14 +51,14 @@ over_db_func(
        func = &oi->oi_orig->bi_db_open;
        if ( func[which] ) {
                be->bd_info = oi->oi_orig;
-               rc = func[which]( be );
+               rc = func[which]( be, NULL );
        }
 
        for (; on && rc == 0; on=on->on_next) {
                be->bd_info = &on->on_bi;
                func = &on->on_bi.bi_db_open;
                if (func[which]) {
-                       rc = func[which]( be );
+                       rc = func[which]( be, NULL );
                }
        }
        be->bd_info = bi_orig;
@@ -147,6 +147,7 @@ over_db_config(
                        ca.bi = &on->on_bi;
                        ct = config_find_keyword( on->on_bi.bi_cf_ocs->co_table, &ca );
                        if ( ct ) {
+                               ca.table = on->on_bi.bi_cf_ocs->co_type;
                                rc = config_add_vals( ct, &ca );
                                if ( rc != SLAP_CONF_UNKNOWN )
                                        break;
@@ -167,7 +168,8 @@ over_db_config(
 
 static int
 over_db_open(
-       BackendDB *be
+       BackendDB *be,
+       ConfigReply *cr
 )
 {
        return over_db_func( be, db_open );
@@ -175,7 +177,8 @@ over_db_open(
 
 static int
 over_db_close(
-       BackendDB *be
+       BackendDB *be,
+       ConfigReply *cr
 )
 {
        slap_overinfo *oi = be->bd_info->bi_private;
@@ -186,13 +189,13 @@ over_db_close(
        for (; on && rc == 0; on=on->on_next) {
                be->bd_info = &on->on_bi;
                if ( be->bd_info->bi_db_close ) {
-                       rc = be->bd_info->bi_db_close( be );
+                       rc = be->bd_info->bi_db_close( be, NULL );
                }
        }
 
        if ( oi->oi_orig->bi_db_close ) {
                be->bd_info = oi->oi_orig;
-               rc = be->bd_info->bi_db_close( be );
+               rc = be->bd_info->bi_db_close( be, NULL );
        }
 
        be->bd_info = bi_orig;
@@ -201,7 +204,8 @@ over_db_close(
 
 static int
 over_db_destroy(
-       BackendDB *be
+       BackendDB *be,
+       ConfigReply *cr
 )
 {
        slap_overinfo *oi = be->bd_info->bi_private;
@@ -322,6 +326,147 @@ over_access_allowed(
        return rc;
 }
 
+int
+overlay_entry_get_ov(
+       Operation               *op,
+       struct berval   *dn,
+       ObjectClass             *oc,
+       AttributeDescription    *ad,
+       int     rw,
+       Entry   **e,
+       slap_overinst *on )
+{
+       slap_overinfo *oi = on->on_info;
+       BackendDB *be = op->o_bd, db;
+       BackendInfo *bi = op->o_bd->bd_info;
+       int rc = SLAP_CB_CONTINUE;
+
+       for ( ; on; on = on->on_next ) {
+               if ( on->on_bi.bi_entry_get_rw ) {
+                       /* NOTE: do not copy the structure until required */
+                       if ( !SLAP_ISOVERLAY( op->o_bd ) ) {
+                               db = *op->o_bd;
+                               db.be_flags |= SLAP_DBFLAG_OVERLAY;
+                               op->o_bd = &db;
+                       }
+
+                       op->o_bd->bd_info = (BackendInfo *)on;
+                       rc = on->on_bi.bi_entry_get_rw( op, dn,
+                               oc, ad, rw, e );
+                       if ( rc != SLAP_CB_CONTINUE ) break;
+               }
+       }
+
+       if ( rc == SLAP_CB_CONTINUE ) {
+               /* if the database structure was changed, o_bd points to a
+                * copy of the structure; put the original bd_info in place */
+               if ( SLAP_ISOVERLAY( op->o_bd ) ) {
+                       op->o_bd->bd_info = oi->oi_orig;
+               }
+
+               if ( oi->oi_orig->bi_entry_get_rw ) {
+                       rc = oi->oi_orig->bi_entry_get_rw( op, dn,
+                               oc, ad, rw, e );
+               }
+       }
+       /* should not fall thru this far without anything happening... */
+       if ( rc == SLAP_CB_CONTINUE ) {
+               rc = LDAP_UNWILLING_TO_PERFORM;
+       }
+
+       op->o_bd = be;
+       op->o_bd->bd_info = bi;
+
+       return rc;
+}
+
+static int
+over_entry_get_rw(
+       Operation               *op,
+       struct berval   *dn,
+       ObjectClass             *oc,
+       AttributeDescription    *ad,
+       int     rw,
+       Entry   **e )
+{
+       slap_overinfo *oi;
+       slap_overinst *on;
+
+       assert( op->o_bd != NULL );
+
+       oi = op->o_bd->bd_info->bi_private;
+       on = oi->oi_list;
+
+       return overlay_entry_get_ov( op, dn, oc, ad, rw, e, on );
+}
+
+int
+overlay_entry_release_ov(
+       Operation       *op,
+       Entry   *e,
+       int rw,
+       slap_overinst *on )
+{
+       slap_overinfo *oi = on->on_info;
+       BackendDB *be = op->o_bd, db;
+       BackendInfo *bi = op->o_bd->bd_info;
+       int rc = SLAP_CB_CONTINUE;
+
+       for ( ; on; on = on->on_next ) {
+               if ( on->on_bi.bi_entry_release_rw ) {
+                       /* NOTE: do not copy the structure until required */
+                       if ( !SLAP_ISOVERLAY( op->o_bd ) ) {
+                               db = *op->o_bd;
+                               db.be_flags |= SLAP_DBFLAG_OVERLAY;
+                               op->o_bd = &db;
+                       }
+
+                       op->o_bd->bd_info = (BackendInfo *)on;
+                       rc = on->on_bi.bi_entry_release_rw( op, e, rw );
+                       if ( rc != SLAP_CB_CONTINUE ) break;
+               }
+       }
+
+       if ( rc == SLAP_CB_CONTINUE ) {
+               /* if the database structure was changed, o_bd points to a
+                * copy of the structure; put the original bd_info in place */
+               if ( SLAP_ISOVERLAY( op->o_bd ) ) {
+                       op->o_bd->bd_info = oi->oi_orig;
+               }
+
+               if ( oi->oi_orig->bi_entry_release_rw ) {
+                       rc = oi->oi_orig->bi_entry_release_rw( op, e, rw );
+               }
+       }
+       /* should not fall thru this far without anything happening... */
+       if ( rc == SLAP_CB_CONTINUE ) {
+               entry_free( e );
+               rc = 0;
+       }
+
+       op->o_bd = be;
+       op->o_bd->bd_info = bi;
+
+       return rc;
+}
+
+static int
+over_entry_release_rw(
+       Operation       *op,
+       Entry   *e,
+       int rw )
+{
+       slap_overinfo *oi;
+       slap_overinst *on;
+
+       assert( op->o_bd != NULL );
+
+       oi = op->o_bd->bd_info->bi_private;
+       on = oi->oi_list;
+
+       return overlay_entry_release_ov( op, e, rw, on );
+}
+
 static int
 over_acl_group(
        Operation               *op,
@@ -933,7 +1078,7 @@ overlay_destroy_one( BackendDB *be, slap_overinst *on )
                        if ( on->on_bi.bi_db_destroy ) {
                                BackendInfo *bi_orig = be->bd_info;
                                be->bd_info = (BackendInfo *)on;
-                               on->on_bi.bi_db_destroy( be );
+                               on->on_bi.bi_db_destroy( be, NULL );
                                be->bd_info = bi_orig;
                        }
                        free( on );
@@ -1090,6 +1235,8 @@ overlay_config( BackendDB *be, const char *ov, int idx, BackendInfo **res )
                bi->bi_chk_controls = over_aux_chk_controls;
 
                /* these have specific arglists */
+               bi->bi_entry_get_rw = over_entry_get_rw;
+               bi->bi_entry_release_rw = over_entry_release_rw;
                bi->bi_access_allowed = over_access_allowed;
                bi->bi_acl_group = over_acl_group;
                bi->bi_acl_attribute = over_acl_attribute;
@@ -1137,7 +1284,7 @@ overlay_config( BackendDB *be, const char *ov, int idx, BackendInfo **res )
        if ( on2->on_bi.bi_db_init ) {
                int rc;
                be->bd_info = (BackendInfo *)on2;
-               rc = on2->on_bi.bi_db_init( be );
+               rc = on2->on_bi.bi_db_init( be, NULL );
                be->bd_info = (BackendInfo *)oi;
                if ( rc ) {
                        *prev = on2->on_next;