]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/schema-map.c
cleanup error messages
[openldap] / servers / slapd / back-sql / schema-map.c
index f73114b3ed3005492486655de18bd383ab153c2e..092a0750f9b5a16c565fb050931d53b7f8509a9b 100644 (file)
 #include <stdio.h>
 #include <sys/types.h>
 #include "ac/string.h"
+
 #include "slap.h"
 #include "lber_pvt.h"
 #include "ldap_pvt.h"
-#include "back-sql.h"
-#include "sql-wrap.h"
-#include "schema-map.h"
-#include "util.h"
+#include "proto-sql.h"
 
 #define BACKSQL_DUPLICATE      (-1)
 
@@ -218,7 +216,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
        backsql_oc_map_rec      *oc_map;
        backsql_at_map_rec      *at_map;
 
-       Debug( LDAP_DEBUG_TRACE, "==>load_schema_map()\n", 0, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "==>backsql_load_schema_map()\n", 0, 0, 0 );
 
        /* 
         * TimesTen : See if the ldap_entries.dn_ru field exists in the schema
@@ -242,18 +240,18 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
 
        rc = backsql_Prepare( dbh, &oc_sth, si->oc_query, 0 );
        if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "error preparing oc_query: '%s'\n", 
                        si->oc_query, 0, 0 );
                backsql_PrintErrors( si->db_env, dbh, oc_sth, rc );
                return LDAP_OTHER;
        }
-       Debug( LDAP_DEBUG_TRACE, "load_schema_map(): at_query '%s'\n", 
+       Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): at_query '%s'\n", 
                        si->at_query, 0, 0 );
 
        rc = backsql_Prepare( dbh, &at_sth, si->at_query, 0 );
        if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "error preparing at_query: '%s'\n", 
                        si->at_query, 0, 0 );
                backsql_PrintErrors( si->db_env, dbh, at_sth, rc );
@@ -262,7 +260,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
 
        rc = backsql_BindParamID( at_sth, 1, &oc_id );
        if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "error binding param for at_query: \n", 0, 0, 0 );
                backsql_PrintErrors( si->db_env, dbh, at_sth, rc );
                return LDAP_OTHER;
@@ -270,7 +268,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
 
        rc = SQLExecute( oc_sth );
        if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "error executing oc_query: \n", 0, 0, 0 );
                backsql_PrintErrors( si->db_env, dbh, oc_sth, rc );
                return LDAP_OTHER;
@@ -288,7 +286,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
 
                oc_map->bom_oc = oc_find( oc_row.cols[ 1 ] );
                if ( oc_map->bom_oc == NULL ) {
-                       Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+                       Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                "objectClass '%s' is not defined in schema\n", 
                                oc_row.cols[ 1 ], 0, 0 );
                        return LDAP_OTHER;      /* undefined objectClass ? */
@@ -329,7 +327,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        return LDAP_OTHER;
                }
                oc_id = oc_map->bom_id;
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "objectClass '%s': keytbl='%s' keycol='%s'\n",
                        BACKSQL_OC_NAME( oc_map ),
                        oc_map->bom_keytbl.bv_val, oc_map->bom_keycol.bv_val );
@@ -350,13 +348,13 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        BACKSQL_IS_ADD( oc_map->bom_expect_return ), 
                        BACKSQL_IS_DEL( oc_map->bom_expect_return ), 0 );
 
-               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                        "autoadding 'objectClass' and 'ref' mappings\n",
                        0, 0, 0 );
                backsql_add_sysmaps( oc_map );
                rc = SQLExecute( at_sth );
                if ( rc != SQL_SUCCESS ) {
-                       Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+                       Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                "error executing at_query: \n", 0, 0, 0 );
                        backsql_PrintErrors( SQL_NULL_HENV, dbh, at_sth, rc );
                        return LDAP_OTHER;
@@ -369,26 +367,28 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        struct berval   bv;
                        struct berbuf   bb = BB_NULL;
 
-                       Debug( LDAP_DEBUG_TRACE, "********'%s'\n",
-                               at_row.cols[ 0 ], 0, 0 );
                        Debug( LDAP_DEBUG_TRACE, 
-                               "name='%s',sel_expr='%s' from='%s'",
+                               "attributeType:\n"
+                               "\tname='%s'\n"
+                               "\tsel_expr='%s'\n"
+                               "\tfrom='%s'\n",
                                at_row.cols[ 0 ], at_row.cols[ 1 ],
                                at_row.cols[ 2 ] );
                        Debug( LDAP_DEBUG_TRACE, 
-                               "join_where='%s',add_proc='%s'",
-                               at_row.cols[ 3 ], at_row.cols[ 4 ], 0 );
-                       Debug( LDAP_DEBUG_TRACE, "delete_proc='%s'\n",
-                                       at_row.cols[ 5 ], 0, 0 );
+                               "\tjoin_where='%s'\n"
+                               "\tadd_proc='%s'\n"
+                               "\tdelete_proc='%s'\n",
+                               at_row.cols[ 3 ], at_row.cols[ 4 ],
+                               at_row.cols[ 5 ]);
                        /* TimesTen */
-                       Debug( LDAP_DEBUG_TRACE, "sel_expr_u='%s'\n",
+                       Debug( LDAP_DEBUG_TRACE, "\tsel_expr_u='%s'\n",
                                        at_row.cols[ 8 ], 0, 0 );
                        at_map = (backsql_at_map_rec *)ch_calloc( 1,
                                        sizeof( backsql_at_map_rec ) );
                        rc = slap_str2ad( at_row.cols[ 0 ], 
                                        &at_map->bam_ad, &text );
                        if ( rc != LDAP_SUCCESS ) {
-                               Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+                               Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                        "attribute '%s' for objectClass '%s' "
                                        "is not defined in schema: %s\n", 
                                        at_row.cols[ 0 ],
@@ -428,7 +428,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                        at_map->bam_expect_return = strtol( at_row.cols[ 7 ],
                                        NULL, 0 );
                        backsql_make_attr_query( oc_map, at_map );
-                       Debug( LDAP_DEBUG_TRACE, "load_schema_map(): "
+                       Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                "preconstructed query '%s'\n",
                                at_map->bam_query, 0, 0 );
                        at_map->bam_next = NULL;
@@ -439,6 +439,17 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                                                at_map->bam_ad->ad_cname.bv_val,
                                                oc_map->bom_oc->soc_cname.bv_val, 0 );
                        }
+
+                       if ( si->upper_func.bv_val && at_map->bam_sel_expr_u.bv_val == NULL ) {
+                               struct berbuf   bb = BB_NULL;
+
+                               backsql_strfcat( &bb, "bcbc",
+                                               &si->upper_func,
+                                               '(' /* ) */ ,
+                                               &at_map->bam_sel_expr,
+                                               /* ( */ ')' );
+                               at_map->bam_sel_expr_u = bb.bb_val;
+                       }
                }
                backsql_FreeRow( &at_row );
                SQLFreeStmt( at_sth, SQL_CLOSE );
@@ -447,7 +458,7 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
        SQLFreeStmt( at_sth, SQL_DROP );
        SQLFreeStmt( oc_sth, SQL_DROP );
        si->bsql_flags |= BSQLF_SCHEMA_LOADED;
-       Debug( LDAP_DEBUG_TRACE, "<==load_schema_map()\n", 0, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<==backsql_load_schema_map()\n", 0, 0, 0 );
        return LDAP_SUCCESS;
 }
 
@@ -567,43 +578,71 @@ backsql_ad2at( backsql_oc_map_rec* objclass, AttributeDescription *ad )
        return res;
 }
 
-#if 0
+/* attributeType inheritance */
+struct supad2at_t {
+       backsql_at_map_rec      **ret;
+       AttributeDescription    *ad;
+       unsigned                n;
+};
+
+#define SUPAD2AT_STOP  (-1)
+
+static int
+supad2at_f( void *v_at, void *v_arg )
+{
+       backsql_at_map_rec      *at = (backsql_at_map_rec *)v_at;
+       struct supad2at_t       *va = (struct supad2at_t *)v_arg;
+
+       if ( is_at_subtype( at->bam_ad->ad_type, va->ad->ad_type ) ) {
+               backsql_at_map_rec      **ret;
+
+               ret = ch_realloc( va->ret, sizeof( backsql_at_map_rec *) * ( va->n + 2 ) );
+               if ( ret == NULL ) {
+                       ch_free( va->ret );
+                       return SUPAD2AT_STOP;
+               }
+
+               ret[ va->n ] = at;
+               va->n++;
+               ret[ va->n ] = NULL;
+               va->ret = ret;
+       }
+
+       return 0;
+}
+
 /*
- * Deprecated
+ * stores in *pret a NULL terminated array of pointers
+ * to backsql_at_map_rec whose attributeType is supad->ad_type 
+ * or derived from it
  */
-backsql_at_map_rec *
-backsql_name2at( backsql_oc_map_rec* objclass, struct berval *attr )
+int
+backsql_supad2at( backsql_oc_map_rec *objclass, AttributeDescription *supad,
+               backsql_at_map_rec ***pret )
 {
-       backsql_at_map_rec      tmp, *res;
-       const char              *text = NULL;
-#ifdef BACKSQL_TRACE
-       Debug( LDAP_DEBUG_TRACE, "==>backsql_name2at(): "
-               "searching for attribute '%s' for objectclass '%s'\n",
-               attr, BACKSQL_OC_NAME( objclass ), 0 );
-#endif /* BACKSQL_TRACE */
+       struct supad2at_t       va;
+       int                     rc;
 
-       if ( slap_bv2ad( attr, &tmp.bam_ad, &text ) != LDAP_SUCCESS ) {
-               return NULL;
-       }
+       assert( objclass );
+       assert( supad );
+       assert( pret );
 
-       res = (backsql_at_map_rec *)avl_find( objclass->bom_attrs, &tmp,
-                       backsql_cmp_attr );
+       *pret = NULL;
 
-#ifdef BACKSQL_TRACE
-       if ( res != NULL ) {
-               Debug( LDAP_DEBUG_TRACE, "<==backsql_name2at(): "
-                       "found name='%s', sel_expr='%s'\n",
-                       res->bam_name, res->bam_sel_expr.bv_val, 0 );
-       } else {
-               Debug( LDAP_DEBUG_TRACE, "<==backsql_name2at(): "
-                       "not found\n", 0, 0, 0 );
+       va.ret = NULL;
+       va.ad = supad;
+       va.n = 0;
+       
+       rc = avl_apply( objclass->bom_attrs, supad2at_f, &va,
+                       SUPAD2AT_STOP, AVL_INORDER );
+       if ( rc == SUPAD2AT_STOP ) {
+               return -1;
        }
-#endif /* BACKSQL_TRACE */
 
-       return res;
+       *pret = va.ret;
+
+       return 0;
 }
-#endif
 
 static void
 backsql_free_attr( void *v_at )