]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/init.c
plug more leaks; few remain (but seem to be in ODBC)
[openldap] / servers / slapd / back-sql / init.c
index 678d106d411753a4d9bcb677e747bad58a7629f0..cf1c798cd323df02bbd92f4a562beeae21a7b117 100644 (file)
@@ -39,12 +39,9 @@ sql_back_initialize(
 #if 0 /* needs improvements */
                LDAP_CONTROL_NOOP,
 #endif
-#ifdef LDAP_CONTROL_X_TREE_DELETE
-               LDAP_CONTROL_X_TREE_DELETE,
-#endif /* LDAP_CONTROL_X_TREE_DELETE */
-#ifdef LDAP_CONTROL_VALUESRETURNFILTER
-               LDAP_CONTROL_VALUESRETURNFILTER,
-#endif /* LDAP_CONTROL_VALUESRETURNFILTER */
+#ifdef SLAP_CONTROL_X_TREE_DELETE
+               SLAP_CONTROL_X_TREE_DELETE,
+#endif /* SLAP_CONTROL_X_TREE_DELETE */
                NULL
        };
 
@@ -77,6 +74,7 @@ sql_back_initialize(
        bi->bi_chk_referrals = 0;
        bi->bi_operational = backsql_operational;
        bi->bi_entry_get_rw = backsql_entry_get;
+       bi->bi_entry_release_rw = backsql_entry_release;
  
        bi->bi_connection_init = 0;
        bi->bi_connection_destroy = backsql_connection_destroy;
@@ -101,7 +99,7 @@ backsql_db_init(
        backsql_info    *bi;
  
        Debug( LDAP_DEBUG_TRACE, "==>backsql_db_init()\n", 0, 0, 0 );
-       bi = (backsql_info *)ch_calloc( 1, sizeof( backsql_info ) );
+       bi = (backsql_info *)ch_malloc( sizeof( backsql_info ) );
        memset( bi, '\0', sizeof( backsql_info ) );
        ldap_pvt_thread_mutex_init( &bi->sql_dbconn_mutex );
        ldap_pvt_thread_mutex_init( &bi->sql_schema_mutex );
@@ -119,6 +117,7 @@ backsql_db_destroy(
        backsql_info    *bi = (backsql_info*)bd->be_private;
  
        Debug( LDAP_DEBUG_TRACE, "==>backsql_db_destroy()\n", 0, 0, 0 );
+
        ldap_pvt_thread_mutex_lock( &bi->sql_dbconn_mutex );
        backsql_free_db_env( bi );
        ldap_pvt_thread_mutex_unlock( &bi->sql_dbconn_mutex );
@@ -127,34 +126,76 @@ backsql_db_destroy(
        backsql_destroy_schema_map( bi );
        ldap_pvt_thread_mutex_unlock( &bi->sql_schema_mutex );
        ldap_pvt_thread_mutex_destroy( &bi->sql_schema_mutex );
-       free( bi->sql_dbname );
-       free( bi->sql_dbuser );
+
+       if ( bi->sql_dbname ) {
+               ch_free( bi->sql_dbname );
+       }
+       if ( bi->sql_dbuser ) {
+               ch_free( bi->sql_dbuser );
+       }
        if ( bi->sql_dbpasswd ) {
-               free( bi->sql_dbpasswd );
+               ch_free( bi->sql_dbpasswd );
        }
        if ( bi->sql_dbhost ) {
-               free( bi->sql_dbhost );
+               ch_free( bi->sql_dbhost );
        }
        if ( bi->sql_upper_func.bv_val ) {
-               free( bi->sql_upper_func.bv_val );
-               free( bi->sql_upper_func_open.bv_val );
-               free( bi->sql_upper_func_close.bv_val );
+               ch_free( bi->sql_upper_func.bv_val );
+               ch_free( bi->sql_upper_func_open.bv_val );
+               ch_free( bi->sql_upper_func_close.bv_val );
+       }
+       if ( bi->sql_concat_func ) {
+               ber_bvarray_free( bi->sql_concat_func );
+       }
+       if ( !BER_BVISNULL( &bi->sql_strcast_func ) ) {
+               ch_free( bi->sql_strcast_func.bv_val );
+       }
+       if ( !BER_BVISNULL( &bi->sql_children_cond ) ) {
+               ch_free( bi->sql_children_cond.bv_val );
+       }
+       if ( !BER_BVISNULL( &bi->sql_subtree_cond ) ) {
+               ch_free( bi->sql_subtree_cond.bv_val );
+       }
+       if ( !BER_BVISNULL( &bi->sql_dn_oc_aliasing ) ) {
+               ch_free( bi->sql_dn_oc_aliasing.bv_val );
+       }
+       if ( bi->sql_oc_query ) {
+               ch_free( bi->sql_oc_query );
+       }
+       if ( bi->sql_at_query ) {
+               ch_free( bi->sql_at_query );
+       }
+       if ( bi->sql_id_query ) {
+               ch_free( bi->sql_id_query );
+       }
+       if ( bi->sql_has_children_query ) {
+               ch_free( bi->sql_has_children_query );
+       }
+       if ( bi->sql_insentry_stmt ) {
+               ch_free( bi->sql_insentry_stmt );
+       }
+       if ( bi->sql_delentry_stmt ) {
+               ch_free( bi->sql_delentry_stmt );
+       }
+       if ( bi->sql_renentry_stmt ) {
+               ch_free( bi->sql_renentry_stmt );
+       }
+       if ( bi->sql_delobjclasses_stmt ) {
+               ch_free( bi->sql_delobjclasses_stmt );
+       }
+       if ( !BER_BVISNULL( &bi->sql_aliasing ) ) {
+               ch_free( bi->sql_aliasing.bv_val );
+       }
+       if ( !BER_BVISNULL( &bi->sql_aliasing_quote ) ) {
+               ch_free( bi->sql_aliasing_quote.bv_val );
        }
-       
-       free( bi->sql_subtree_cond.bv_val );
-       free( bi->sql_oc_query );
-       free( bi->sql_at_query );
-       free( bi->sql_insentry_stmt );
-       free( bi->sql_delentry_stmt );
-       free( bi->sql_renentry_stmt );
-       free( bi->sql_delobjclasses_stmt );
 
        if ( bi->sql_anlist ) {
                int     i;
 
-               for ( i = 0; !BER_BVISNULL( &bi->sql_anlist[i].an_name ); i++ )
+               for ( i = 0; !BER_BVISNULL( &bi->sql_anlist[ i ].an_name ); i++ )
                {
-                       ch_free( bi->sql_anlist[i].an_name.bv_val );
+                       ch_free( bi->sql_anlist[ i ].an_name.bv_val );
                }
                ch_free( bi->sql_anlist );
        }
@@ -163,7 +204,7 @@ backsql_db_destroy(
                entry_free( bi->sql_baseObject );
        }
        
-       free( bi );
+       ch_free( bi );
        
        Debug( LDAP_DEBUG_TRACE, "<==backsql_db_destroy()\n", 0, 0, 0 );
        return 0;
@@ -203,6 +244,21 @@ backsql_db_open(
                }
        }
 
+       /*
+        * see back-sql.h for default values
+        */
+       if ( BER_BVISNULL( &bi->sql_aliasing ) ) {
+               ber_str2bv( BACKSQL_ALIASING,
+                       STRLENOF( BACKSQL_ALIASING ),
+                       1, &bi->sql_aliasing );
+       }
+
+       if ( BER_BVISNULL( &bi->sql_aliasing_quote ) ) {
+               ber_str2bv( BACKSQL_ALIASING_QUOTE,
+                       STRLENOF( BACKSQL_ALIASING_QUOTE ),
+                       1, &bi->sql_aliasing_quote );
+       }
+
        /*
         * Prepare cast string as required
         */
@@ -231,10 +287,10 @@ backsql_db_open(
 
        /* normalize filter values only if necessary */
        bi->sql_caseIgnoreMatch = mr_find( "caseIgnoreMatch" );
-       assert( bi->sql_caseIgnoreMatch );
+       assert( bi->sql_caseIgnoreMatch != NULL );
 
        bi->sql_telephoneNumberMatch = mr_find( "telephoneNumberMatch" );
-       assert( bi->sql_telephoneNumberMatch );
+       assert( bi->sql_telephoneNumberMatch != NULL );
 
        if ( bi->sql_dbuser == NULL ) {
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -243,7 +299,7 @@ backsql_db_open(
                return 1;
        }
        
-       if ( bi->sql_subtree_cond.bv_val == NULL ) {
+       if ( BER_BVISNULL( &bi->sql_subtree_cond ) ) {
                /*
                 * Prepare concat function for subtree search condition
                 */
@@ -293,6 +349,8 @@ backsql_db_open(
                                        &concat );
                }
 
+               ch_free( concat.bv_val );
+
                bi->sql_subtree_cond = bb.bb_val;
                        
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -406,6 +464,7 @@ backsql_db_open(
                bi->sql_delobjclasses_stmt = ch_strdup( backsql_def_delobjclasses_stmt );
        }
 
+       /* This should just be to force schema loading */
        op->o_hdr = (Opheader *)&op[ 1 ];
        op->o_connid = (unsigned long)(-1);
        op->o_bd = bd;
@@ -414,6 +473,7 @@ backsql_db_open(
                        "connection failed, exiting\n", 0, 0, 0 );
                return 1;
        }
+       (void)backsql_free_db_conn( op );
 
        /*
         * Prepare ID selection query
@@ -447,20 +507,31 @@ backsql_db_open(
                bi->sql_id_query = bb.bb_val.bv_val;
        }
 
-               /*
+       /*
         * Prepare children ID selection query
         */
-       bi->sql_has_children_query = NULL;
-
-       bb.bb_val.bv_val = NULL;
-       bb.bb_val.bv_len = 0;
+       BER_BVZERO( &bb.bb_val );
        bb.bb_len = 0;
-       backsql_strfcat( &bb, "sb",
-                       "SELECT COUNT(distinct subordinates.id) FROM ldap_entries,ldap_entries subordinates WHERE subordinates.parent=ldap_entries.id AND ",
-
+       backsql_strfcat( &bb, "sbsb",
+                       "SELECT COUNT(distinct subordinates.id) "
+                       "FROM ldap_entries,ldap_entries ",
+                       &bi->sql_aliasing, "subordinates "
+                       "WHERE subordinates.parent=ldap_entries.id AND ",
                        &bi->sql_children_cond );
        bi->sql_has_children_query = bb.bb_val.bv_val;
  
+       /*
+        * Prepare DN and objectClass aliasing bit of query
+        */
+       BER_BVZERO( &bb.bb_val );
+       bb.bb_len = 0;
+       backsql_strfcat( &bb, "sbbsbsbbsb",
+                       " ", &bi->sql_aliasing, &bi->sql_aliasing_quote,
+                       "objectClass", &bi->sql_aliasing_quote,
+                       ",ldap_entries.dn ", &bi->sql_aliasing,
+                       &bi->sql_aliasing_quote, "dn", &bi->sql_aliasing_quote );
+       bi->sql_dn_oc_aliasing = bb.bb_val;
        backsql_free_db_conn( op );
        if ( !BACKSQL_SCHEMA_LOADED( bi ) ) {
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -476,6 +547,8 @@ backsql_db_open(
                /* enable if only one suffix is defined */
                bi->sql_flags |= BSQLF_USE_SUBTREE_SHORTCUT;
        }
+
+       bi->sql_flags |= BSQLF_CHECK_SCHEMA;
        
        Debug( LDAP_DEBUG_TRACE, "<==backsql_db_open(): "
                "test succeeded, schema map loaded\n", 0, 0, 0 );
@@ -494,6 +567,8 @@ backsql_db_close(
 int
 backsql_connection_destroy( Backend *bd, Connection *c )
 {
+       backsql_info    *bi = (backsql_info*)bd->be_private;
+
        char            opbuf[ OPERATION_BUFFER_SIZE ];
        Operation*      op = (Operation *)opbuf;