X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fother.c;h=1629a086e30b2b7f57619ec1f678cb83fc635935;hb=925714ceeff035c596ad3d3c899ff631986c6757;hp=62dcbe81509a666c9437b6193058876e23bb3af9;hpb=115408986c62fea339b99f93dafc820bd8c94062;p=openldap diff --git a/servers/slapd/back-sql/other.c b/servers/slapd/back-sql/other.c index 62dcbe8150..1629a086e3 100644 --- a/servers/slapd/back-sql/other.c +++ b/servers/slapd/back-sql/other.c @@ -16,12 +16,7 @@ #include "slap.h" #include "back-sql.h" #include "sql-wrap.h" - -int -backsql_dummy( void ) -{ - return 0; -} +#include "entry-id.h" int backsql_compare( @@ -49,5 +44,70 @@ 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; + + 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 ) ) { + 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 */