]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/add.c
Improve schema error messages
[openldap] / servers / slapd / back-meta / add.c
index f061f443c452431124ec82808a6bea88bc6a30d7..ce3d73fecdb4175218be7f7343a1fc638c5ee778 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2001 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  *
  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
@@ -89,11 +89,10 @@ meta_back_add(
        int i, candidate = -1;
        Attribute *a;
        LDAPMod **attrs;
-       char *mdn = NULL, *mapped;
+       struct berval mdn = { 0, NULL }, mapped;
 
 #ifdef NEW_LOGGING
-       LDAP_LOG(( "backend", LDAP_LEVEL_ENTRY, "meta_back_add: %s\n",
-                       e->e_dn ));
+       LDAP_LOG( BACK_META, ENTRY, "meta_back_add: %s\n", e->e_dn, 0, 0 );
 #else /* !NEW_LOGGING */
        Debug(LDAP_DEBUG_ARGS, "==> meta_back_add: %s\n%s%s", e->e_dn, "", "");
 #endif /* !NEW_LOGGING */
@@ -113,19 +112,20 @@ meta_back_add(
         * Rewrite the add dn, if needed
         */
        switch ( rewrite_session( li->targets[ candidate ]->rwinfo,
-                               "addDn", e->e_dn, conn, &mdn )) {
+                               "addDn", e->e_dn, conn, &mdn.bv_val )) {
        case REWRITE_REGEXEC_OK:
-               if ( mdn == NULL ) {
-                       mdn = e->e_dn;
+               if ( mdn.bv_val != NULL && mdn.bv_val[ 0 ] != '\0' ) {
+                       mdn.bv_len = strlen( mdn.bv_val );
+               } else {
+                       mdn = e->e_name;
                }
 
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1,
-                               "[rw] addDn: \"%s\" -> \"%s\"\n",
-                               e->e_dn, mdn ));
+               LDAP_LOG( BACK_META, DETAIL1,
+                       "[rw] addDn: \"%s\" -> \"%s\"\n", e->e_dn, mdn.bv_val, 0 );
 #else /* !NEW_LOGGING */
                Debug( LDAP_DEBUG_ARGS, "rw> addDn: \"%s\" -> \"%s\"\n%s", 
-                               e->e_dn, mdn, "" );
+                               e->e_dn, mdn.bv_val, "" );
 #endif /* !NEW_LOGGING */
                break;
                
@@ -147,6 +147,7 @@ meta_back_add(
        attrs = ch_malloc( sizeof( LDAPMod * )*i );
 
        for ( i = 0, a = e->e_attrs; a; a = a->a_next ) {
+               int j;
                /*
                 * lastmod should always be <off>, so that
                 * creation/modification operational attrs
@@ -166,9 +167,9 @@ meta_back_add(
                }
 #endif
                
-               mapped = ldap_back_map( &li->targets[ candidate ]->at_map,
-                               a->a_desc->ad_cname.bv_val, 0);
-               if ( mapped == NULL ) {
+               ldap_back_map( &li->targets[ candidate ]->at_map,
+                               &a->a_desc->ad_cname, &mapped, 0);
+               if ( mapped.bv_val == NULL ) {
                        continue;
                }
 
@@ -177,7 +178,7 @@ meta_back_add(
                        continue;
                }
                attrs[ i ]->mod_op = LDAP_MOD_BVALUES;
-               attrs[ i ]->mod_type = mapped;
+               attrs[ i ]->mod_type = mapped.bv_val;
 
                /*
                 * FIXME: dn-valued attrs should be rewritten
@@ -190,18 +191,23 @@ meta_back_add(
                                        a->a_vals, conn );
                }
 
-               attrs[ i ]->mod_vals.modv_bvals = a->a_vals;
+               for (j=0; a->a_vals[ j ].bv_val; j++);
+               attrs[ i ]->mod_vals.modv_bvals = ch_malloc((j+1)*sizeof(struct berval *));
+               for (j=0; a->a_vals[ j ].bv_val; j++)
+                       attrs[ i ]->mod_vals.modv_bvals[ j ] = &a->a_vals[ j ];
+               attrs[ i ]->mod_vals.modv_bvals[ j ] = NULL;
                i++;
        }
        attrs[ i ] = NULL;
 
-       ldap_add_s( lc->conns[ candidate ]->ld, mdn, attrs );
+       ldap_add_s( lc->conns[ candidate ]->ld, mdn.bv_val, attrs );
        for ( --i; i >= 0; --i ) {
+               free( attrs[ i ]->mod_vals.modv_bvals );
                free( attrs[ i ] );
        }
        free( attrs );
-       if ( mdn != e->e_dn ) {
-               free( mdn );
+       if ( mdn.bv_val != e->e_dn ) {
+               free( mdn.bv_val );
        }
        return meta_back_op_result( lc, op );
 }