#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)
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
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 );
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;
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;
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 ? */
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 );
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;
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 ],
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;
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 );
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;
}
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 )