mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-25 09:09:54 -05:00
honor objectclass inheritance in filters + some cleanup
This commit is contained in:
parent
c3674e92f9
commit
354d8a183c
3 changed files with 271 additions and 227 deletions
|
|
@ -279,7 +279,7 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
|
|||
{
|
||||
backsql_at_map_rec *at = v_at;
|
||||
backsql_srch_info *bsi = v_bsi;
|
||||
backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private;
|
||||
backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
|
||||
RETCODE rc;
|
||||
SQLHSTMT sth;
|
||||
BACKSQL_ROW_NTS row;
|
||||
|
|
@ -290,18 +290,18 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
|
|||
|
||||
Debug( LDAP_DEBUG_TRACE, "==>backsql_get_attr_vals(): "
|
||||
"oc='%s' attr='%s' keyval=%ld\n",
|
||||
BACKSQL_OC_NAME( bsi->oc ), at->ad->ad_cname.bv_val,
|
||||
bsi->c_eid->keyval );
|
||||
BACKSQL_OC_NAME( bsi->bsi_oc ), at->ad->ad_cname.bv_val,
|
||||
bsi->bsi_c_eid->keyval );
|
||||
|
||||
rc = backsql_Prepare( bsi->dbh, &sth, at->query, 0 );
|
||||
rc = backsql_Prepare( bsi->bsi_dbh, &sth, at->query, 0 );
|
||||
if ( rc != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_values(): "
|
||||
"error preparing query: %s\n", at->query, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc );
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh, sth, rc );
|
||||
return 1;
|
||||
}
|
||||
|
||||
rc = backsql_BindParamID( sth, 1, &bsi->c_eid->keyval );
|
||||
rc = backsql_BindParamID( sth, 1, &bsi->bsi_c_eid->keyval );
|
||||
if ( rc != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_values(): "
|
||||
"error binding key value parameter\n", 0, 0, 0 );
|
||||
|
|
@ -313,7 +313,7 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
|
|||
Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_values(): "
|
||||
"error executing attribute query '%s'\n",
|
||||
at->query, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc );
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh, sth, rc );
|
||||
SQLFreeStmt( sth, SQL_DROP );
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -336,9 +336,9 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
|
|||
*/
|
||||
bv.bv_len = strlen( row.cols[ i ] );
|
||||
#endif
|
||||
backsql_entry_addattr( bsi->e,
|
||||
backsql_entry_addattr( bsi->bsi_e,
|
||||
&row.col_names[ i ], &bv,
|
||||
bsi->op->o_tmpmemctx );
|
||||
bsi->bsi_op->o_tmpmemctx );
|
||||
|
||||
#ifdef BACKSQL_TRACE
|
||||
Debug( LDAP_DEBUG_TRACE, "prec=%d\n",
|
||||
|
|
@ -370,30 +370,30 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
|
|||
Debug( LDAP_DEBUG_TRACE, "==>backsql_id2entry()\n", 0, 0, 0 );
|
||||
|
||||
rc = dnPrettyNormal( NULL, &eid->dn, &e->e_name, &e->e_nname,
|
||||
bsi->op->o_tmpmemctx );
|
||||
bsi->bsi_op->o_tmpmemctx );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bsi->oc = backsql_id2oc( bsi->op->o_bd->be_private, eid->oc_id );
|
||||
bsi->e = e;
|
||||
bsi->c_eid = eid;
|
||||
bsi->bsi_oc = backsql_id2oc( bsi->bsi_op->o_bd->be_private, eid->oc_id );
|
||||
bsi->bsi_e = e;
|
||||
bsi->bsi_c_eid = eid;
|
||||
e->e_attrs = NULL;
|
||||
e->e_private = NULL;
|
||||
|
||||
e->e_id = eid->id;
|
||||
|
||||
if ( bsi->attrs != NULL ) {
|
||||
if ( bsi->bsi_attrs != NULL ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "
|
||||
"custom attribute list\n", 0, 0, 0 );
|
||||
for ( i = 0; bsi->attrs[ i ].an_name.bv_val; i++ ) {
|
||||
AttributeName *attr = &bsi->attrs[ i ];
|
||||
for ( i = 0; bsi->bsi_attrs[ i ].an_name.bv_val; i++ ) {
|
||||
AttributeName *attr = &bsi->bsi_attrs[ i ];
|
||||
|
||||
if ( attr->an_desc == ad_oc ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
at = backsql_ad2at( bsi->oc, attr->an_desc );
|
||||
at = backsql_ad2at( bsi->bsi_oc, attr->an_desc );
|
||||
if ( at != NULL ) {
|
||||
backsql_get_attr_vals( at, bsi );
|
||||
} else {
|
||||
|
|
@ -401,19 +401,20 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
|
|||
"attribute '%s' is not defined "
|
||||
"for objectlass '%s'\n",
|
||||
attr->an_name.bv_val,
|
||||
BACKSQL_OC_NAME( bsi->oc ), 0 );
|
||||
BACKSQL_OC_NAME( bsi->bsi_oc ), 0 );
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "
|
||||
"retrieving all attributes\n", 0, 0, 0 );
|
||||
avl_apply( bsi->oc->attrs, backsql_get_attr_vals,
|
||||
avl_apply( bsi->bsi_oc->attrs, backsql_get_attr_vals,
|
||||
bsi, 0, AVL_INORDER );
|
||||
}
|
||||
|
||||
if ( attr_merge_normalize_one( bsi->e, ad_oc, &bsi->oc->oc->soc_cname,
|
||||
bsi->op->o_tmpmemctx ) ) {
|
||||
if ( attr_merge_normalize_one( bsi->bsi_e, ad_oc,
|
||||
&bsi->bsi_oc->oc->soc_cname,
|
||||
bsi->bsi_op->o_tmpmemctx ) ) {
|
||||
entry_free( e );
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -426,7 +427,7 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
|
|||
struct berval soc;
|
||||
int rc;
|
||||
|
||||
bv[ 0 ] = bsi->oc->oc->soc_cname;
|
||||
bv[ 0 ] = bsi->bsi_oc->oc->soc_cname;
|
||||
bv[ 1 ].bv_val = NULL;
|
||||
|
||||
rc = structural_class( bv, &soc, NULL,
|
||||
|
|
@ -437,10 +438,10 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
|
|||
}
|
||||
|
||||
if ( ( bsi->bsi_flags | BSQL_SF_ALL_OPER )
|
||||
|| an_find( bsi->attrs, &AllOper ) ) {
|
||||
rc = attr_merge_normalize_one( bsi->e,
|
||||
|| an_find( bsi->bsi_attrs, &AllOper ) ) {
|
||||
rc = attr_merge_normalize_one( bsi->bsi_e,
|
||||
slap_schema.si_ad_structuralObjectClass,
|
||||
&soc, bsi->op->o_tmpmemctx );
|
||||
&soc, bsi->bsi_op->o_tmpmemctx );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
entry_free( e );
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
|
|||
int n_attrs = 0;
|
||||
AttributeName *an = NULL;
|
||||
|
||||
if ( bsi->attrs == NULL ) {
|
||||
if ( bsi->bsi_attrs == NULL ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -53,13 +53,13 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
|
|||
* clear the list (retrieve all attrs)
|
||||
*/
|
||||
if ( ad == NULL ) {
|
||||
ch_free( bsi->attrs );
|
||||
bsi->attrs = NULL;
|
||||
ch_free( bsi->bsi_attrs );
|
||||
bsi->bsi_attrs = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
for ( ; bsi->attrs[ n_attrs ].an_name.bv_val; n_attrs++ ) {
|
||||
an = &bsi->attrs[ n_attrs ];
|
||||
for ( ; bsi->bsi_attrs[ n_attrs ].an_name.bv_val; n_attrs++ ) {
|
||||
an = &bsi->bsi_attrs[ n_attrs ];
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "==>backsql_attrlist_add(): "
|
||||
"attribute '%s' is in list\n",
|
||||
|
|
@ -76,7 +76,7 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
|
|||
Debug( LDAP_DEBUG_TRACE, "==>backsql_attrlist_add(): "
|
||||
"adding '%s' to list\n", ad->ad_cname.bv_val, 0, 0 );
|
||||
|
||||
an = (AttributeName *)ch_realloc( bsi->attrs,
|
||||
an = (AttributeName *)ch_realloc( bsi->bsi_attrs,
|
||||
sizeof( AttributeName ) * ( n_attrs + 2 ) );
|
||||
if ( an == NULL ) {
|
||||
return -1;
|
||||
|
|
@ -87,7 +87,7 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
|
|||
an[ n_attrs + 1 ].an_name.bv_val = NULL;
|
||||
an[ n_attrs + 1 ].an_name.bv_len = 0;
|
||||
|
||||
bsi->attrs = an;
|
||||
bsi->bsi_attrs = an;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -107,26 +107,26 @@ backsql_init_search(
|
|||
{
|
||||
AttributeName *p;
|
||||
|
||||
bsi->base_dn = base;
|
||||
bsi->scope = scope;
|
||||
bsi->slimit = slimit;
|
||||
bsi->tlimit = tlimit;
|
||||
bsi->filter = filter;
|
||||
bsi->dbh = dbh;
|
||||
bsi->op = op;
|
||||
bsi->bsi_base_dn = base;
|
||||
bsi->bsi_scope = scope;
|
||||
bsi->bsi_slimit = slimit;
|
||||
bsi->bsi_tlimit = tlimit;
|
||||
bsi->bsi_filter = filter;
|
||||
bsi->bsi_dbh = dbh;
|
||||
bsi->bsi_op = op;
|
||||
bsi->bsi_flags = 0;
|
||||
|
||||
/*
|
||||
* handle "*"
|
||||
*/
|
||||
if ( attrs == NULL || an_find( attrs, &AllUser ) ) {
|
||||
bsi->attrs = NULL;
|
||||
bsi->bsi_attrs = NULL;
|
||||
|
||||
} else {
|
||||
bsi->attrs = (AttributeName *)ch_calloc( 1,
|
||||
bsi->bsi_attrs = (AttributeName *)ch_calloc( 1,
|
||||
sizeof( AttributeName ) );
|
||||
bsi->attrs[ 0 ].an_name.bv_val = NULL;
|
||||
bsi->attrs[ 0 ].an_name.bv_len = 0;
|
||||
bsi->bsi_attrs[ 0 ].an_name.bv_val = NULL;
|
||||
bsi->bsi_attrs[ 0 ].an_name.bv_len = 0;
|
||||
|
||||
for ( p = attrs; p->an_name.bv_val; p++ ) {
|
||||
/*
|
||||
|
|
@ -144,24 +144,25 @@ backsql_init_search(
|
|||
}
|
||||
}
|
||||
|
||||
bsi->abandon = 0;
|
||||
bsi->id_list = NULL;
|
||||
bsi->n_candidates = 0;
|
||||
bsi->stoptime = stoptime;
|
||||
bsi->sel.bb_val.bv_val = NULL;
|
||||
bsi->sel.bb_val.bv_len = 0;
|
||||
bsi->sel.bb_len = 0;
|
||||
bsi->from.bb_val.bv_val = NULL;
|
||||
bsi->from.bb_val.bv_len = 0;
|
||||
bsi->from.bb_len = 0;
|
||||
bsi->join_where.bb_val.bv_val = NULL;
|
||||
bsi->join_where.bb_val.bv_len = 0;
|
||||
bsi->join_where.bb_len = 0;
|
||||
bsi->flt_where.bb_val.bv_val = NULL;
|
||||
bsi->flt_where.bb_val.bv_len = 0;
|
||||
bsi->flt_where.bb_len = 0;
|
||||
bsi->bsi_abandon = 0;
|
||||
bsi->bsi_id_list = NULL;
|
||||
bsi->bsi_n_candidates = 0;
|
||||
bsi->bsi_stoptime = stoptime;
|
||||
bsi->bsi_sel.bb_val.bv_val = NULL;
|
||||
bsi->bsi_sel.bb_val.bv_len = 0;
|
||||
bsi->bsi_sel.bb_len = 0;
|
||||
bsi->bsi_from.bb_val.bv_val = NULL;
|
||||
bsi->bsi_from.bb_val.bv_len = 0;
|
||||
bsi->bsi_from.bb_len = 0;
|
||||
bsi->bsi_join_where.bb_val.bv_val = NULL;
|
||||
bsi->bsi_join_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_join_where.bb_len = 0;
|
||||
bsi->bsi_flt_where.bb_val.bv_val = NULL;
|
||||
bsi->bsi_flt_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_flt_where.bb_len = 0;
|
||||
bsi->bsi_filter_oc = NULL;
|
||||
|
||||
bsi->status = LDAP_SUCCESS;
|
||||
bsi->bsi_status = LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -173,7 +174,7 @@ backsql_process_filter_list( backsql_srch_info *bsi, Filter *f, int op )
|
|||
return 0;
|
||||
}
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "c", '(' /* ) */ );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "c", '(' /* ) */ );
|
||||
|
||||
while ( 1 ) {
|
||||
res = backsql_process_filter( bsi, f );
|
||||
|
|
@ -192,20 +193,20 @@ backsql_process_filter_list( backsql_srch_info *bsi, Filter *f, int op )
|
|||
|
||||
switch ( op ) {
|
||||
case LDAP_FILTER_AND:
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( " AND " ) - 1,
|
||||
" AND " );
|
||||
break;
|
||||
|
||||
case LDAP_FILTER_OR:
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( " OR " ) - 1,
|
||||
" OR " );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "c", /* ( */ ')' );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "c", /* ( */ ')' );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -215,7 +216,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
{
|
||||
int i;
|
||||
backsql_at_map_rec *at;
|
||||
backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private;
|
||||
backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
|
||||
int casefold = 0;
|
||||
|
||||
if ( !f ) {
|
||||
|
|
@ -227,7 +228,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
casefold = 1;
|
||||
}
|
||||
|
||||
at = backsql_ad2at( bsi->oc, f->f_sub_desc );
|
||||
at = backsql_ad2at( bsi->bsi_oc, f->f_sub_desc );
|
||||
|
||||
assert( at );
|
||||
|
||||
|
|
@ -237,7 +238,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
* SQL filters are more liberal.
|
||||
*/
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "c", '(' /* ) */ );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "c", '(' /* ) */ );
|
||||
|
||||
/* TimesTen */
|
||||
Debug( LDAP_DEBUG_TRACE, "expr: '%s' '%s'\n", at->sel_expr.bv_val,
|
||||
|
|
@ -247,13 +248,13 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
* If a pre-upper-cased version of the column exists, use it
|
||||
*/
|
||||
if ( at->sel_expr_u.bv_val ) {
|
||||
backsql_strfcat( &bsi->flt_where,
|
||||
backsql_strfcat( &bsi->bsi_flt_where,
|
||||
"bl",
|
||||
&at->sel_expr_u,
|
||||
(ber_len_t)sizeof( " LIKE '" ) - 1,
|
||||
" LIKE '" );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where,
|
||||
backsql_strfcat( &bsi->bsi_flt_where,
|
||||
"bcbcl",
|
||||
&bi->upper_func,
|
||||
'(',
|
||||
|
|
@ -263,7 +264,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
" LIKE '" );
|
||||
}
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "bl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "bl",
|
||||
&at->sel_expr,
|
||||
(ber_len_t)sizeof( " LIKE '" ) - 1, " LIKE '" );
|
||||
}
|
||||
|
|
@ -271,15 +272,15 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
if ( f->f_sub_initial.bv_val != NULL ) {
|
||||
size_t start;
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->flt_where, "b",
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "b",
|
||||
&f->f_sub_initial );
|
||||
if ( casefold && bi->upper_func.bv_val ) {
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
}
|
||||
}
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "c", '%' );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "c", '%' );
|
||||
|
||||
if ( f->f_sub_any != NULL ) {
|
||||
for ( i = 0; f->f_sub_any[ i ].bv_val != NULL; i++ ) {
|
||||
|
|
@ -292,8 +293,8 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
0, 0 );
|
||||
#endif /* BACKSQL_TRACE */
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->flt_where,
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->bsi_flt_where,
|
||||
"bc",
|
||||
&f->f_sub_any[ i ],
|
||||
'%' );
|
||||
|
|
@ -301,23 +302,23 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
/*
|
||||
* Note: toupper('%') = '%'
|
||||
*/
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
}
|
||||
}
|
||||
|
||||
if ( f->f_sub_final.bv_val != NULL ) {
|
||||
size_t start;
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->flt_where, "b",
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "b",
|
||||
&f->f_sub_final );
|
||||
if ( casefold && bi->upper_func.bv_val ) {
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( /* (' */ "')" ) - 1, /* ( */ "')" );
|
||||
|
||||
return 1;
|
||||
|
|
@ -326,7 +327,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f )
|
|||
static int
|
||||
backsql_process_filter( backsql_srch_info *bsi, Filter *f )
|
||||
{
|
||||
backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private;
|
||||
backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
|
||||
backsql_at_map_rec *at;
|
||||
backsql_at_map_rec oc_attr = {
|
||||
slap_schema.si_ad_objectClass, BER_BVC(""), BER_BVC(""),
|
||||
|
|
@ -358,11 +359,11 @@ backsql_process_filter( backsql_srch_info *bsi, Filter *f )
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_NOT:
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( "NOT (" /* ) */ ) - 1,
|
||||
"NOT (" /* ) */ );
|
||||
rc = backsql_process_filter( bsi, f->f_not );
|
||||
backsql_strfcat( &bsi->flt_where, "c", /* ( */ ')' );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "c", /* ( */ ')' );
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
|
|
@ -397,7 +398,7 @@ backsql_process_filter( backsql_srch_info *bsi, Filter *f )
|
|||
at = &oc_attr;
|
||||
backsql_strfcat( &bb, "cbc",
|
||||
'\'',
|
||||
&bsi->oc->oc->soc_cname,
|
||||
&bsi->bsi_oc->oc->soc_cname,
|
||||
'\'' );
|
||||
at->sel_expr = bb.bb_val;
|
||||
|
||||
|
|
@ -416,7 +417,7 @@ backsql_process_filter( backsql_srch_info *bsi, Filter *f )
|
|||
* selecting if there are descendants of the
|
||||
* candidate.
|
||||
*/
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( "1=1" ) - 1, "1=1" );
|
||||
if ( ad == slap_schema.si_ad_hasSubordinates ) {
|
||||
/*
|
||||
|
|
@ -436,28 +437,29 @@ backsql_process_filter( backsql_srch_info *bsi, Filter *f )
|
|||
goto done;
|
||||
|
||||
} else {
|
||||
at = backsql_ad2at( bsi->oc, ad );
|
||||
at = backsql_ad2at( bsi->bsi_oc, ad );
|
||||
}
|
||||
|
||||
if ( at == NULL ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_process_filter(): "
|
||||
"attribute '%s' is not defined for objectclass '%s'\n",
|
||||
ad->ad_cname.bv_val, BACKSQL_OC_NAME( bsi->oc ), 0 );
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
ad->ad_cname.bv_val, BACKSQL_OC_NAME( bsi->bsi_oc ), 0 );
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( "1=0" ) - 1, "1=0" );
|
||||
bsi->bsi_status = LDAP_UNDEFINED_TYPE;
|
||||
goto impossible;
|
||||
}
|
||||
|
||||
backsql_merge_from_clause( &bsi->from, &at->from_tbls );
|
||||
backsql_merge_from_clause( &bsi->bsi_from, &at->from_tbls );
|
||||
/*
|
||||
* need to add this attribute to list of attrs to load,
|
||||
* so that we could do test_filter() later
|
||||
* so that we can do test_filter() later
|
||||
*/
|
||||
backsql_attrlist_add( bsi, ad );
|
||||
|
||||
if ( at->join_where.bv_val != NULL
|
||||
&& strstr( bsi->join_where.bb_val.bv_val, at->join_where.bv_val ) == NULL ) {
|
||||
backsql_strfcat( &bsi->join_where, "lb",
|
||||
&& strstr( bsi->bsi_join_where.bb_val.bv_val, at->join_where.bv_val ) == NULL ) {
|
||||
backsql_strfcat( &bsi->bsi_join_where, "lb",
|
||||
(ber_len_t)sizeof( " AND " ) - 1, " AND ",
|
||||
&at->join_where );
|
||||
}
|
||||
|
|
@ -484,6 +486,26 @@ equality_match:;
|
|||
casefold = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* objectClass inheritance:
|
||||
* - a search for "person" will also return "inetOrgPerson"
|
||||
* - a search for "top" will return everything
|
||||
*/
|
||||
if ( at == &oc_attr ) {
|
||||
ObjectClass *oc = oc_bvfind( filter_value );
|
||||
|
||||
rc = is_object_subclass( oc, bsi->bsi_oc->oc );
|
||||
if ( rc ) {
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
sizeof( "(1=1)" ) - 1, "(1=1)" );
|
||||
break;
|
||||
|
||||
} else {
|
||||
rc = -1;
|
||||
goto impossible;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* maybe we should check type of at->sel_expr here somehow,
|
||||
* to know whether upper_func is applicable, but for now
|
||||
|
|
@ -494,13 +516,13 @@ equality_match:;
|
|||
size_t start;
|
||||
|
||||
if ( at->sel_expr_u.bv_val ) {
|
||||
backsql_strfcat( &bsi->flt_where, "cbl",
|
||||
'(',
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbl",
|
||||
'(', /* ) */
|
||||
&at->sel_expr_u,
|
||||
(ber_len_t)sizeof( "='" ) - 1,
|
||||
"='" );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cbcbl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbcbl",
|
||||
'(' /* ) */ ,
|
||||
&bi->upper_func,
|
||||
'(' /* ) */ ,
|
||||
|
|
@ -509,17 +531,17 @@ equality_match:;
|
|||
/* ( */ ")='" );
|
||||
}
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "bl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "bl",
|
||||
filter_value,
|
||||
(ber_len_t)sizeof( /* (' */ "')" ) - 1,
|
||||
/* (' */ "')" );
|
||||
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cblbl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cblbl",
|
||||
'(',
|
||||
&at->sel_expr,
|
||||
(ber_len_t)sizeof( "='" ) - 1, "='",
|
||||
|
|
@ -547,13 +569,13 @@ equality_match:;
|
|||
size_t start;
|
||||
|
||||
if ( at->sel_expr_u.bv_val ) {
|
||||
backsql_strfcat( &bsi->flt_where, "cbbc",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbbc",
|
||||
'(',
|
||||
&at->sel_expr_u,
|
||||
&ordering,
|
||||
'\'' );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cbcbcbc",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbcbcbc",
|
||||
'(' /* ) */ ,
|
||||
&bi->upper_func,
|
||||
'(' /* ) */ ,
|
||||
|
|
@ -563,17 +585,17 @@ equality_match:;
|
|||
'\'' );
|
||||
}
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "bl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "bl",
|
||||
filter_value,
|
||||
(ber_len_t)sizeof( /* (' */ "')" ) - 1,
|
||||
/* (' */ "')" );
|
||||
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cbbcbl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbbcbl",
|
||||
'(' /* ) */ ,
|
||||
&at->sel_expr,
|
||||
&ordering,
|
||||
|
|
@ -585,10 +607,12 @@ equality_match:;
|
|||
break;
|
||||
|
||||
case LDAP_FILTER_PRESENT:
|
||||
backsql_strfcat( &bsi->flt_where, "lbl",
|
||||
(ber_len_t)sizeof( "NOT (" ) - 1, "NOT (",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "lbl",
|
||||
(ber_len_t)sizeof( "NOT (" /* ) */) - 1,
|
||||
"NOT (", /* ) */
|
||||
&at->sel_expr,
|
||||
(ber_len_t)sizeof( " IS NULL)" ) - 1, " IS NULL)" );
|
||||
(ber_len_t)sizeof( /* ( */ " IS NULL)" ) - 1,
|
||||
/* ( */ " IS NULL)" );
|
||||
break;
|
||||
|
||||
case LDAP_FILTER_SUBSTRINGS:
|
||||
|
|
@ -608,13 +632,13 @@ equality_match:;
|
|||
size_t start;
|
||||
|
||||
if ( at->sel_expr_u.bv_val ) {
|
||||
backsql_strfcat( &bsi->flt_where, "cbl",
|
||||
'(',
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbl",
|
||||
'(', /* ) */
|
||||
&at->sel_expr_u,
|
||||
(ber_len_t)sizeof( " LIKE '%" ) - 1,
|
||||
" LIKE '%" );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cbcbl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cbcbl",
|
||||
'(' /* ) */ ,
|
||||
&bi->upper_func,
|
||||
'(' /* ) */ ,
|
||||
|
|
@ -623,18 +647,18 @@ equality_match:;
|
|||
/* ( */ ") LIKE '%" );
|
||||
}
|
||||
|
||||
start = bsi->flt_where.bb_val.bv_len;
|
||||
start = bsi->bsi_flt_where.bb_val.bv_len;
|
||||
|
||||
backsql_strfcat( &bsi->flt_where, "bl",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "bl",
|
||||
&f->f_av_value,
|
||||
(ber_len_t)sizeof( /* (' */ "%')" ) - 1,
|
||||
/* (' */ "%')" );
|
||||
|
||||
ldap_pvt_str2upper( &bsi->flt_where.bb_val.bv_val[ start ] );
|
||||
ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
|
||||
|
||||
} else {
|
||||
backsql_strfcat( &bsi->flt_where, "cblbl",
|
||||
'(',
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "cblbl",
|
||||
'(', /* ) */
|
||||
&at->sel_expr,
|
||||
(ber_len_t)sizeof( " LIKE '%" ) - 1,
|
||||
" LIKE '%",
|
||||
|
|
@ -647,7 +671,7 @@ equality_match:;
|
|||
default:
|
||||
/* unhandled filter type; should not happen */
|
||||
assert( 0 );
|
||||
backsql_strfcat( &bsi->flt_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_flt_where, "l",
|
||||
(ber_len_t)sizeof( "1=1" ) - 1, "1=1" );
|
||||
break;
|
||||
|
||||
|
|
@ -673,7 +697,7 @@ impossible:
|
|||
static int
|
||||
backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
||||
{
|
||||
backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private;
|
||||
backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
|
||||
int rc;
|
||||
|
||||
assert( query );
|
||||
|
|
@ -681,62 +705,62 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
|||
query->bv_len = 0;
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "==>backsql_srch_query()\n", 0, 0, 0 );
|
||||
bsi->sel.bb_val.bv_val = NULL;
|
||||
bsi->sel.bb_val.bv_len = 0;
|
||||
bsi->sel.bb_len = 0;
|
||||
bsi->from.bb_val.bv_val = NULL;
|
||||
bsi->from.bb_val.bv_len = 0;
|
||||
bsi->from.bb_len = 0;
|
||||
bsi->join_where.bb_val.bv_val = NULL;
|
||||
bsi->join_where.bb_val.bv_len = 0;
|
||||
bsi->join_where.bb_len = 0;
|
||||
bsi->flt_where.bb_val.bv_val = NULL;
|
||||
bsi->flt_where.bb_val.bv_len = 0;
|
||||
bsi->flt_where.bb_len = 0;
|
||||
bsi->bsi_sel.bb_val.bv_val = NULL;
|
||||
bsi->bsi_sel.bb_val.bv_len = 0;
|
||||
bsi->bsi_sel.bb_len = 0;
|
||||
bsi->bsi_from.bb_val.bv_val = NULL;
|
||||
bsi->bsi_from.bb_val.bv_len = 0;
|
||||
bsi->bsi_from.bb_len = 0;
|
||||
bsi->bsi_join_where.bb_val.bv_val = NULL;
|
||||
bsi->bsi_join_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_join_where.bb_len = 0;
|
||||
bsi->bsi_flt_where.bb_val.bv_val = NULL;
|
||||
bsi->bsi_flt_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_flt_where.bb_len = 0;
|
||||
|
||||
backsql_strfcat( &bsi->sel, "lbcbc",
|
||||
backsql_strfcat( &bsi->bsi_sel, "lbcbc",
|
||||
(ber_len_t)sizeof( "SELECT DISTINCT ldap_entries.id," ) - 1,
|
||||
"SELECT DISTINCT ldap_entries.id,",
|
||||
&bsi->oc->keytbl,
|
||||
&bsi->bsi_oc->keytbl,
|
||||
'.',
|
||||
&bsi->oc->keycol,
|
||||
&bsi->bsi_oc->keycol,
|
||||
',' );
|
||||
|
||||
if ( bi->strcast_func.bv_val ) {
|
||||
backsql_strfcat( &bsi->sel, "blbl",
|
||||
backsql_strfcat( &bsi->bsi_sel, "blbl",
|
||||
&bi->strcast_func,
|
||||
(ber_len_t)sizeof( "('" /* ') */ ) - 1,
|
||||
"('" /* ') */ ,
|
||||
&bsi->oc->oc->soc_cname,
|
||||
&bsi->bsi_oc->oc->soc_cname,
|
||||
(ber_len_t)sizeof( /* (' */ "')" ) - 1,
|
||||
/* (' */ "')" );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->sel, "cbc",
|
||||
backsql_strfcat( &bsi->bsi_sel, "cbc",
|
||||
'\'',
|
||||
&bsi->oc->oc->soc_cname,
|
||||
&bsi->bsi_oc->oc->soc_cname,
|
||||
'\'' );
|
||||
}
|
||||
backsql_strfcat( &bsi->sel, "l",
|
||||
backsql_strfcat( &bsi->bsi_sel, "l",
|
||||
(ber_len_t)sizeof( " AS objectClass,ldap_entries.dn AS dn" ) - 1,
|
||||
" AS objectClass,ldap_entries.dn AS dn" );
|
||||
|
||||
backsql_strfcat( &bsi->from, "lb",
|
||||
backsql_strfcat( &bsi->bsi_from, "lb",
|
||||
(ber_len_t)sizeof( " FROM ldap_entries," ) - 1,
|
||||
" FROM ldap_entries,",
|
||||
&bsi->oc->keytbl );
|
||||
&bsi->bsi_oc->keytbl );
|
||||
|
||||
backsql_strfcat( &bsi->join_where, "lbcbl",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "lbcbl",
|
||||
(ber_len_t)sizeof( " WHERE " ) - 1, " WHERE ",
|
||||
&bsi->oc->keytbl,
|
||||
&bsi->bsi_oc->keytbl,
|
||||
'.',
|
||||
&bsi->oc->keycol,
|
||||
&bsi->bsi_oc->keycol,
|
||||
(ber_len_t)sizeof( "=ldap_entries.keyval AND ldap_entries.oc_map_id=? AND " ) - 1,
|
||||
"=ldap_entries.keyval AND ldap_entries.oc_map_id=? AND " );
|
||||
|
||||
switch ( bsi->scope ) {
|
||||
switch ( bsi->bsi_scope ) {
|
||||
case LDAP_SCOPE_BASE:
|
||||
if ( bi->upper_func.bv_val ) {
|
||||
backsql_strfcat( &bsi->join_where, "blbcb",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "blbcb",
|
||||
&bi->upper_func,
|
||||
(ber_len_t)sizeof( "(ldap_entries.dn)=" ) - 1,
|
||||
"(ldap_entries.dn)=",
|
||||
|
|
@ -744,21 +768,21 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
|||
'?',
|
||||
&bi->upper_func_close );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->join_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "l",
|
||||
(ber_len_t)sizeof( "ldap_entries.dn=?" ) - 1,
|
||||
"ldap_entries.dn=?" );
|
||||
}
|
||||
break;
|
||||
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
backsql_strfcat( &bsi->join_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "l",
|
||||
(ber_len_t)sizeof( "ldap_entries.parent=?" ) - 1,
|
||||
"ldap_entries.parent=?" );
|
||||
break;
|
||||
|
||||
case LDAP_SCOPE_SUBTREE:
|
||||
if ( bi->upper_func.bv_val ) {
|
||||
backsql_strfcat( &bsi->join_where, "blbcb",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "blbcb",
|
||||
&bi->upper_func,
|
||||
(ber_len_t)sizeof( "(ldap_entries.dn) LIKE " ) - 1,
|
||||
"(ldap_entries.dn) LIKE ",
|
||||
|
|
@ -766,7 +790,7 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
|||
'?',
|
||||
&bi->upper_func_close );
|
||||
} else {
|
||||
backsql_strfcat( &bsi->join_where, "l",
|
||||
backsql_strfcat( &bsi->bsi_join_where, "l",
|
||||
(ber_len_t)sizeof( "ldap_entries.dn LIKE ?" ) - 1,
|
||||
"ldap_entries.dn LIKE ?" );
|
||||
}
|
||||
|
|
@ -777,16 +801,16 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
|||
assert( 0 );
|
||||
}
|
||||
|
||||
rc = backsql_process_filter( bsi, bsi->filter );
|
||||
rc = backsql_process_filter( bsi, bsi->bsi_filter );
|
||||
if ( rc > 0 ) {
|
||||
struct berbuf bb = BB_NULL;
|
||||
|
||||
backsql_strfcat( &bb, "bbblb",
|
||||
&bsi->sel.bb_val,
|
||||
&bsi->from.bb_val,
|
||||
&bsi->join_where.bb_val,
|
||||
&bsi->bsi_sel.bb_val,
|
||||
&bsi->bsi_from.bb_val,
|
||||
&bsi->bsi_join_where.bb_val,
|
||||
(ber_len_t)sizeof( " AND " ) - 1, " AND ",
|
||||
&bsi->flt_where.bb_val );
|
||||
&bsi->bsi_flt_where.bb_val );
|
||||
|
||||
*query = bb.bb_val;
|
||||
|
||||
|
|
@ -799,18 +823,18 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
|
|||
query->bv_val = NULL;
|
||||
}
|
||||
|
||||
free( bsi->sel.bb_val.bv_val );
|
||||
bsi->sel.bb_val.bv_len = 0;
|
||||
bsi->sel.bb_len = 0;
|
||||
free( bsi->from.bb_val.bv_val );
|
||||
bsi->from.bb_val.bv_len = 0;
|
||||
bsi->from.bb_len = 0;
|
||||
free( bsi->join_where.bb_val.bv_val );
|
||||
bsi->join_where.bb_val.bv_len = 0;
|
||||
bsi->join_where.bb_len = 0;
|
||||
free( bsi->flt_where.bb_val.bv_val );
|
||||
bsi->flt_where.bb_val.bv_len = 0;
|
||||
bsi->flt_where.bb_len = 0;
|
||||
free( bsi->bsi_sel.bb_val.bv_val );
|
||||
bsi->bsi_sel.bb_val.bv_len = 0;
|
||||
bsi->bsi_sel.bb_len = 0;
|
||||
free( bsi->bsi_from.bb_val.bv_val );
|
||||
bsi->bsi_from.bb_val.bv_len = 0;
|
||||
bsi->bsi_from.bb_len = 0;
|
||||
free( bsi->bsi_join_where.bb_val.bv_val );
|
||||
bsi->bsi_join_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_join_where.bb_len = 0;
|
||||
free( bsi->bsi_flt_where.bb_val.bv_val );
|
||||
bsi->bsi_flt_where.bb_val.bv_len = 0;
|
||||
bsi->bsi_flt_where.bb_len = 0;
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "<==backsql_srch_query() returns %s\n",
|
||||
query->bv_val ? query->bv_val : "NULL", 0, 0 );
|
||||
|
|
@ -823,7 +847,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
{
|
||||
backsql_oc_map_rec *oc = v_oc;
|
||||
backsql_srch_info *bsi = v_bsi;
|
||||
backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private;
|
||||
backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
|
||||
struct berval query;
|
||||
SQLHSTMT sth;
|
||||
RETCODE rc;
|
||||
|
|
@ -833,23 +857,23 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
int i;
|
||||
int j;
|
||||
|
||||
int n_candidates = bsi->n_candidates;
|
||||
int n_candidates = bsi->bsi_n_candidates;
|
||||
|
||||
bsi->status = LDAP_SUCCESS;
|
||||
bsi->bsi_status = LDAP_SUCCESS;
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "==>backsql_oc_get_candidates(): oc='%s'\n",
|
||||
Debug( LDAP_DEBUG_TRACE, "==>backsql_oc_get_candidates(): oc='%s'\n",
|
||||
BACKSQL_OC_NAME( oc ), 0, 0 );
|
||||
|
||||
if ( bsi->n_candidates == -1 ) {
|
||||
if ( bsi->bsi_n_candidates == -1 ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"unchecked limit has been overcome\n", 0, 0, 0 );
|
||||
/* should never get here */
|
||||
assert( 0 );
|
||||
bsi->status = LDAP_ADMINLIMIT_EXCEEDED;
|
||||
bsi->bsi_status = LDAP_ADMINLIMIT_EXCEEDED;
|
||||
return BACKSQL_STOP;
|
||||
}
|
||||
|
||||
bsi->oc = oc;
|
||||
bsi->bsi_oc = oc;
|
||||
res = backsql_srch_query( bsi, &query );
|
||||
if ( res ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
|
|
@ -859,53 +883,66 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
* FIXME: need to separate errors from legally
|
||||
* impossible filters
|
||||
*/
|
||||
bsi->status = LDAP_SUCCESS;
|
||||
return BACKSQL_CONTINUE;
|
||||
switch ( bsi->bsi_status ) {
|
||||
case LDAP_SUCCESS:
|
||||
case LDAP_UNDEFINED_TYPE:
|
||||
case LDAP_NO_SUCH_OBJECT:
|
||||
/* we are conservative... */
|
||||
default:
|
||||
bsi->bsi_status = LDAP_SUCCESS;
|
||||
/* try next */
|
||||
return BACKSQL_CONTINUE;
|
||||
|
||||
case LDAP_ADMINLIMIT_EXCEEDED:
|
||||
case LDAP_OTHER:
|
||||
/* don't try any more */
|
||||
return BACKSQL_STOP;
|
||||
}
|
||||
}
|
||||
|
||||
if ( query.bv_val == NULL ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"could not construct query for objectclass '%s'\n",
|
||||
oc->oc->soc_cname.bv_val, 0, 0 );
|
||||
bsi->status = LDAP_SUCCESS;
|
||||
bsi->bsi_status = LDAP_SUCCESS;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "Constructed query: %s\n",
|
||||
query.bv_val, 0, 0 );
|
||||
|
||||
rc = backsql_Prepare( bsi->dbh, &sth, query.bv_val, 0 );
|
||||
rc = backsql_Prepare( bsi->bsi_dbh, &sth, query.bv_val, 0 );
|
||||
free( query.bv_val );
|
||||
if ( rc != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error preparing query\n", 0, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc );
|
||||
bsi->status = LDAP_OTHER;
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh, sth, rc );
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "id: '%ld'\n", bsi->oc->id, 0, 0 );
|
||||
Debug( LDAP_DEBUG_TRACE, "id: '%ld'\n", bsi->bsi_oc->id, 0, 0 );
|
||||
|
||||
if ( backsql_BindParamID( sth, 1, &bsi->oc->id ) != SQL_SUCCESS ) {
|
||||
if ( backsql_BindParamID( sth, 1, &bsi->bsi_oc->id ) != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error binding objectclass id parameter\n", 0, 0, 0 );
|
||||
bsi->status = LDAP_OTHER;
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
|
||||
switch ( bsi->scope ) {
|
||||
switch ( bsi->bsi_scope ) {
|
||||
case LDAP_SCOPE_BASE:
|
||||
Debug( LDAP_DEBUG_TRACE, "(base)dn: '%s'\n",
|
||||
bsi->base_dn->bv_val, 0, 0 );
|
||||
bsi->bsi_base_dn->bv_val, 0, 0 );
|
||||
|
||||
rc = backsql_BindParamStr( sth, 2, bsi->base_dn->bv_val,
|
||||
rc = backsql_BindParamStr( sth, 2, bsi->bsi_base_dn->bv_val,
|
||||
BACKSQL_MAX_DN_LEN );
|
||||
if ( rc != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error binding base_dn parameter\n", 0, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh,
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh,
|
||||
sth, rc );
|
||||
bsi->status = LDAP_OTHER;
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
break;
|
||||
|
|
@ -923,7 +960,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
* We do not accept DNs longer than BACKSQL_MAX_DN_LEN;
|
||||
* however this should be handled earlier
|
||||
*/
|
||||
assert( bsi->base_dn->bv_len <= BACKSQL_MAX_DN_LEN );
|
||||
assert( bsi->bsi_base_dn->bv_len <= BACKSQL_MAX_DN_LEN );
|
||||
|
||||
/*
|
||||
* Sets the parameters for the SQL built earlier
|
||||
|
|
@ -940,17 +977,17 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
*/
|
||||
if ( BACKSQL_HAS_LDAPINFO_DN_RU( bi ) ) {
|
||||
temp_base_dn[ 0 ] = '\0';
|
||||
for ( i = 0, j = bsi->base_dn->bv_len - 1;
|
||||
for ( i = 0, j = bsi->bsi_base_dn->bv_len - 1;
|
||||
j >= 0; i++, j--) {
|
||||
temp_base_dn[ i ] = bsi->base_dn->bv_val[ j ];
|
||||
temp_base_dn[ i ] = bsi->bsi_base_dn->bv_val[ j ];
|
||||
}
|
||||
temp_base_dn[ i ] = '%';
|
||||
temp_base_dn[ i + 1 ] = '\0';
|
||||
|
||||
} else {
|
||||
temp_base_dn[ 0 ] = '%';
|
||||
AC_MEMCPY( &temp_base_dn[ 1 ], bsi->base_dn->bv_val,
|
||||
bsi->base_dn->bv_len + 1 );
|
||||
AC_MEMCPY( &temp_base_dn[ 1 ], bsi->bsi_base_dn->bv_val,
|
||||
bsi->bsi_base_dn->bv_len + 1 );
|
||||
}
|
||||
ldap_pvt_str2upper( temp_base_dn );
|
||||
|
||||
|
|
@ -963,9 +1000,9 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error binding base_dn parameter (2)\n",
|
||||
0, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh,
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh,
|
||||
sth, rc );
|
||||
bsi->status = LDAP_OTHER;
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
break;
|
||||
|
|
@ -973,13 +1010,13 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
res = backsql_dn2id( bi, &base_id,
|
||||
bsi->dbh, bsi->base_dn );
|
||||
bsi->bsi_dbh, bsi->bsi_base_dn );
|
||||
if ( res != LDAP_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"could not retrieve base_dn id%s\n",
|
||||
res == LDAP_NO_SUCH_OBJECT ? ": no such entry"
|
||||
: "", 0, 0 );
|
||||
bsi->status = res;
|
||||
bsi->bsi_status = res;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
|
||||
|
|
@ -991,7 +1028,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
if ( rc != SQL_SUCCESS ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error binding base id parameter\n", 0, 0, 0 );
|
||||
bsi->status = LDAP_OTHER;
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
break;
|
||||
|
|
@ -1001,9 +1038,9 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
if ( !BACKSQL_SUCCESS( rc ) ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"error executing query\n", 0, 0, 0 );
|
||||
backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc );
|
||||
backsql_PrintErrors( bi->db_env, bsi->bsi_dbh, sth, rc );
|
||||
SQLFreeStmt( sth, SQL_DROP );
|
||||
bsi->status = LDAP_OTHER;
|
||||
bsi->bsi_status = LDAP_OTHER;
|
||||
return BACKSQL_CONTINUE;
|
||||
}
|
||||
|
||||
|
|
@ -1014,17 +1051,17 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
sizeof( backsql_entryID ) );
|
||||
c_id->id = strtol( row.cols[ 0 ], NULL, 0 );
|
||||
c_id->keyval = strtol( row.cols[ 1 ], NULL, 0 );
|
||||
c_id->oc_id = bsi->oc->id;
|
||||
c_id->oc_id = bsi->bsi_oc->id;
|
||||
ber_str2bv( row.cols[ 3 ], 0, 1, &c_id->dn );
|
||||
c_id->next = bsi->id_list;
|
||||
bsi->id_list = c_id;
|
||||
bsi->n_candidates--;
|
||||
c_id->next = bsi->bsi_id_list;
|
||||
bsi->bsi_id_list = c_id;
|
||||
bsi->bsi_n_candidates--;
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
|
||||
"added entry id=%ld, keyval=%ld dn='%s'\n",
|
||||
c_id->id, c_id->keyval, row.cols[ 3 ] );
|
||||
|
||||
if ( bsi->n_candidates == -1 ) {
|
||||
if ( bsi->bsi_n_candidates == -1 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -1032,9 +1069,9 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
|
|||
SQLFreeStmt( sth, SQL_DROP );
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "<==backsql_oc_get_candidates(): %d\n",
|
||||
n_candidates - bsi->n_candidates, 0, 0 );
|
||||
n_candidates - bsi->bsi_n_candidates, 0, 0 );
|
||||
|
||||
return ( bsi->n_candidates == -1 ? BACKSQL_STOP : BACKSQL_CONTINUE );
|
||||
return ( bsi->bsi_n_candidates == -1 ? BACKSQL_STOP : BACKSQL_CONTINUE );
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -1170,12 +1207,12 @@ backsql_search( Operation *op, SlapReply *rs )
|
|||
* of entries matching LDAP query filter and scope (or at least
|
||||
* candidates), and get the IDs
|
||||
*/
|
||||
srch_info.n_candidates = ( isroot ? -2 : limit->lms_s_unchecked == -1
|
||||
srch_info.bsi_n_candidates = ( isroot ? -2 : limit->lms_s_unchecked == -1
|
||||
? -2 : limit->lms_s_unchecked );
|
||||
avl_apply( bi->oc_by_oc, backsql_oc_get_candidates,
|
||||
&srch_info, BACKSQL_STOP, AVL_INORDER );
|
||||
if ( !isroot && limit->lms_s_unchecked != -1 ) {
|
||||
if ( srch_info.n_candidates == -1 ) {
|
||||
if ( srch_info.bsi_n_candidates == -1 ) {
|
||||
rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
|
||||
send_ldap_result( op, rs );
|
||||
goto done;
|
||||
|
|
@ -1187,7 +1224,7 @@ backsql_search( Operation *op, SlapReply *rs )
|
|||
* mentioned in attrs and filter), test it against full filter
|
||||
* and then send to client
|
||||
*/
|
||||
for ( eid = srch_info.id_list; eid != NULL;
|
||||
for ( eid = srch_info.bsi_id_list; eid != NULL;
|
||||
eid = backsql_free_entryID( eid, 1 ) ) {
|
||||
Attribute *hasSubordinate = NULL,
|
||||
*a = NULL;
|
||||
|
|
@ -1347,7 +1384,7 @@ end_of_search:;
|
|||
rs->sr_err = (rs->sr_v2ref == NULL) ? LDAP_SUCCESS
|
||||
: LDAP_REFERRAL;
|
||||
} else {
|
||||
rs->sr_err = srch_info.status;
|
||||
rs->sr_err = srch_info.bsi_status;
|
||||
}
|
||||
send_ldap_result( op, rs );
|
||||
|
||||
|
|
@ -1357,7 +1394,7 @@ end_of_search:;
|
|||
}
|
||||
|
||||
done:;
|
||||
ch_free( srch_info.attrs );
|
||||
ch_free( srch_info.bsi_attrs );
|
||||
|
||||
Debug( LDAP_DEBUG_TRACE, "<==backsql_search()\n", 0, 0, 0 );
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -40,29 +40,35 @@ int backsql_entry_addattr( Entry *e, struct berval *at_name,
|
|||
struct berval *at_val, void *memctx );
|
||||
|
||||
typedef struct backsql_srch_info {
|
||||
Operation *op;
|
||||
Operation *bsi_op;
|
||||
|
||||
int bsi_flags;
|
||||
#define BSQL_SF_ALL_OPER 0x0001
|
||||
#define BSQL_SF_FILTER_HASSUBORDINATE 0x0002
|
||||
|
||||
struct berval *base_dn;
|
||||
int scope;
|
||||
Filter *filter;
|
||||
int slimit, tlimit;
|
||||
time_t stoptime;
|
||||
struct berval *bsi_base_dn;
|
||||
int bsi_scope;
|
||||
Filter *bsi_filter;
|
||||
int bsi_slimit,
|
||||
bsi_tlimit;
|
||||
time_t bsi_stoptime;
|
||||
|
||||
backsql_entryID *id_list, *c_eid;
|
||||
int n_candidates;
|
||||
int abandon;
|
||||
int status;
|
||||
backsql_entryID *bsi_id_list,
|
||||
*bsi_c_eid;
|
||||
int bsi_n_candidates;
|
||||
int bsi_abandon;
|
||||
int bsi_status;
|
||||
|
||||
backsql_oc_map_rec *oc;
|
||||
struct berbuf sel, from, join_where, flt_where;
|
||||
SQLHDBC dbh;
|
||||
AttributeName *attrs;
|
||||
backsql_oc_map_rec *bsi_oc;
|
||||
struct berbuf bsi_sel,
|
||||
bsi_from,
|
||||
bsi_join_where,
|
||||
bsi_flt_where;
|
||||
ObjectClass *bsi_filter_oc;
|
||||
SQLHDBC bsi_dbh;
|
||||
AttributeName *bsi_attrs;
|
||||
|
||||
Entry *e;
|
||||
Entry *bsi_e;
|
||||
} backsql_srch_info;
|
||||
|
||||
void backsql_init_search( backsql_srch_info *bsi,
|
||||
|
|
|
|||
Loading…
Reference in a new issue