X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fother.c;h=b2638960f4c697c6b7f0ea3991e64db1183e92d4;hb=6e9c21cff8fc740dc6ed21c6f64d9a8899a33401;hp=a736b1d63da43c7e70c831e59ce28ac573b47a63;hpb=4e703c5261cd179ab675cdeaca4b0eda88db0977;p=openldap diff --git a/servers/slapd/back-sql/other.c b/servers/slapd/back-sql/other.c index a736b1d63d..b2638960f4 100644 --- a/servers/slapd/back-sql/other.c +++ b/servers/slapd/back-sql/other.c @@ -1,5 +1,5 @@ /* - * Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved. + * Copyright 1999, Dmitry Kovalev , All rights reserved. * * Redistribution and use in source and binary forms are permitted only * as authorized by the OpenLDAP Public License. A copy of this @@ -9,28 +9,110 @@ #include "portable.h" +#ifdef SLAPD_SQL + #include #include #include "slap.h" #include "back-sql.h" #include "sql-wrap.h" +#include "entry-id.h" -int backsql_dummy() +int +backsql_compare( + BackendDB *bd, + Connection *conn, + Operation *op, + struct berval *dn, + struct berval *ndn, + AttributeAssertion *ava ) { - return 0; + Debug( LDAP_DEBUG_TRACE, "==>backsql_compare() - not implemented\n", + 0, 0, 0 ); + return 1; } -int backsql_compare(BackendDB *be,Connection *conn,Operation *op, - char *dn,char *ndn,Ava *ava) +int +backsql_abandon( + BackendDB *be, + Connection *conn, + Operation *op, + int msgid ) { - Debug(LDAP_DEBUG_TRACE,"==>backsql_compare()\n",0,0,0); - return 0; + Debug( LDAP_DEBUG_TRACE, "==>backsql_abandon()\n", 0, 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "<==backsql_abandon()\n", 0, 0, 0 ); + return 0; } -int backsql_abandon( BackendDB *be, - Connection *conn, Operation *op, int msgid ) + +/* + * sets the supported operational attributes (if required) + */ + +int +backsql_operational( + BackendDB *be, + Connection *conn, + Operation *op, + Entry *e, + AttributeName *attrs, + int opattrs, + Attribute **a ) { - Debug(LDAP_DEBUG_TRACE,"==>backsql_abandon()\n",0,0,0); - Debug(LDAP_DEBUG_TRACE,"<==backsql_abandon()\n",0,0,0); - return 0; + + 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 */ +