X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fapi.c;h=4525f2a90dc721deeff913d2a069348e9cef0fd2;hb=d1824b14ae78b128fb9ff6cf73d2ec4a0e756a90;hp=715e22b63b53c93de438473de6755dea960e6a62;hpb=761f2879435deec0dc8369de98381557de416b89;p=openldap diff --git a/servers/slapd/back-sql/api.c b/servers/slapd/back-sql/api.c index 715e22b63b..4525f2a90d 100644 --- a/servers/slapd/back-sql/api.c +++ b/servers/slapd/back-sql/api.c @@ -1,7 +1,8 @@ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2004 The OpenLDAP Foundation. + * Copyright 1999-2006 The OpenLDAP Foundation. * Portions Copyright 1999 Dmitry Kovalev. + * Portions Copyright 2004 Pierangelo Masarati. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -14,13 +15,12 @@ */ /* ACKNOWLEDGEMENTS: * This work was initially developed by Dmitry Kovalev for inclusion - * by OpenLDAP Software. + * by OpenLDAP Software. Additional significant contributors include + * Pierangelo Masarati. */ #include "portable.h" -#ifdef SLAPD_SQL - #include #include #include "ac/string.h" @@ -31,12 +31,12 @@ static backsql_api *backsqlapi; int -backsql_api_config( backsql_info *si, const char *name ) +backsql_api_config( backsql_info *bi, const char *name, int argc, char *argv[] ) { backsql_api *ba; - assert( si ); - assert( name ); + assert( bi != NULL ); + assert( name != NULL ); for ( ba = backsqlapi; ba; ba = ba->ba_next ) { if ( strcasecmp( name, ba->ba_name ) == 0 ) { @@ -44,8 +44,16 @@ backsql_api_config( backsql_info *si, const char *name ) ba2 = ch_malloc( sizeof( backsql_api ) ); *ba2 = *ba; - ba2->ba_next = si->si_api; - si->si_api = ba2; + + if ( ba2->ba_config ) { + if ( ( *ba2->ba_config )( ba2, argc, argv ) ) { + ch_free( ba2 ); + return 1; + } + } + + ba2->ba_next = bi->sql_api; + bi->sql_api = ba2; return 0; } } @@ -53,12 +61,35 @@ backsql_api_config( backsql_info *si, const char *name ) return 1; } +int +backsql_api_destroy( backsql_info *bi ) +{ + backsql_api *ba; + + assert( bi != NULL ); + + ba = bi->sql_api; + + if ( ba == NULL ) { + return 0; + } + + for ( ; ba; ba = ba->ba_next ) { + if ( ba->ba_destroy ) { + (void)( *ba->ba_destroy )( ba ); + } + } + + return 0; +} + int backsql_api_register( backsql_api *ba ) { backsql_api *ba2; - assert( ba ); + assert( ba != NULL ); + assert( ba->ba_private == NULL ); if ( ba->ba_name == NULL ) { fprintf( stderr, "API module has no name\n" ); @@ -68,7 +99,7 @@ backsql_api_register( backsql_api *ba ) for ( ba2 = backsqlapi; ba2; ba2 = ba2->ba_next ) { if ( strcasecmp( ba->ba_name, ba2->ba_name ) == 0 ) { fprintf( stderr, "API module \"%s\" already defined\n", ba->ba_name ); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE ); } } @@ -81,12 +112,12 @@ backsql_api_register( backsql_api *ba ) int backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn ) { - backsql_info *si = (backsql_info *)op->o_bd->be_private; + backsql_info *bi = (backsql_info *)op->o_bd->be_private; backsql_api *ba; int rc; struct berval bv; - ba = si->si_api; + ba = bi->sql_api; if ( ba == NULL ) { return 0; @@ -96,14 +127,30 @@ backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn ) for ( ; ba; ba = ba->ba_next ) { if ( ba->ba_dn2odbc ) { + /* + * The dn2odbc() helper is supposed to rewrite + * the contents of bv, freeing the original value + * with ch_free() if required and replacing it + * with a newly allocated one using ch_malloc() + * or companion functions. + * + * NOTE: it is supposed to __always__ free + * the value of bv in case of error, and reset + * it with BER_BVZERO() . + */ rc = ( *ba->ba_dn2odbc )( op, rs, &bv ); if ( rc ) { + /* in case of error, dn2odbc() must cleanup */ + assert( BER_BVISNULL( &bv ) ); + return rc; } } } + assert( !BER_BVISNULL( &bv ) ); + *dn = bv; return 0; @@ -112,12 +159,12 @@ backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn ) int backsql_api_odbc2dn( Operation *op, SlapReply *rs, struct berval *dn ) { - backsql_info *si = (backsql_info *)op->o_bd->be_private; + backsql_info *bi = (backsql_info *)op->o_bd->be_private; backsql_api *ba; int rc; struct berval bv; - ba = si->si_api; + ba = bi->sql_api; if ( ba == NULL ) { return 0; @@ -128,17 +175,30 @@ backsql_api_odbc2dn( Operation *op, SlapReply *rs, struct berval *dn ) for ( ; ba; ba = ba->ba_next ) { if ( ba->ba_dn2odbc ) { rc = ( *ba->ba_odbc2dn )( op, rs, &bv ); - + /* + * The odbc2dn() helper is supposed to rewrite + * the contents of bv, freeing the original value + * with ch_free() if required and replacing it + * with a newly allocated one using ch_malloc() + * or companion functions. + * + * NOTE: it is supposed to __always__ free + * the value of bv in case of error, and reset + * it with BER_BVZERO() . + */ if ( rc ) { + /* in case of error, odbc2dn() must cleanup */ + assert( BER_BVISNULL( &bv ) ); + return rc; } } } + assert( !BER_BVISNULL( &bv ) ); + *dn = bv; return 0; } -#endif /* SLAPD_SQL */ -