honor objectclass inheritance in filters + some cleanup

This commit is contained in:
Pierangelo Masarati 2004-01-09 11:43:00 +00:00
parent c3674e92f9
commit 354d8a183c
3 changed files with 271 additions and 227 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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,