]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/other.c
Converted ch_malloc, ch_calloc and ch_realloc calls to SLAP_MALLOC,
[openldap] / servers / slapd / back-sql / other.c
index 57c16d546e0abe264ebd7864f68340c1f1ed0b04..b2638960f4c697c6b7f0ea3991e64db1183e92d4 100644 (file)
@@ -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 */