]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/entry-id.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / back-sql / entry-id.c
index b86fc477a5372d251563e84dadf27c0feb1a9677..9e7974228cea689497f8ae791cef87c4c12cd109 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2007 The OpenLDAP Foundation.
+ * Copyright 1999-2012 The OpenLDAP Foundation.
  * Portions Copyright 1999 Dmitry Kovalev.
  * Portions Copyright 2002 Pierangelo Masarati.
  * Portions Copyright 2004 Mark Adamson.
@@ -58,6 +58,7 @@ backsql_entryID_dup( backsql_entryID *src, void *ctx )
        dst->eid_keyval = src->eid_keyval;
 #endif /* ! BACKSQL_ARBITRARY_KEY */
 
+       dst->eid_oc = src->eid_oc;
        dst->eid_oc_id = src->eid_oc_id;
 
        return dst;
@@ -181,9 +182,9 @@ backsql_dn2id(
        }
        
        /* begin TimesTen */
+       assert( bi->sql_id_query != NULL );
        Debug( LDAP_DEBUG_TRACE, "   backsql_dn2id(\"%s\"): id_query \"%s\"\n",
                        ndn->bv_val, bi->sql_id_query, 0 );
-       assert( bi->sql_id_query != NULL );
        rc = backsql_Prepare( dbh, &sth, bi->sql_id_query, 0 );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE, 
@@ -287,16 +288,16 @@ backsql_dn2id(
                        ber_str2bv_x( row.cols[ 1 ], 0, 1, &id->eid_keyval,
                                        op->o_tmpmemctx );
 #else /* ! BACKSQL_ARBITRARY_KEY */
-                       if ( lutil_atoulx( &id->eid_id, row.cols[ 0 ], 0 ) != 0 ) {
+                       if ( BACKSQL_STR2ID( &id->eid_id, row.cols[ 0 ], 0 ) != 0 ) {
                                res = LDAP_OTHER;
                                goto done;
                        }
-                       if ( lutil_atoulx( &id->eid_keyval, row.cols[ 1 ], 0 ) != 0 ) {
+                       if ( BACKSQL_STR2ID( &id->eid_keyval, row.cols[ 1 ], 0 ) != 0 ) {
                                res = LDAP_OTHER;
                                goto done;
                        }
 #endif /* ! BACKSQL_ARBITRARY_KEY */
-                       if ( lutil_atoulx( &id->eid_oc_id, row.cols[ 2 ], 0 ) != 0 ) {
+                       if ( BACKSQL_STR2ID( &id->eid_oc_id, row.cols[ 2 ], 0 ) != 0 ) {
                                res = LDAP_OTHER;
                                goto done;
                        }
@@ -405,9 +406,9 @@ backsql_count_children(
        }
        
        /* begin TimesTen */
+       assert( bi->sql_has_children_query != NULL );
        Debug(LDAP_DEBUG_TRACE, "children id query \"%s\"\n", 
                        bi->sql_has_children_query, 0, 0);
-       assert( bi->sql_has_children_query != NULL );
        rc = backsql_Prepare( dbh, &sth, bi->sql_has_children_query, 0 );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE, 
@@ -506,7 +507,7 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
 {
        backsql_at_map_rec      *at = v_at;
        backsql_srch_info       *bsi = v_bsi;
-       backsql_info            *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
+       backsql_info            *bi;
        RETCODE                 rc;
        SQLHSTMT                sth = SQL_NULL_HSTMT;
        BACKSQL_ROW_NTS         row;
@@ -530,18 +531,12 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
 
        assert( at != NULL );
        assert( bsi != NULL );
-
-#ifdef BACKSQL_ARBITRARY_KEY
-       Debug( LDAP_DEBUG_TRACE, "==>backsql_get_attr_vals(): "
-               "oc=\"%s\" attr=\"%s\" keyval=%s\n",
-               BACKSQL_OC_NAME( bsi->bsi_oc ), at->bam_ad->ad_cname.bv_val, 
-               bsi->bsi_c_eid->eid_keyval.bv_val );
-#else /* ! BACKSQL_ARBITRARY_KEY */
        Debug( LDAP_DEBUG_TRACE, "==>backsql_get_attr_vals(): "
-               "oc=\"%s\" attr=\"%s\" keyval=%ld\n",
+               "oc=\"%s\" attr=\"%s\" keyval=" BACKSQL_IDFMT "\n",
                BACKSQL_OC_NAME( bsi->bsi_oc ), at->bam_ad->ad_cname.bv_val, 
-               bsi->bsi_c_eid->eid_keyval );
-#endif /* ! BACKSQL_ARBITRARY_KEY */
+               BACKSQL_IDARG(bsi->bsi_c_eid->eid_keyval) );
+
+       bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
 
 #ifdef BACKSQL_PRETTY_VALIDATE
        validate = at->bam_true_ad->ad_type->sat_syntax->ssyn_validate;
@@ -616,8 +611,7 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
                BerVarray       tmp;
 
                if ( attr->a_vals != NULL ) {
-                       for ( ; !BER_BVISNULL( &attr->a_vals[ oldcount ] ); oldcount++ )
-                               /* just count */ ;
+                       oldcount = attr->a_numvals;
                }
 
                tmp = ch_realloc( attr->a_vals, ( oldcount + count + 1 ) * sizeof( struct berval ) );
@@ -638,19 +632,20 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
                } else {
                        attr->a_nvals = attr->a_vals;
                }
+               attr->a_numvals += count;
 
        } else {
                append = 1;
 
                /* Make space for the array of values */
                attr = attr_alloc( at->bam_true_ad );
+               attr->a_numvals = count;
                attr->a_vals = ch_calloc( count + 1, sizeof( struct berval ) );
                if ( attr->a_vals == NULL ) {
                        Debug( LDAP_DEBUG_TRACE, "Out of memory!\n", 0,0,0 );
                        ch_free( attr );
                        return 1;
                }
-               memset( attr->a_vals, 0, ( count + 1 ) * sizeof( struct berval ) );
                if ( normfunc ) {
                        attr->a_nvals = ch_calloc( count + 1, sizeof( struct berval ) );
                        if ( attr->a_nvals == NULL ) {
@@ -658,8 +653,6 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
                                ch_free( attr );
                                return 1;
 
-                       } else {
-                               memset( attr->a_nvals, 0, ( count + 1 ) * sizeof( struct berval ) );
                        }
 
                } else {
@@ -695,15 +688,9 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
        }
 
 #ifdef BACKSQL_TRACE
-#ifdef BACKSQL_ARBITRARY_KEY
-       Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "
-               "query=\"%s\" keyval=%s\n", at->bam_query,
-               bsi->bsi_c_eid->eid_keyval.bv_val, 0 );
-#else /* !BACKSQL_ARBITRARY_KEY */
        Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "
-               "query=\"%s\" keyval=%d\n", at->bam_query,
-               bsi->bsi_c_eid->eid_keyval, 0 );
-#endif /* ! BACKSQL_ARBITRARY_KEY */
+               "query=\"%s\" keyval=" BACKSQL_IDFMT "\n", at->bam_query,
+               BACKSQL_IDARG(bsi->bsi_c_eid->eid_keyval), 0 );
 #endif /* BACKSQL_TRACE */
 
        rc = SQLExecute( sth );
@@ -935,28 +922,30 @@ backsql_id2entry( backsql_srch_info *bsi, backsql_entryID *eid )
        memset( bsi->bsi_e, 0, sizeof( Entry ) );
 
        if ( bi->sql_baseObject && BACKSQL_IS_BASEOBJECT_ID( &eid->eid_id ) ) {
-               Entry   *e;
-
-               e = entry_dup( bi->sql_baseObject );
-               if ( e == NULL ) {
-                       return LDAP_NO_MEMORY;
-               }
-                       
-               *bsi->bsi_e = *e;
-               free( e );
+               (void)entry_dup2( bsi->bsi_e, bi->sql_baseObject );
                goto done;
        }
 
-       ber_dupbv_x( &bsi->bsi_e->e_name, &eid->eid_dn, op->o_tmpmemctx );
-       ber_dupbv_x( &bsi->bsi_e->e_nname, &eid->eid_ndn, op->o_tmpmemctx );
-
        bsi->bsi_e->e_attrs = NULL;
        bsi->bsi_e->e_private = NULL;
 
-       bsi->bsi_oc = backsql_id2oc( bsi->bsi_op->o_bd->be_private,
+       if ( eid->eid_oc == NULL ) {
+               eid->eid_oc = backsql_id2oc( bsi->bsi_op->o_bd->be_private,
                        eid->eid_oc_id );
+               if ( eid->eid_oc == NULL ) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "backsql_id2entry(): unable to fetch objectClass with id=" BACKSQL_IDNUMFMT " for entry id=" BACKSQL_IDFMT " dn=\"%s\"\n",
+                               eid->eid_oc_id, BACKSQL_IDARG(eid->eid_id),
+                               eid->eid_dn.bv_val );
+                       return LDAP_OTHER;
+               }
+       }
+       bsi->bsi_oc = eid->eid_oc;
        bsi->bsi_c_eid = eid;
 
+       ber_dupbv_x( &bsi->bsi_e->e_name, &eid->eid_dn, op->o_tmpmemctx );
+       ber_dupbv_x( &bsi->bsi_e->e_nname, &eid->eid_ndn, op->o_tmpmemctx );
+
 #ifndef BACKSQL_ARBITRARY_KEY  
        /* FIXME: unused */
        bsi->bsi_e->e_id = eid->eid_id;
@@ -1040,7 +1029,7 @@ next:;
        }
 
        if ( ( bsi->bsi_flags & BSQL_SF_ALL_OPER )
-                       || an_find( bsi->bsi_attrs, &AllOper )
+                       || an_find( bsi->bsi_attrs, slap_bv_all_operational_attrs )
                        || an_find( bsi->bsi_attrs, &slap_schema.si_ad_structuralObjectClass->ad_cname ) )
        {
                ObjectClass     *soc = NULL;