X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fother.c;h=b2638960f4c697c6b7f0ea3991e64db1183e92d4;hb=6e9c21cff8fc740dc6ed21c6f64d9a8899a33401;hp=57c16d546e0abe264ebd7864f68340c1f1ed0b04;hpb=05348c5fc5fb0803ddaeeb6c50a6513c03e9a765;p=openldap diff --git a/servers/slapd/back-sql/other.c b/servers/slapd/back-sql/other.c index 57c16d546e..b2638960f4 100644 --- a/servers/slapd/back-sql/other.c +++ b/servers/slapd/back-sql/other.c @@ -16,6 +16,7 @@ #include "slap.h" #include "back-sql.h" #include "sql-wrap.h" +#include "entry-id.h" int backsql_compare( @@ -43,5 +44,75 @@ backsql_abandon( return 0; } + +/* + * sets the supported operational attributes (if required) + */ + +int +backsql_operational( + BackendDB *be, + Connection *conn, + Operation *op, + Entry *e, + AttributeName *attrs, + int opattrs, + Attribute **a ) +{ + + backsql_info *bi = (backsql_info*)be->be_private; + SQLHDBC dbh = SQL_NULL_HDBC; + Attribute **aa = a; + int rc = 0; + + Debug( LDAP_DEBUG_TRACE, "==>backsql_operational(): entry '%s'\n", + e->e_nname.bv_val, 0, 0 ); + + + if ( ( opattrs || ad_inlist( slap_schema.si_ad_hasSubordinates, attrs ) ) +#ifdef SLAP_X_FILTER_HASSUBORDINATES + && attr_find( e->e_attrs, slap_schema.si_ad_hasSubordinates ) == NULL +#endif /* SLAP_X_FILTER_HASSUBORDINATES */ + ) { + + rc = backsql_get_db_conn( be, conn, &dbh ); + if ( rc != LDAP_SUCCESS ) { + goto no_connection; + } + + rc = backsql_has_children( bi, dbh, &e->e_nname ); + + switch( rc ) { + case LDAP_COMPARE_TRUE: + case LDAP_COMPARE_FALSE: + *aa = slap_operational_hasSubordinate( rc == LDAP_COMPARE_TRUE ); + if ( *aa != NULL ) { + aa = &(*aa)->a_next; + } + rc = 0; + break; + + default: + Debug(LDAP_DEBUG_TRACE, + "backsql_operational(): " + "has_children failed( %d)\n", + rc, 0, 0 ); + rc = 1; + break; + } + } + + return rc; + +no_connection:; + Debug( LDAP_DEBUG_TRACE, "backsql_operational(): " + "could not get connection handle - exiting\n", + 0, 0, 0 ); + send_ldap_result( conn, op, rc, "", + rc == LDAP_OTHER ? "SQL-backend error" : "", + NULL, NULL ); + return 1; +} + #endif /* SLAPD_SQL */