]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_pblock.c
Add ability to cache negative results and specify negative TTL on templates
[openldap] / servers / slapd / slapi / slapi_pblock.c
index 0f0afde775030e3313303a0d675658ce0ddb806a..ec4b0ed18cfc5fe6cc3cc976fcb83d88cf2f9569 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2002-2005 The OpenLDAP Foundation.
+ * Copyright 2002-2006 The OpenLDAP Foundation.
  * Portions Copyright 1997,2002-2003 IBM Corporation.
  * All rights reserved.
  *
@@ -64,6 +64,8 @@ pblock_get_param_class( int param )
        case SLAPI_DB2LDIF_PRINTKEY:
        case SLAPI_LDIF2DB_REMOVEDUPVALS:
        case SLAPI_MANAGEDSAIT:
+       case SLAPI_X_MANAGEDIT:
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
        case SLAPI_IS_REPLICATED_OPERATION:
        case SLAPI_X_CONN_IS_UDP:
        case SLAPI_X_CONN_SSF:
@@ -275,6 +277,7 @@ pblock_get_param_class( int param )
        case SLAPI_X_GROUP_ATTRIBUTE:
        case SLAPI_X_GROUP_OPERATION_DN:
        case SLAPI_X_GROUP_TARGET_ENTRY:
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
        case SLAPI_PLUGIN_AUDIT_DATA:
        case SLAPI_IBM_PBLOCK:
        case SLAPI_PLUGIN_VERSION:
@@ -466,6 +469,24 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                PBLOCK_ASSERT_OP( pb, 0 );
                *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent;
                break;
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = get_no_schema_check( pb->pb_op );
+               break;
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
+               PBLOCK_ASSERT_OP( pb, 0 );
+
+               if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
+                       struct berval tmpval = BER_BVNULL;
+
+                       rc = mods_structural_class( pb->pb_op->ora_modlist,
+                               &tmpval, &pb->pb_rs->sr_text,
+                               pb->pb_textbuf, sizeof( pb->pb_textbuf ));
+                       *((char **)value) = tmpval.bv_val;
+               } else {
+                       rc = PBLOCK_ERROR;
+               }
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((LDAPControl ***)value) = pb->pb_op->o_ctrls;
@@ -478,9 +499,13 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                PBLOCK_ASSERT_OP( pb, 0 );
                *((int *)value) = get_manageDSAit( pb->pb_op );
                break;
+       case SLAPI_X_MANAGEDIT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = get_manageDIT( pb->pb_op );
+               break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((BackendDB **)value) = pb->pb_op->o_bd;
+               *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0, 0 );
                break;
        case SLAPI_BE_TYPE:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -590,14 +615,22 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_MODIFY_MODS: {
                LDAPMod **mods = NULL;
+               Modifications *ml;
 
                pblock_get_default( pb, param, (void **)&mods );
                if ( mods == NULL && pb->pb_intop == 0 ) {
-                       if ( pb->pb_op->o_tag != LDAP_REQ_MODIFY ) {
+                       switch ( pb->pb_op->o_tag ) {
+                       case LDAP_REQ_MODIFY:
+                               ml = pb->pb_op->orm_modlist;
+                               break;
+                       case LDAP_REQ_MODRDN:
+                               ml = pb->pb_op->orr_modlist;
+                               break;
+                       defaulat:
                                rc = PBLOCK_ERROR;
                                break;
                        }
-                       mods = slapi_int_modifications2ldapmods( &pb->pb_op->orm_modlist, NULL );
+                       mods = slapi_int_modifications2ldapmods( ml );
                        pblock_set_default( pb, param, (void *)mods );
                }
                *((LDAPMod ***)value) = mods;
@@ -679,7 +712,8 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                        attrs = anlist2charray_x( pb->pb_op->ors_attrs, 0, pb->pb_op->o_tmpmemctx );
                        pblock_set_default( pb, param, (void *)attrs );
                }
-               *((char ***)attrs) = attrs;
+               *((char ***)value) = attrs;
+               break;
        }
        case SLAPI_SEARCH_ATTRSONLY:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -788,7 +822,7 @@ pblock_set_dn( void *value, struct berval *dn, struct berval *ndn, void *memctx
        }
 
        bv.bv_val = (char *)value;
-       bv.bv_len = strlen( bv.bv_val );
+       bv.bv_len = ( value != NULL ) ? strlen( bv.bv_val ) : 0;
 
        return dnPrettyNormal( NULL, &bv, dn, ndn, memctx );
 }
@@ -820,6 +854,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_delete_glue_parent = *((int *)value);
                break;
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_no_schema_check = *((int *)value);
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_ctrls = (LDAPControl **)value;
@@ -847,6 +885,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_managedsait = *((int *)value);
                break;
+       case SLAPI_X_MANAGEDIT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_managedit = *((int *)value);
+               break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_bd = (BackendDB *)value;
@@ -857,7 +899,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
        case SLAPI_X_CONN_SSF:
                PBLOCK_ASSERT_CONN( pb );
                PBLOCK_LOCK_CONN( pb );
-               pb->pb_conn->c_ssf = (slap_ssf_t)value;
+               pb->pb_conn->c_ssf = (slap_ssf_t)(long)value;
                PBLOCK_UNLOCK_CONN( pb );
                break;
        case SLAPI_X_CONN_SASL_CONTEXT:
@@ -905,6 +947,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                break;
        case SLAPI_MODIFY_MODS: {
                Modifications **mlp;
+               Modifications *newmods;
 
                PBLOCK_ASSERT_OP( pb, 0 );
                rc = pblock_set_default( pb, param, value );
@@ -916,22 +959,17 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        mlp = &pb->pb_op->orm_modlist;
                } else if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
                        mlp = &pb->pb_op->ora_modlist;
+               } else if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
+                       mlp = &pb->pb_op->orr_modlist;
                } else {
                        break;
                }
 
-               if ( *mlp != NULL ) {
-                       slapi_int_mods_free( *mlp );
-                       *mlp = NULL;
+               newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value );
+               if ( newmods != NULL ) {
+                       slap_mods_free( *mlp, 1 );
+                       *mlp = newmods;
                }
-               /*
-                * Note: for internal operations, the modifications need to be
-                * duplicated because slap_mods_check() will free values before
-                * prettying, and we have no idea how the values were
-                * allocated. For frontend operations, slap_mods_check() will
-                * have already been called.    
-                */
-               *mlp = slapi_int_ldapmods2modifications( (LDAPMod **)value, pb->pb_intop, NULL );
                break;
        }
        case SLAPI_MODRDN_NEWRDN:
@@ -994,9 +1032,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        case LDAP_SCOPE_BASE:
                        case LDAP_SCOPE_ONELEVEL:
                        case LDAP_SCOPE_SUBTREE:
-#ifdef LDAP_SCOPE_SUBORDINATE
                        case LDAP_SCOPE_SUBORDINATE:
-#endif
                                pb->pb_op->ors_scope = scope;
                                break;
                        default:
@@ -1190,6 +1226,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
        case SLAPI_X_CONN_CLIENTPATH:
        case SLAPI_CONN_SERVERIP:
        case SLAPI_X_CONN_SERVERPATH:
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
                /* These parameters cannot be set */
                rc = PBLOCK_ERROR;
                break;
@@ -1277,7 +1314,7 @@ pblock_destroy( Slapi_PBlock *pb )
                slapi_int_connection_done_pb( pb );
        } else {
                pblock_get_default( pb, SLAPI_MODIFY_MODS, (void **)&mods );
-               slapi_int_free_ldapmods( mods );
+               ldap_mods_free( mods, 1 );
 
                pblock_get_default( pb, SLAPI_SEARCH_ATTRS, (void **)&attrs );
                if ( attrs != NULL )