]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/init.c
Import ITS#4158 fixes from HEAD
[openldap] / servers / slapd / back-sql / init.c
index 840ef0989adae36be6c9db70786d341cdb4d6f3b..a0d3aa3c8f513e56756905fc094b3ba4f26e5eca 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2004 The OpenLDAP Foundation.
+ * Copyright 1999-2005 The OpenLDAP Foundation.
  * Portions Copyright 1999 Dmitry Kovalev.
  * All rights reserved.
  *
 
 #include <stdio.h>
 #include <sys/types.h>
+#include "ac/string.h"
+
 #include "slap.h"
 #include "ldap_pvt.h"
-#include "back-sql.h"
-#include "sql-wrap.h"
-#include "schema-map.h"
-#include "util.h"
+#include "proto-sql.h"
 
-#ifdef SLAPD_SQL_DYNAMIC
+#if SLAPD_SQL == SLAPD_MOD_DYNAMIC
 
 int
 init_module(
@@ -42,16 +41,16 @@ init_module(
 
        memset( &bi, '\0', sizeof( bi ) );
        bi.bi_type = "sql";
-       bi.bi_init = sql_back_initialize;
+       bi.bi_init = backsql_initialize;
 
        backend_add( &bi );
        return 0;
 }
 
-#endif /* SLAPD_SQL_DYNAMIC */
+#endif /* SLAPD_SQL == SLAPD_MOD_DYNAMIC */
 
 int
-sql_back_initialize(
+backsql_initialize(
        BackendInfo     *bi )
 { 
        static char *controls[] = {
@@ -96,7 +95,7 @@ sql_back_initialize(
  
        bi->bi_connection_init = 0;
        bi->bi_connection_destroy = backsql_connection_destroy;
-       
+
        Debug( LDAP_DEBUG_TRACE,"<==backsql_initialize()\n", 0, 0, 0 );
        return 0;
 }
@@ -163,6 +162,8 @@ backsql_db_destroy(
        free( si->at_query );
        free( si->insentry_query );
        free( si->delentry_query );
+       free( si->delobjclasses_query );
+       free( si->delreferrals_query );
        free( si );
        
        Debug( LDAP_DEBUG_TRACE, "<==backsql_db_destroy()\n", 0, 0, 0 );
@@ -178,7 +179,7 @@ backsql_db_open(
        ber_len_t       idq_len;
        struct berbuf   bb = BB_NULL;
 
-       Operation       otmp;
+       Operation       otmp = { 0 };
                
        Debug( LDAP_DEBUG_TRACE, "==>backsql_db_open(): "
                "testing RDBMS connection\n", 0, 0, 0 );
@@ -197,7 +198,7 @@ backsql_db_open(
                if ( backsql_split_pattern( backsql_def_concat_func, 
                                &si->concat_func, 2 ) ) {
                        Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                               "unable to parse pattern '%s'",
+                               "unable to parse pattern \"%s\"",
                                backsql_def_concat_func, 0, 0 );
                        return 1;
                }
@@ -231,6 +232,10 @@ backsql_db_open(
 
        /* normalize filter values only if necessary */
        si->bi_caseIgnoreMatch = mr_find( "caseIgnoreMatch" );
+       assert( si->bi_caseIgnoreMatch );
+
+       si->bi_telephoneNumberMatch = mr_find( "telephoneNumberMatch" );
+       assert( si->bi_telephoneNumberMatch );
 
        if ( si->dbuser == NULL ) {
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -245,9 +250,9 @@ backsql_db_open(
                 */
                struct berval   concat;
                struct berval   values[] = {
-                       { sizeof( "'%'" ) - 1,  "'%'" },
-                       { sizeof( "?" ) - 1,    "?" },
-                       { 0,                    NULL }
+                       BER_BVC( "'%'" ),
+                       BER_BVC( "?" ),
+                       BER_BVNULL
                };
                struct berbuf   bb = BB_NULL;
 
@@ -271,7 +276,7 @@ backsql_db_open(
 
                        backsql_strfcat( &bb, "blbbb",
                                        &si->upper_func,
-                                       (ber_len_t)sizeof( "(ldap_entries.dn) LIKE " ) - 1,
+                                       (ber_len_t)STRLENOF( "(ldap_entries.dn) LIKE " ),
                                                "(ldap_entries.dn) LIKE ",
                                        &si->upper_func_open,
                                        &concat,
@@ -284,7 +289,7 @@ backsql_db_open(
                         */
 
                        backsql_strfcat( &bb, "lb",
-                                       (ber_len_t)sizeof( "ldap_entries.dn LIKE " ) - 1,
+                                       (ber_len_t)STRLENOF( "ldap_entries.dn LIKE " ),
                                                "ldap_entries.dn LIKE ",
                                        &concat );
                }
@@ -292,7 +297,7 @@ backsql_db_open(
                si->subtree_cond = bb.bb_val;
                        
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' as default\n",
+                       "setting \"%s\" as default\n",
                        si->subtree_cond.bv_val, 0, 0 );
        }
 
@@ -307,10 +312,10 @@ backsql_db_open(
 
                        backsql_strfcat( &bb, "blbl",
                                        &si->upper_func,
-                                       (ber_len_t)sizeof( "(ldap_entries.dn)=" ) - 1,
+                                       (ber_len_t)STRLENOF( "(ldap_entries.dn)=" ),
                                                "(ldap_entries.dn)=",
                                        &si->upper_func,
-                                       (ber_len_t)sizeof( "(?)" ) - 1, "(?)" );
+                                       (ber_len_t)STRLENOF( "(?)" ), "(?)" );
 
                } else {
 
@@ -319,14 +324,14 @@ backsql_db_open(
                         */
 
                        backsql_strfcat( &bb, "l",
-                                       (ber_len_t)sizeof( "ldap_entries.dn=?" ) - 1,
+                                       (ber_len_t)STRLENOF( "ldap_entries.dn=?" ),
                                                "ldap_entries.dn=?");
                }
 
                si->children_cond = bb.bb_val;
                        
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' as default\n",
+                       "setting \"%s\" as default\n",
                        si->children_cond.bv_val, 0, 0 );
        }
 
@@ -344,7 +349,7 @@ backsql_db_open(
                        "(use \"oc_query\" directive in slapd.conf)\n", 
                        0, 0, 0 );
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' by default\n", si->oc_query, 0, 0 );
+                       "setting \"%s\" by default\n", si->oc_query, 0, 0 );
        }
        
        if ( si->at_query == NULL ) {
@@ -353,7 +358,7 @@ backsql_db_open(
                        "(use \"at_query\" directive in slapd.conf)\n",
                        0, 0, 0 );
                Debug(LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' by default\n",
+                       "setting \"%s\" by default\n",
                        backsql_def_at_query, 0, 0 );
                si->at_query = ch_strdup( backsql_def_at_query );
        }
@@ -364,7 +369,7 @@ backsql_db_open(
                        "(use \"insentry_query\" directive in slapd.conf)\n",
                        0, 0, 0 );
                Debug(LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' by default\n",
+                       "setting \"%s\" by default\n",
                        backsql_def_insentry_query, 0, 0 );
                si->insentry_query = ch_strdup( backsql_def_insentry_query );
        }
@@ -375,12 +380,34 @@ backsql_db_open(
                        "(use \"delentry_query\" directive in slapd.conf)\n",
                        0, 0, 0 );
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
-                       "setting '%s' by default\n",
+                       "setting \"%s\" by default\n",
                        backsql_def_delentry_query, 0, 0 );
                si->delentry_query = ch_strdup( backsql_def_delentry_query );
        }
 
-       otmp.o_connid = -1;
+       if ( si->delobjclasses_query == NULL ) {
+               Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
+                       "objclasses deletion SQL statement not specified "
+                       "(use \"delobjclasses_query\" directive in slapd.conf)\n",
+                       0, 0, 0 );
+               Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
+                       "setting \"%s\" by default\n",
+                       backsql_def_delobjclasses_query, 0, 0 );
+               si->delobjclasses_query = ch_strdup( backsql_def_delobjclasses_query );
+       }
+
+       if ( si->delreferrals_query == NULL ) {
+               Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
+                       "referrals deletion SQL statement not specified "
+                       "(use \"delreferrals_query\" directive in slapd.conf)\n",
+                       0, 0, 0 );
+               Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
+                       "setting \"%s\" by default\n",
+                       backsql_def_delreferrals_query, 0, 0 );
+               si->delreferrals_query = ch_strdup( backsql_def_delreferrals_query );
+       }
+
+       otmp.o_connid = (unsigned long)(-1);
        otmp.o_bd = bd;
        if ( backsql_get_db_conn( &otmp, &dbh ) != LDAP_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE, "backsql_db_open(): "
@@ -396,6 +423,7 @@ backsql_db_open(
 
        if ( si->upper_func.bv_val == NULL ) {
                backsql_strcat( &bb, backsql_id_query, "dn=?", NULL );
+
        } else {
                if ( BACKSQL_HAS_LDAPINFO_DN_RU( si ) ) {
                        backsql_strcat( &bb, backsql_id_query,
@@ -405,12 +433,12 @@ backsql_db_open(
                                backsql_strfcat( &bb, "sbl",
                                                backsql_id_query,
                                                &si->upper_func, 
-                                               (ber_len_t)sizeof( "(dn)=?" ) - 1, "(dn)=?" );
+                                               (ber_len_t)STRLENOF( "(dn)=?" ), "(dn)=?" );
                        } else {
                                backsql_strfcat( &bb, "sblbcb",
                                                backsql_id_query,
                                                &si->upper_func, 
-                                               (ber_len_t)sizeof( "(dn)=" ) - 1, "(dn)=",
+                                               (ber_len_t)STRLENOF( "(dn)=" ), "(dn)=",
                                                &si->upper_func_open, 
                                                '?', 
                                                &si->upper_func_close );
@@ -458,13 +486,14 @@ backsql_db_close(
 int
 backsql_connection_destroy( Backend *bd, Connection *c )
 {
-       Operation o;
+       Operation o = { 0 };
        o.o_bd = bd;
        o.o_connid = c->c_connid;
 
        Debug( LDAP_DEBUG_TRACE, "==>backsql_connection_destroy()\n", 0, 0, 0 );
        backsql_free_db_conn( &o );
        Debug( LDAP_DEBUG_TRACE, "<==backsql_connection_destroy()\n", 0, 0, 0 );
+
        return 0;
 }