]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/schema-map.c
cleanup
[openldap] / servers / slapd / back-sql / schema-map.c
index 1d9c85c5e3c6bdd7283bcbc0074e0bbeaa53005d..3f75bb84ad5f4a8fccd3ed26822a4a80ada6a80a 100644 (file)
@@ -33,6 +33,8 @@
 #include "schema-map.h"
 #include "util.h"
 
+#define BACKSQL_DUPLICATE      (-1)
+
 /*
  * Uses the pointer to the ObjectClass structure
  */
@@ -63,16 +65,6 @@ backsql_cmp_attr( const void *v_m1, const void *v_m2 )
        return SLAP_PTRCMP( m1->bam_ad, m2->bam_ad );
 }
 
-/*
- * Dummy duplicate handling function (required by avl_insert)
- */
-#define BACKSQL_DUPLICATE      (-1)
-static int
-backsql_dup_dummy(void *p1, void *p2)
-{
-       return BACKSQL_DUPLICATE;
-}
-
 int
 backsql_dup_attr( void *v_m1, void *v_m2 )
 {
@@ -324,13 +316,13 @@ backsql_load_schema_map( backsql_info *si, SQLHDBC dbh )
                 */
 
                oc_map->bom_attrs = NULL;
-               if ( avl_insert( &si->oc_by_oc, oc_map, backsql_cmp_oc, backsql_dup_dummy ) == BACKSQL_DUPLICATE ) {
+               if ( avl_insert( &si->oc_by_oc, oc_map, backsql_cmp_oc, avl_dup_error ) == -1 ) {
                        Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                        "duplicate objectClass \"%s\" in objectClass map\n",
                                        oc_map->bom_oc->soc_cname.bv_val, 0, 0 );
                        return LDAP_OTHER;
                }
-               if ( avl_insert( &si->oc_by_id, oc_map, backsql_cmp_oc_id, backsql_dup_dummy ) == BACKSQL_DUPLICATE ) {
+               if ( avl_insert( &si->oc_by_id, oc_map, backsql_cmp_oc_id, avl_dup_error ) == -1 ) {
                        Debug( LDAP_DEBUG_TRACE, "backsql_load_schema_map(): "
                                        "duplicate objectClass \"%s\" in objectClass by ID map\n",
                                        oc_map->bom_oc->soc_cname.bv_val, 0, 0 );
@@ -575,43 +567,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 )