Added further consistency checks and a new schema parse error value

which should help in debugging schema development for back-config.
The check essentially verifies, when a duplicate attributeType is found,
that the new attributeType definition is an exact duplicate of the
definition already present in the schema.
This commit is contained in:
Pierangelo Masarati 2005-04-10 15:14:13 +00:00
parent f1870628be
commit fa4b1c69d7
3 changed files with 112 additions and 36 deletions

View File

@ -258,7 +258,57 @@ at_next( AttributeType **at )
return (*at != NULL);
}
/*
* check whether the two attributeTypes actually __are__ identical,
* or rather inconsistent
*/
static int
at_check_dup(
AttributeType *sat,
AttributeType *new_sat )
{
if ( new_sat->sat_oid != NULL ) {
if ( sat->sat_oid == NULL ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
if ( strcmp( sat->sat_oid, new_sat->sat_oid ) != 0 ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
} else {
if ( sat->sat_oid != NULL ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
}
if ( new_sat->sat_names ) {
int i;
if ( sat->sat_names == NULL ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
for ( i = 0; new_sat->sat_names[ i ]; i++ ) {
if ( sat->sat_names[ i ] == NULL ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
if ( strcasecmp( sat->sat_names[ i ],
new_sat->sat_names[ i ] ) != 0 )
{
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
}
} else {
if ( sat->sat_names != NULL ) {
return SLAP_SCHERR_ATTR_INCONSISTENT;
}
}
return SLAP_SCHERR_ATTR_DUP;
}
static int
@ -269,6 +319,7 @@ at_insert(
struct aindexrec *air;
char **names;
if ( sat->sat_oid ) {
air = (struct aindexrec *)
ch_calloc( 1, sizeof(struct aindexrec) );
@ -276,16 +327,26 @@ at_insert(
air->air_name.bv_len = strlen(sat->sat_oid);
air->air_at = sat;
if ( avl_insert( &attr_index, (caddr_t) air,
attr_index_cmp, avl_dup_error ) ) {
attr_index_cmp, avl_dup_error ) )
{
AttributeType *old_sat;
int rc;
*err = sat->sat_oid;
ldap_memfree(air);
return SLAP_SCHERR_ATTR_DUP;
old_sat = at_bvfind( &air->air_name );
rc = at_check_dup( old_sat, sat );
ldap_memfree( air );
return rc;
}
/* FIX: temporal consistency check */
at_bvfind(&air->air_name);
at_bvfind( &air->air_name );
}
if ( (names = sat->sat_names) ) {
names = sat->sat_names;
if ( names ) {
while ( *names ) {
air = (struct aindexrec *)
ch_calloc( 1, sizeof(struct aindexrec) );
@ -293,10 +354,19 @@ at_insert(
air->air_name.bv_len = strlen(*names);
air->air_at = sat;
if ( avl_insert( &attr_index, (caddr_t) air,
attr_index_cmp, avl_dup_error ) ) {
attr_index_cmp, avl_dup_error ) )
{
AttributeType *old_sat;
int rc;
*err = *names;
old_sat = at_bvfind( &air->air_name );
rc = at_check_dup( old_sat, sat );
ldap_memfree(air);
return SLAP_SCHERR_ATTR_DUP;
return rc;
}
/* FIX: temporal consistency check */
at_bvfind(&air->air_name);
@ -597,7 +667,7 @@ at_add(
sat->sat_substr = mr;
}
code = at_insert(sat,err);
code = at_insert( sat, err );
if ( code == 0 && rsat )
*rsat = sat;
return code;
@ -628,7 +698,7 @@ at_unparse( BerVarray *res, AttributeType *start, AttributeType *end, int sys )
AttributeType *at;
int i, num;
struct berval bv, *bva = NULL, idx;
char ibuf[32], *ptr;
char ibuf[32];
if ( !start )
start = LDAP_STAILQ_FIRST( &attr_list );

View File

@ -43,6 +43,7 @@ static char *const err2text[] = {
"AttributeType inappropriate SUPerior",
"AttributeType SYNTAX or SUPerior required",
"Duplicate attributeType",
"Inconsistent attributeType",
"MatchingRule not found",
"MatchingRule incomplete",
"Duplicate matchingRule",
@ -55,7 +56,8 @@ static char *const err2text[] = {
"Duplicate Content Rule",
"Content Rule not for STRUCTURAL object class",
"Content Rule AUX contains inappropriate object class",
"Content Rule attribute type list contains duplicate"
"Content Rule attribute type list contains duplicate",
NULL
};
char *

View File

@ -279,31 +279,35 @@ typedef struct slap_ssf_set {
/*
* represents schema information for a database
*/
#define SLAP_SCHERR_OUTOFMEM 1
#define SLAP_SCHERR_CLASS_NOT_FOUND 2
#define SLAP_SCHERR_CLASS_BAD_USAGE 3
#define SLAP_SCHERR_CLASS_BAD_SUP 4
#define SLAP_SCHERR_CLASS_DUP 5
#define SLAP_SCHERR_ATTR_NOT_FOUND 6
#define SLAP_SCHERR_ATTR_BAD_MR 7
#define SLAP_SCHERR_ATTR_BAD_USAGE 8
#define SLAP_SCHERR_ATTR_BAD_SUP 9
#define SLAP_SCHERR_ATTR_INCOMPLETE 10
#define SLAP_SCHERR_ATTR_DUP 11
#define SLAP_SCHERR_MR_NOT_FOUND 12
#define SLAP_SCHERR_MR_INCOMPLETE 13
#define SLAP_SCHERR_MR_DUP 14
#define SLAP_SCHERR_SYN_NOT_FOUND 15
#define SLAP_SCHERR_SYN_DUP 16
#define SLAP_SCHERR_NO_NAME 17
#define SLAP_SCHERR_NOT_SUPPORTED 18
#define SLAP_SCHERR_BAD_DESCR 19
#define SLAP_SCHERR_OIDM 20
#define SLAP_SCHERR_CR_DUP 21
#define SLAP_SCHERR_CR_BAD_STRUCT 22
#define SLAP_SCHERR_CR_BAD_AUX 23
#define SLAP_SCHERR_CR_BAD_AT 24
#define SLAP_SCHERR_LAST SLAP_SCHERR_CR_BAD_AT
enum {
SLAP_SCHERR_OUTOFMEM = 1,
SLAP_SCHERR_CLASS_NOT_FOUND,
SLAP_SCHERR_CLASS_BAD_USAGE,
SLAP_SCHERR_CLASS_BAD_SUP,
SLAP_SCHERR_CLASS_DUP,
SLAP_SCHERR_ATTR_NOT_FOUND,
SLAP_SCHERR_ATTR_BAD_MR,
SLAP_SCHERR_ATTR_BAD_USAGE,
SLAP_SCHERR_ATTR_BAD_SUP,
SLAP_SCHERR_ATTR_INCOMPLETE,
SLAP_SCHERR_ATTR_DUP,
SLAP_SCHERR_ATTR_INCONSISTENT,
SLAP_SCHERR_MR_NOT_FOUND,
SLAP_SCHERR_MR_INCOMPLETE,
SLAP_SCHERR_MR_DUP,
SLAP_SCHERR_SYN_NOT_FOUND,
SLAP_SCHERR_SYN_DUP,
SLAP_SCHERR_NO_NAME,
SLAP_SCHERR_NOT_SUPPORTED,
SLAP_SCHERR_BAD_DESCR,
SLAP_SCHERR_OIDM,
SLAP_SCHERR_CR_DUP,
SLAP_SCHERR_CR_BAD_STRUCT,
SLAP_SCHERR_CR_BAD_AUX,
SLAP_SCHERR_CR_BAD_AT,
SLAP_SCHERR_LAST
};
typedef union slap_sockaddr {
struct sockaddr sa_addr;