X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ndb%2Fconfig.cpp;h=2dd814ff3bcc03767595fa3651436045d6a569cd;hb=ef0163c198f54e82b1f8cd7b6b44e29b39fa16aa;hp=8b8c302abb740edd9401cc428ad4623384df4dfc;hpb=da6fdf70a41dbc800c61e9e8bc0f5373753fb362;p=openldap diff --git a/servers/slapd/back-ndb/config.cpp b/servers/slapd/back-ndb/config.cpp index 8b8c302abb..2dd814ff3b 100644 --- a/servers/slapd/back-ndb/config.cpp +++ b/servers/slapd/back-ndb/config.cpp @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2008 The OpenLDAP Foundation. + * Copyright 2008-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,8 @@ extern "C" { enum { NDB_ATLEN = 1, NDB_ATSET, - NDB_INDEX + NDB_INDEX, + NDB_ATBLOB }; static ConfigTable ndbcfg[] = { @@ -98,6 +99,15 @@ static ConfigTable ndbcfg[] = { "DESC 'Attribute to index' " "EQUALITY caseIgnoreMatch " "SYNTAX OMsDirectoryString )", NULL, NULL }, + { "attrblob", "attr", 2, 2, 0, ARG_MAGIC|NDB_ATBLOB, + (void *)ndb_cf_gen, "( OLcfgDbAt:6.12 NAME 'olcNdbAttrBlob' " + "DESC 'Attribute to treat as a BLOB' " + "EQUALITY caseIgnoreMatch " + "SYNTAX OMsDirectoryString )", NULL, NULL }, + { "directory", "dir", 2, 2, 0, ARG_IGNORED, + NULL, "( OLcfgDbAt:0.1 NAME 'olcDbDirectory' " + "DESC 'Dummy keyword' " + "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL }, { NULL, NULL, 0, 0, 0, ARG_IGNORED, NULL, NULL, NULL, NULL } }; @@ -111,7 +121,7 @@ static ConfigOCs ndbocs[] = { "MUST ( olcDbHost $ olcDbName $ olcDbConnect ) " "MAY ( olcDbUser $ olcDbPass $ olcDbPort $ olcDbSocket $ " "olcDbFlag $ olcDbConnections $ olcNdbAttrLen $ " - "olcDbIndex $ olcNdbAttrSet ) )", + "olcDbIndex $ olcNdbAttrSet $ olcNdbAttrBlob ) )", Cft_Database, ndbcfg }, { NULL, Cft_Abstract, NULL } }; @@ -179,6 +189,17 @@ ndb_cf_gen( ConfigArgs *c ) } break; + case NDB_ATBLOB: + if ( ni->ni_attrblobs ) { + for ( ln = ni->ni_attrblobs; ln; ln=ln->ln_next ) { + ai = (NdbAttrInfo *)ln->ln_data; + value_add_one( &c->rvalue_vals, &ai->na_name ); + } + } else { + rc = 1; + } + break; + } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { /* FIXME */ @@ -186,7 +207,6 @@ ndb_cf_gen( ConfigArgs *c ) switch( c->type ) { case NDB_INDEX: if ( c->valx == -1 ) { - int i; /* delete all */ @@ -252,9 +272,9 @@ ndb_cf_gen( ConfigArgs *c ) case NDB_ATSET: ber_str2bv( c->argv[1], 0, 0, &bv ); - bva = ndb_str2bvarray( c->argv[2], strlen( c->argv[2] ), ',' ); + bva = ndb_str2bvarray( c->argv[2], strlen( c->argv[2] ), ',', NULL ); rc = ndb_aset_get( ni, &bv, bva, &oci ); - ch_free( bva ); + ber_bvarray_free( bva ); if ( rc ) { if ( rc == LDAP_ALREADY_EXISTS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), @@ -274,6 +294,32 @@ ndb_cf_gen( ConfigArgs *c ) for ( l2 = &ni->ni_attrsets; *l2; l2 = &(*l2)->ln_next ); *l2 = ln; break; + + case NDB_ATBLOB: + ber_str2bv( c->argv[1], 0, 0, &bv ); + ai = ndb_ai_get( ni, &bv ); + if ( !ai ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: invalid attr %s", + c->log, c->argv[1] ); + Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 ); + return -1; + } + for ( ln = ni->ni_attrblobs; ln; ln = ln->ln_next ) { + if ( ln->ln_data == (void *)ai ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: attr blob already set for %s", + c->log, c->argv[1] ); + Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 ); + return -1; + } + } + ai->na_flag |= NDB_INFO_ATBLOB; + ln = (ListNode *)ch_malloc( sizeof(ListNode)); + ln->ln_data = ai; + ln->ln_next = NULL; + for ( l2 = &ni->ni_attrblobs; *l2; l2 = &(*l2)->ln_next ); + *l2 = ln; + break; + } return 0; }