]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/schema-map.c
Don't pass NULL DN to rewrite_session(), causes assertion failure
[openldap] / servers / slapd / back-sql / schema-map.c
index d3a7956dcda41e3ce1115b8e08894019d7edceb1..6244955033b07ae2c8fff893139481c4c54277c2 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <stdio.h>
 #include <sys/types.h>
-#include <string.h>
+#include "ac/string.h"
 #include "slap.h"
 #include "lber_pvt.h"
 #include "ldap_pvt.h"
  * Uses the pointer to the ObjectClass structure
  */
 static int
-backsql_cmp_oc( backsql_oc_map_rec *m1, backsql_oc_map_rec *m2 )
+backsql_cmp_oc( const void *v_m1, const void *v_m2 )
 {
+       const backsql_oc_map_rec *m1 = v_m1, *m2 = v_m2;
        return ( m1->oc < m2->oc ? -1 : ( m1->oc > m2->oc ? 1 : 0 ) );
 }
 
 static int
-backsql_cmp_oc_id( backsql_oc_map_rec *m1, backsql_oc_map_rec *m2 )
+backsql_cmp_oc_id( const void *v_m1, const void *v_m2 )
 {
+       const backsql_oc_map_rec *m1 = v_m1, *m2 = v_m2;
        return ( m1->id < m2->id ? -1 : ( m1->id > m2->id ? 1 : 0 ) );
 }
 
@@ -41,8 +43,9 @@ backsql_cmp_oc_id( backsql_oc_map_rec *m1, backsql_oc_map_rec *m2 )
  * Uses the pointer to the AttributeDescription structure
  */
 static int
-backsql_cmp_attr( backsql_at_map_rec *m1, backsql_at_map_rec *m2 )
+backsql_cmp_attr( const void *v_m1, const void *v_m2 )
 {
+       const backsql_at_map_rec *m1 = v_m1, *m2 = v_m2;
        return ( m1->ad < m2->ad ? -1 : ( m1->ad > m2->ad ? 1 : 0 ) );
 }
 
@@ -116,8 +119,7 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
        at_map->param_order = 0;
        at_map->expect_return = 0;
        backsql_make_attr_query( oc_map, at_map );
-       avl_insert( &oc_map->attrs, at_map, 
-                       (AVL_CMP)backsql_cmp_attr, NULL );
+       avl_insert( &oc_map->attrs, at_map, backsql_cmp_attr, NULL );
 
        at_map = (backsql_at_map_rec *)ch_calloc( 1, 
                        sizeof( backsql_at_map_rec ) );
@@ -145,8 +147,7 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
        at_map->param_order = 0;
        at_map->expect_return = 0;
        backsql_make_attr_query( oc_map, at_map );
-       avl_insert( &oc_map->attrs, at_map, 
-                       (AVL_CMP)backsql_cmp_attr, NULL );
+       avl_insert( &oc_map->attrs, at_map, backsql_cmp_attr, NULL );
 
        return 1;
 }
@@ -239,16 +240,16 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                
                ber_str2bv( oc_row.cols[ 2 ], 0, 1, &oc_map->keytbl );
                ber_str2bv( oc_row.cols[ 3 ], 0, 1, &oc_map->keycol );
-               oc_map->create_proc = ( oc_row.is_null[ 4 ] < 0 ) ? NULL 
+               oc_map->create_proc = ( oc_row.value_len[ 4 ] < 0 ) ? NULL 
                        : ch_strdup( oc_row.cols[ 4 ] );
 
                colnum = 5;
                if ( BACKSQL_CREATE_NEEDS_SELECT( si ) ) {
                        colnum = 6;
-                       oc_map->create_keyval = ( oc_row.is_null[ 5 ] < 0 ) 
+                       oc_map->create_keyval = ( oc_row.value_len[ 5 ] < 0 ) 
                                ? NULL : ch_strdup( oc_row.cols[ 5 ] );
                }
-               oc_map->delete_proc = ( oc_row.is_null[ colnum ] < 0 ) ? NULL 
+               oc_map->delete_proc = ( oc_row.value_len[ colnum ] < 0 ) ? NULL 
                        : ch_strdup( oc_row.cols[ colnum ] );
                oc_map->expect_return = strtol( oc_row.cols[ colnum + 1 ], 
                                NULL, 0 );
@@ -259,10 +260,8 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                 */
 
                oc_map->attrs = NULL;
-               avl_insert( &si->oc_by_oc, oc_map,
-                               (AVL_CMP)backsql_cmp_oc, NULL );
-               avl_insert( &si->oc_by_id, oc_map,
-                               (AVL_CMP)backsql_cmp_oc_id, NULL );
+               avl_insert( &si->oc_by_oc, oc_map, backsql_cmp_oc, NULL );
+               avl_insert( &si->oc_by_id, oc_map, backsql_cmp_oc_id, NULL );
                oc_id = oc_map->id;
                Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
                        "objectClass '%s': keytbl='%s' keycol='%s'\n",
@@ -326,13 +325,13 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                                Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
                                        "attribute '%s' for objectClass '%s' "
                                        "is not defined in schema: %s\n", 
-                                       at_map->ad->ad_cname.bv_val, 
+                                       at_row.cols[ 0 ],
                                        BACKSQL_OC_NAME( oc_map ), text );
                                return LDAP_CONSTRAINT_VIOLATION;
                        }
                                
                        ber_str2bv( at_row.cols[ 1 ], 0, 1, &at_map->sel_expr );
-                       if ( at_row.is_null[ 8 ] < 0 ) {
+                       if ( at_row.value_len[ 8 ] < 0 ) {
                                at_map->sel_expr_u.bv_val = NULL;
                                at_map->sel_expr_u.bv_len = 0;
                        } else {
@@ -343,17 +342,22 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        ber_str2bv( at_row.cols[ 2 ], 0, 0, &bv );
                        backsql_merge_from_clause( &at_map->from_tbls, 
                                        &tmpslen, &bv );
-                       if ( at_row.is_null[ 3 ] < 0 ) {
+                       if ( at_row.value_len[ 3 ] < 0 ) {
                                at_map->join_where.bv_val = NULL;
                                at_map->join_where.bv_len = 0;
                        } else {
                                ber_str2bv( at_row.cols[ 3 ], 0, 1, 
                                                &at_map->join_where );
                        }
-                       at_map->add_proc = ( at_row.is_null[ 4 ] < 0 ) ? NULL
-                               : ch_strdup( at_row.cols[4] );
-                       at_map->delete_proc = ( at_row.is_null[ 5 ] < 0 ) ? NULL
-                               : ch_strdup( at_row.cols[ 5 ] );
+                       at_map->add_proc = NULL;
+                       if ( at_row.value_len[ 4 ] > 0 ) {
+                               at_map->add_proc = ch_strdup( at_row.cols[4] );
+                       }
+                       at_map->delete_proc = NULL;
+                       if ( at_row.value_len[ 5 ] > 0 ) {
+                               at_map->delete_proc
+                                       = ch_strdup( at_row.cols[ 5 ] );
+                       }
                        at_map->param_order = strtol( at_row.cols[ 6 ], 
                                        NULL, 0 );
                        at_map->expect_return = strtol( at_row.cols[ 7 ],
@@ -362,8 +366,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
                                "preconstructed query '%s'\n",
                                at_map->query, 0, 0 );
-                       avl_insert( &oc_map->attrs, at_map, 
-                                       (AVL_CMP)backsql_cmp_attr, NULL );
+                       avl_insert( &oc_map->attrs, at_map, backsql_cmp_attr, NULL );
                }
                backsql_FreeRow( &at_row );
                SQLFreeStmt( at_sth, SQL_CLOSE );
@@ -388,8 +391,7 @@ backsql_oc2oc( backsql_info *si, ObjectClass *oc )
 #endif /* BACKSQL_TRACE */
 
        tmp.oc = oc;
-       res = (backsql_oc_map_rec *)avl_find( si->oc_by_oc, &tmp,
-                       (AVL_CMP)backsql_cmp_oc );
+       res = (backsql_oc_map_rec *)avl_find( si->oc_by_oc, &tmp, backsql_cmp_oc );
 #ifdef BACKSQL_TRACE
        if ( res != NULL ) {
                Debug( LDAP_DEBUG_TRACE, "<==backsql_oc2oc(): "
@@ -420,8 +422,7 @@ backsql_name2oc( backsql_info *si, struct berval *oc_name )
                return NULL;
        }
 
-       res = (backsql_oc_map_rec *)avl_find( si->oc_by_oc, &tmp,
-                       (AVL_CMP)backsql_cmp_oc );
+       res = (backsql_oc_map_rec *)avl_find( si->oc_by_oc, &tmp, backsql_cmp_oc );
 #ifdef BACKSQL_TRACE
        if ( res != NULL ) {
                Debug( LDAP_DEBUG_TRACE, "<==oc_with_name(): "
@@ -448,7 +449,7 @@ backsql_id2oc( backsql_info *si, unsigned long id )
 
        tmp.id = id;
        res = (backsql_oc_map_rec *)avl_find( si->oc_by_id, &tmp,
-                       (AVL_CMP)backsql_cmp_oc_id );
+                       backsql_cmp_oc_id );
 
 #ifdef BACKSQL_TRACE
        if ( res != NULL ) {
@@ -477,7 +478,7 @@ backsql_ad2at( backsql_oc_map_rec* objclass, AttributeDescription *ad )
 
        tmp.ad = ad;
        res = (backsql_at_map_rec *)avl_find( objclass->attrs, &tmp,
-                       (AVL_CMP)backsql_cmp_attr );
+                       backsql_cmp_attr );
 
 #ifdef BACKSQL_TRACE
        if ( res != NULL ) {
@@ -513,7 +514,7 @@ backsql_name2at( backsql_oc_map_rec* objclass, struct berval *attr )
        }
 
        res = (backsql_at_map_rec *)avl_find( objclass->attrs, &tmp,
-                       (AVL_CMP)backsql_cmp_attr );
+                       backsql_cmp_attr );
 
 #ifdef BACKSQL_TRACE
        if ( res != NULL ) {
@@ -530,8 +531,9 @@ backsql_name2at( backsql_oc_map_rec* objclass, struct berval *attr )
 }
 
 static void
-backsql_free_attr( backsql_at_map_rec *at )
+backsql_free_attr( void *v_at )
 {
+       backsql_at_map_rec *at = v_at;
        Debug( LDAP_DEBUG_TRACE, "==>free_attr(): '%s'\n", 
                        at->ad->ad_cname.bv_val, 0, 0 );
        ch_free( at->sel_expr.bv_val );
@@ -562,11 +564,12 @@ backsql_free_attr( backsql_at_map_rec *at )
 }
 
 static void
-backsql_free_oc( backsql_oc_map_rec *oc )
+backsql_free_oc( void *v_oc )
 {
+       backsql_oc_map_rec *oc = v_oc;
        Debug( LDAP_DEBUG_TRACE, "==>free_oc(): '%s'\n", 
                        BACKSQL_OC_NAME( oc ), 0, 0 );
-       avl_free( oc->attrs, (AVL_FREE)backsql_free_attr );
+       avl_free( oc->attrs, backsql_free_attr );
        ch_free( oc->keytbl.bv_val );
        ch_free( oc->keycol.bv_val );
        if ( oc->create_proc != NULL ) {
@@ -587,8 +590,8 @@ int
 backsql_destroy_schema_map( backsql_info *si )
 {
        Debug( LDAP_DEBUG_TRACE, "==>destroy_schema_map()\n", 0, 0, 0 );
-       avl_free( si->oc_by_oc, NULL );
-       avl_free( si->oc_by_id, (AVL_FREE)backsql_free_oc );
+       avl_free( si->oc_by_oc, 0 );
+       avl_free( si->oc_by_id, backsql_free_oc );
        Debug( LDAP_DEBUG_TRACE, "<==destroy_schema_map()\n", 0, 0, 0 );
        return 0;
 }