X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fentry-id.c;h=b864e803d4ab7b28e4bccfb1a201548086ae608c;hb=9647ccd9456b8781066dbba5a063bf6c6c9dab6d;hp=e1a45c7f1e9b6b36f8d0a89d4162bb168a508027;hpb=fbc11bd16a6a6ab4016495c73dd458b1d89e7ed5;p=openldap diff --git a/servers/slapd/back-sql/entry-id.c b/servers/slapd/back-sql/entry-id.c index e1a45c7f1e..b864e803d4 100644 --- a/servers/slapd/back-sql/entry-id.c +++ b/servers/slapd/back-sql/entry-id.c @@ -1,10 +1,21 @@ -/* - * Copyright 1999, Dmitry Kovalev , All rights reserved. +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . * - * Redistribution and use in source and binary forms are permitted only - * as authorized by the OpenLDAP Public License. A copy of this - * license is available at http://www.OpenLDAP.org/license.html or - * in file LICENSE in the top-level directory of the distribution. + * Copyright 1999-2003 The OpenLDAP Foundation. + * Portions Copyright 1999 Dmitry Kovalev. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* ACKNOWLEDGEMENTS: + * This work was initially developed by Dmitry Kovalev for inclusion + * by OpenLDAP Software. */ #include "portable.h" @@ -164,22 +175,23 @@ backsql_dn2id( } int -backsql_has_children( +backsql_count_children( backsql_info *bi, SQLHDBC dbh, - struct berval *dn ) + struct berval *dn, + unsigned long *nchildren ) { SQLHSTMT sth; BACKSQL_ROW_NTS row; RETCODE rc; - int res; + int res = LDAP_SUCCESS; - Debug( LDAP_DEBUG_TRACE, "==>backsql_has_children(): dn='%s'\n", + Debug( LDAP_DEBUG_TRACE, "==>backsql_count_children(): dn='%s'\n", dn->bv_val, 0, 0 ); if ( dn->bv_len > BACKSQL_MAX_DN_LEN ) { Debug( LDAP_DEBUG_TRACE, - "backsql_has_children(): DN \"%s\" (%ld bytes) " + "backsql_count_children(): DN \"%s\" (%ld bytes) " "exceeds max DN length (%d):\n", dn->bv_val, dn->bv_len, BACKSQL_MAX_DN_LEN ); return LDAP_OTHER; @@ -192,7 +204,7 @@ backsql_has_children( rc = backsql_Prepare( dbh, &sth, bi->has_children_query, 0 ); if ( rc != SQL_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, - "backsql_has_children(): error preparing SQL:\n%s", + "backsql_count_children(): error preparing SQL:\n%s", bi->has_children_query, 0, 0); backsql_PrintErrors( SQL_NULL_HENV, dbh, sth, rc ); SQLFreeStmt( sth, SQL_DROP ); @@ -202,7 +214,7 @@ backsql_has_children( rc = backsql_BindParamStr( sth, 1, dn->bv_val, BACKSQL_MAX_DN_LEN ); if ( rc != SQL_SUCCESS) { /* end TimesTen */ - Debug( LDAP_DEBUG_TRACE, "backsql_has_children(): " + Debug( LDAP_DEBUG_TRACE, "backsql_count_children(): " "error binding dn=\"%s\" parameter:\n", dn->bv_val, 0, 0 ); backsql_PrintErrors( SQL_NULL_HENV, dbh, sth, rc ); @@ -212,7 +224,7 @@ backsql_has_children( rc = SQLExecute( sth ); if ( rc != SQL_SUCCESS ) { - Debug( LDAP_DEBUG_TRACE, "backsql_has_children(): " + Debug( LDAP_DEBUG_TRACE, "backsql_count_children(): " "error executing query (\"%s\", \"%s\"):\n", bi->has_children_query, dn->bv_val, 0 ); backsql_PrintErrors( SQL_NULL_HENV, dbh, sth, rc ); @@ -224,10 +236,11 @@ backsql_has_children( rc = SQLFetch( sth ); if ( BACKSQL_SUCCESS( rc ) ) { - if ( strtol( row.cols[ 0 ], NULL, 0 ) > 0 ) { - res = LDAP_COMPARE_TRUE; - } else { - res = LDAP_COMPARE_FALSE; + char *end; + + *nchildren = strtol( row.cols[ 0 ], &end, 0 ); + if ( end[ 0 ] != '\0' ) { + res = LDAP_OTHER; } } else { @@ -237,19 +250,40 @@ backsql_has_children( SQLFreeStmt( sth, SQL_DROP ); - Debug( LDAP_DEBUG_TRACE, "<==backsql_has_children(): %s\n", - res == LDAP_COMPARE_TRUE ? "yes" : "no", 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "<==backsql_count_children(): %lu\n", + *nchildren, 0, 0 ); return res; } int -backsql_get_attr_vals( backsql_at_map_rec *at, backsql_srch_info *bsi ) +backsql_has_children( + backsql_info *bi, + SQLHDBC dbh, + struct berval *dn ) +{ + unsigned long nchildren; + int rc; + + rc = backsql_count_children( bi, dbh, dn, &nchildren ); + + if ( rc == LDAP_SUCCESS ) { + return nchildren > 0 ? LDAP_COMPARE_TRUE : LDAP_COMPARE_FALSE; + } + + return rc; +} + +static int +backsql_get_attr_vals( void *v_at, void *v_bsi ) { - RETCODE rc; - SQLHSTMT sth; - BACKSQL_ROW_NTS row; - int i; + backsql_at_map_rec *at = v_at; + backsql_srch_info *bsi = v_bsi; + backsql_info *bi = (backsql_info *)bsi->op->o_bd->be_private; + RETCODE rc; + SQLHSTMT sth; + BACKSQL_ROW_NTS row; + int i; assert( at ); assert( bsi ); @@ -263,7 +297,7 @@ backsql_get_attr_vals( backsql_at_map_rec *at, backsql_srch_info *bsi ) if ( rc != SQL_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_values(): " "error preparing query: %s\n", at->query, 0, 0 ); - backsql_PrintErrors( bsi->bi->db_env, bsi->dbh, sth, rc ); + backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc ); return 1; } @@ -279,7 +313,7 @@ backsql_get_attr_vals( backsql_at_map_rec *at, backsql_srch_info *bsi ) Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_values(): " "error executing attribute query '%s'\n", at->query, 0, 0 ); - backsql_PrintErrors( bsi->bi->db_env, bsi->dbh, sth, rc ); + backsql_PrintErrors( bi->db_env, bsi->dbh, sth, rc ); SQLFreeStmt( sth, SQL_DROP ); return 1; } @@ -289,7 +323,7 @@ backsql_get_attr_vals( backsql_at_map_rec *at, backsql_srch_info *bsi ) rc = SQLFetch( sth ); for ( ; BACKSQL_SUCCESS( rc ); rc = SQLFetch( sth ) ) { for ( i = 0; i < row.ncols; i++ ) { - if ( row.is_null[ i ] > 0 ) { + if ( row.value_len[ i ] > 0 ) { struct berval bv; bv.bv_val = row.cols[ i ]; @@ -303,7 +337,8 @@ backsql_get_attr_vals( backsql_at_map_rec *at, backsql_srch_info *bsi ) bv.bv_len = strlen( row.cols[ i ] ); #endif backsql_entry_addattr( bsi->e, - &row.col_names[ i ], &bv ); + &row.col_names[ i ], &bv, + bsi->op->o_tmpmemctx ); #ifdef BACKSQL_TRACE Debug( LDAP_DEBUG_TRACE, "prec=%d\n", @@ -334,19 +369,18 @@ 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 ); + rc = dnPrettyNormal( NULL, &eid->dn, &e->e_name, &e->e_nname, + bsi->op->o_tmpmemctx ); if ( rc != LDAP_SUCCESS ) { return NULL; } - bsi->oc = backsql_id2oc( bsi->bi, eid->oc_id ); + bsi->oc = backsql_id2oc( bsi->op->o_bd->be_private, eid->oc_id ); bsi->e = e; bsi->c_eid = eid; e->e_attrs = NULL; e->e_private = NULL; - /* if ( bsi->base_dn != NULL)??? */ - e->e_id = eid->id; if ( bsi->attrs != NULL ) { @@ -355,16 +389,7 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid ) for ( i = 0; bsi->attrs[ i ].an_name.bv_val; i++ ) { AttributeName *attr = &bsi->attrs[ i ]; - if ( attr->an_desc == ad_oc -#if 0 /* FIXME: what is 0.10 ? */ - || !BACKSQL_NCMP( &attr->an_name, &bv_n_0_10 ) -#endif - ) { -#if 0 - backsql_entry_addattr( bsi->e, - &bv_n_objectclass, - BACKSQL_OC_NAME( bsi->oc ) ); -#endif + if ( attr->an_desc == ad_oc ) { continue; } @@ -383,11 +408,12 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid ) } else { Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): " "retrieving all attributes\n", 0, 0, 0 ); - avl_apply( bsi->oc->attrs, (AVL_APPLY)backsql_get_attr_vals, + avl_apply( bsi->oc->attrs, backsql_get_attr_vals, bsi, 0, AVL_INORDER ); } - if ( attr_merge_one( bsi->e, ad_oc, &bsi->oc->oc->soc_cname ) ) { + if ( attr_merge_normalize_one( bsi->e, ad_oc, &bsi->oc->oc->soc_cname, + bsi->op->o_tmpmemctx ) ) { entry_free( e ); return NULL; } @@ -396,21 +422,26 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid ) const char *text = NULL; char textbuf[ 1024 ]; size_t textlen = sizeof( textbuf ); - struct berval bv[ 2 ] = { bsi->oc->oc->soc_cname, BER_BVNULL }; + struct berval bv[ 2 ]; struct berval soc; - AttributeDescription *ad_soc - = slap_schema.si_ad_structuralObjectClass; + int rc; + + bv[ 0 ] = bsi->oc->oc->soc_cname; + bv[ 1 ].bv_val = NULL; - int rc = structural_class( bv, &soc, NULL, + rc = structural_class( bv, &soc, NULL, &text, textbuf, textlen ); if ( rc != LDAP_SUCCESS ) { entry_free( e ); return NULL; } - if ( bsi->bsi_flags | BSQL_SF_ALL_OPER + if ( ( bsi->bsi_flags | BSQL_SF_ALL_OPER ) || an_find( bsi->attrs, &AllOper ) ) { - if ( attr_merge_one( bsi->e, ad_soc, &soc ) ) { + rc = attr_merge_normalize_one( bsi->e, + slap_schema.si_ad_structuralObjectClass, + &soc, bsi->op->o_tmpmemctx ); + if ( rc != LDAP_SUCCESS ) { entry_free( e ); return NULL; }