⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entry-id.c

📁 OpenLdap是LDAP的开源项目
💻 C
📖 第 1 页 / 共 2 页
字号:
		backsql_PrintErrors( bi->sql_db_env, bsi->bsi_dbh, sth, rc );		return 1;	}	rc = backsql_BindParamID( sth, 1, SQL_PARAM_INPUT,			&bsi->bsi_c_eid->eid_keyval );	if ( rc != SQL_SUCCESS ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error binding key value parameter\n", 0, 0, 0 );		SQLFreeStmt( sth, SQL_DROP );		return 1;	}	rc = SQLExecute( sth );	if ( ! BACKSQL_SUCCESS( rc ) ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error executing attribute count query '%s'\n",			at->bam_countquery, 0, 0 );		backsql_PrintErrors( bi->sql_db_env, bsi->bsi_dbh, sth, rc );		SQLFreeStmt( sth, SQL_DROP );		return 1;	}	SQLBindCol( sth, (SQLUSMALLINT)1, SQL_C_LONG,			(SQLPOINTER)&count,			(SQLINTEGER)sizeof( count ),			&countsize );	rc = SQLFetch( sth );	if ( rc != SQL_SUCCESS ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error fetch results of count query: %s\n",			at->bam_countquery, 0, 0 );		backsql_PrintErrors( bi->sql_db_env, bsi->bsi_dbh, sth, rc );		SQLFreeStmt( sth, SQL_DROP );		return 1;	}	Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "		"number of values in query: %u\n", count, 0, 0 );	SQLFreeStmt( sth, SQL_DROP );	if ( count == 0 ) {		return 1;	}	attr = attr_find( bsi->bsi_e->e_attrs, at->bam_ad );	if ( attr != NULL ) {		BerVarray	tmp;		if ( attr->a_vals != NULL ) {			for ( ; !BER_BVISNULL( &attr->a_vals[ oldcount ] ); oldcount++ )				/* just count */ ;		}		tmp = ch_realloc( attr->a_vals, ( oldcount + count + 1 ) * sizeof( struct berval ) );		if ( tmp == NULL ) {			return 1;		}		attr->a_vals = tmp;		memset( &attr->a_vals[ oldcount ], 0, ( count + 1 ) * sizeof( struct berval ) );		if ( normfunc ) {			tmp = ch_realloc( attr->a_nvals, ( oldcount + count + 1 ) * sizeof( struct berval ) );			if ( tmp == NULL ) {				return 1;			}			attr->a_nvals = tmp;			memset( &attr->a_nvals[ oldcount ], 0, ( count + 1 ) * sizeof( struct berval ) );		} else {			attr->a_nvals = attr->a_vals;		}	} else {		append = 1;		/* Make space for the array of values */		attr = (Attribute *) ch_malloc( sizeof( Attribute ) );		attr->a_desc = at->bam_ad;		attr->a_flags = 0;		attr->a_next = NULL;		attr->a_vals = ch_calloc( count + 1, sizeof( struct berval ) );		if ( attr->a_vals == NULL ) {			Debug( LDAP_DEBUG_TRACE, "Out of memory!\n", 0,0,0 );			ch_free( attr );			return 1;		}		memset( attr->a_vals, 0, ( count + 1 ) * sizeof( struct berval ) );		if ( normfunc ) {			attr->a_nvals = ch_calloc( count + 1, sizeof( struct berval ) );			if ( attr->a_nvals == NULL ) {				ch_free( attr->a_vals );				ch_free( attr );				return 1;			} else {				memset( attr->a_nvals, 0, ( count + 1 ) * sizeof( struct berval ) );			}		} else {			attr->a_nvals = attr->a_vals;		}	}#endif /* BACKSQL_COUNTQUERY */	rc = backsql_Prepare( bsi->bsi_dbh, &sth, at->bam_query, 0 );	if ( rc != SQL_SUCCESS ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error preparing query: %s\n", at->bam_query, 0, 0 );		backsql_PrintErrors( bi->sql_db_env, bsi->bsi_dbh, sth, rc );#ifdef BACKSQL_COUNTQUERY		if ( append ) {			attr_free( attr );		}#endif /* BACKSQL_COUNTQUERY */		return 1;	}	rc = backsql_BindParamID( sth, 1, SQL_PARAM_INPUT,			&bsi->bsi_c_eid->eid_keyval );	if ( rc != SQL_SUCCESS ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error binding key value parameter\n", 0, 0, 0 );#ifdef BACKSQL_COUNTQUERY		if ( append ) {			attr_free( attr );		}#endif /* BACKSQL_COUNTQUERY */		return 1;	}#ifdef BACKSQL_TRACE#ifdef BACKSQL_ARBITRARY_KEY	Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "		"query=\"%s\" keyval=%s\n", at->bam_query,		bsi->bsi_c_eid->eid_keyval.bv_val, 0 );#else /* !BACKSQL_ARBITRARY_KEY */	Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "		"query=\"%s\" keyval=%d\n", at->bam_query,		bsi->bsi_c_eid->eid_keyval, 0 );#endif /* ! BACKSQL_ARBITRARY_KEY */#endif /* BACKSQL_TRACE */	rc = SQLExecute( sth );	if ( ! BACKSQL_SUCCESS( rc ) ) {		Debug( LDAP_DEBUG_TRACE, "backsql_get_attr_vals(): "			"error executing attribute query \"%s\"\n",			at->bam_query, 0, 0 );		backsql_PrintErrors( bi->sql_db_env, bsi->bsi_dbh, sth, rc );		SQLFreeStmt( sth, SQL_DROP );#ifdef BACKSQL_COUNTQUERY		if ( append ) {			attr_free( attr );		}#endif /* BACKSQL_COUNTQUERY */		return 1;	}	backsql_BindRowAsStrings_x( sth, &row, bsi->bsi_op->o_tmpmemctx );#ifdef BACKSQL_COUNTQUERY	j = oldcount;#endif /* BACKSQL_COUNTQUERY */	for ( rc = SQLFetch( sth ), k = 0;			BACKSQL_SUCCESS( rc );			rc = SQLFetch( sth ), k++ )	{		for ( i = 0; i < (unsigned long)row.ncols; i++ ) {			if ( row.value_len[ i ] > 0 ) {				struct berval		bv;				int			retval;#ifdef BACKSQL_TRACE				AttributeDescription	*ad = NULL;				const char		*text;				retval = slap_bv2ad( &row.col_names[ i ], &ad, &text );				if ( retval != LDAP_SUCCESS ) {					Debug( LDAP_DEBUG_ANY,						"==>backsql_get_attr_vals(\"%s\"): "						"unable to find AttributeDescription %s "						"in schema (%d)\n",						bsi->bsi_e->e_name.bv_val,						row.col_names[ i ].bv_val, retval );					res = 1;					goto done;				}				if ( ad != at->bam_ad ) {					Debug( LDAP_DEBUG_ANY,						"==>backsql_get_attr_vals(\"%s\"): "						"column name %s differs from "						"AttributeDescription %s\n",						bsi->bsi_e->e_name.bv_val,						ad->ad_cname.bv_val,						at->bam_ad->ad_cname.bv_val );					res = 1;					goto done;				}#endif /* BACKSQL_TRACE */				/*				 * FIXME: what if a binary 				 * is fetched?				 */				ber_str2bv( row.cols[ i ], 0, 0, &bv );#ifdef BACKSQL_PRETTY_VALIDATE				if ( pretty ) {					struct berval	pbv;					retval = pretty( at->bam_ad->ad_type->sat_syntax,						&bv, &pbv, bsi->bsi_op->o_tmpmemctx );					bv = pbv;				} else {					retval = validate( at->bam_ad->ad_type->sat_syntax,						&bv );				}				if ( retval != LDAP_SUCCESS ) {					char	buf[ SLAP_TEXT_BUFLEN ];					/* FIXME: we're ignoring invalid values,					 * but we're accepting the attributes;					 * should we fail at all? */					snprintf( buf, sizeof( buf ),							"unable to %s value #%lu "							"of AttributeDescription %s",							pretty ? "prettify" : "validate",							k - oldcount,							at->bam_ad->ad_cname.bv_val );					Debug( LDAP_DEBUG_TRACE,						"==>backsql_get_attr_vals(\"%s\"): "						"%s (%d)\n",						bsi->bsi_e->e_name.bv_val, buf, retval );					continue;				}#endif /* BACKSQL_PRETTY_VALIDATE */#ifndef BACKSQL_COUNTQUERY				(void)backsql_entry_addattr( bsi->bsi_e, 						at->bam_ad, &bv,						bsi->bsi_op->o_tmpmemctx );#else /* BACKSQL_COUNTQUERY */				if ( normfunc ) {					struct berval	nbv;					retval = (*normfunc)( SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,						at->bam_ad->ad_type->sat_syntax,						at->bam_ad->ad_type->sat_equality,						&bv, &nbv,						bsi->bsi_op->o_tmpmemctx );					if ( retval != LDAP_SUCCESS ) {						char	buf[ SLAP_TEXT_BUFLEN ];						/* FIXME: we're ignoring invalid values,						 * but we're accepting the attributes;						 * should we fail at all? */						snprintf( buf, sizeof( buf ),							"unable to normalize value #%lu "							"of AttributeDescription %s",							k - oldcount,							at->bam_ad->ad_cname.bv_val );						Debug( LDAP_DEBUG_TRACE,							"==>backsql_get_attr_vals(\"%s\"): "							"%s (%d)\n",							bsi->bsi_e->e_name.bv_val, buf, retval );#ifdef BACKSQL_PRETTY_VALIDATE						if ( pretty ) {							bsi->bsi_op->o_tmpfree( bv.bv_val,									bsi->bsi_op->o_tmpmemctx );						}#endif /* BACKSQL_PRETTY_VALIDATE */						continue;					}					ber_dupbv( &attr->a_nvals[ j ], &nbv );					bsi->bsi_op->o_tmpfree( nbv.bv_val,							bsi->bsi_op->o_tmpmemctx );				}				ber_dupbv( &attr->a_vals[ j ], &bv );				assert( j < oldcount + count );				j++;#endif /* BACKSQL_COUNTQUERY */#ifdef BACKSQL_PRETTY_VALIDATE				if ( pretty ) {					bsi->bsi_op->o_tmpfree( bv.bv_val,							bsi->bsi_op->o_tmpmemctx );				}#endif /* BACKSQL_PRETTY_VALIDATE */#ifdef BACKSQL_TRACE				Debug( LDAP_DEBUG_TRACE, "prec=%d\n",					(int)row.col_prec[ i ], 0, 0 );			} else {      				Debug( LDAP_DEBUG_TRACE, "NULL value "					"in this row for attribute \"%s\"\n",					row.col_names[ i ].bv_val, 0, 0 );#endif /* BACKSQL_TRACE */			}		}	}#ifdef BACKSQL_COUNTQUERY	if ( BER_BVISNULL( &attr->a_vals[ 0 ] ) ) {		/* don't leave around attributes with no values */		attr_free( attr );	} else if ( append ) {		Attribute	**ap;		for ( ap = &bsi->bsi_e->e_attrs; (*ap) != NULL; ap = &(*ap)->a_next )			/* goto last */ ;		*ap =  attr;	}#endif /* BACKSQL_COUNTQUERY */	SQLFreeStmt( sth, SQL_DROP );	Debug( LDAP_DEBUG_TRACE, "<==backsql_get_attr_vals()\n", 0, 0, 0 );	if ( at->bam_next ) {		res = backsql_get_attr_vals( at->bam_next, v_bsi );	} else {		res = 1;	}#ifdef BACKSQL_TRACEdone:;#endif /* BACKSQL_TRACE */	backsql_FreeRow_x( &row, bsi->bsi_op->o_tmpmemctx );	return res;}intbacksql_id2entry( backsql_srch_info *bsi, backsql_entryID *eid ){	Operation		*op = bsi->bsi_op;	backsql_info		*bi = (backsql_info *)op->o_bd->be_private;	int			i;	int			rc;	Debug( LDAP_DEBUG_TRACE, "==>backsql_id2entry()\n", 0, 0, 0 );	assert( bsi->bsi_e != NULL );	memset( bsi->bsi_e, 0, sizeof( Entry ) );	if ( bi->sql_baseObject && BACKSQL_IS_BASEOBJECT_ID( &eid->eid_id ) ) {		Entry	*e;		e = entry_dup( bi->sql_baseObject );		if ( e == NULL ) {			return LDAP_NO_MEMORY;		}					*bsi->bsi_e = *e;		free( e );		goto done;	}	ber_dupbv_x( &bsi->bsi_e->e_name, &eid->eid_dn, op->o_tmpmemctx );	ber_dupbv_x( &bsi->bsi_e->e_nname, &eid->eid_ndn, op->o_tmpmemctx );	bsi->bsi_e->e_attrs = NULL;	bsi->bsi_e->e_private = NULL;	bsi->bsi_oc = backsql_id2oc( bsi->bsi_op->o_bd->be_private,			eid->eid_oc_id );	bsi->bsi_c_eid = eid;#ifndef BACKSQL_ARBITRARY_KEY		/* FIXME: unused */	bsi->bsi_e->e_id = eid->eid_id;#endif /* ! BACKSQL_ARBITRARY_KEY */ 	rc = attr_merge_normalize_one( bsi->bsi_e,			slap_schema.si_ad_objectClass,			&bsi->bsi_oc->bom_oc->soc_cname,			bsi->bsi_op->o_tmpmemctx );	if ( rc != LDAP_SUCCESS ) {		backsql_entry_clean( op, bsi->bsi_e );		return rc;	}	if ( bsi->bsi_attrs == NULL || ( bsi->bsi_flags & BSQL_SF_ALL_USER ) )	{		Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "			"retrieving all attributes\n", 0, 0, 0 );		avl_apply( bsi->bsi_oc->bom_attrs, backsql_get_attr_vals,				bsi, 0, AVL_INORDER );	} else {		Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "			"custom attribute list\n", 0, 0, 0 );		for ( i = 0; !BER_BVISNULL( &bsi->bsi_attrs[ i ].an_name ); i++ ) {			backsql_at_map_rec	**vat;			AttributeName		*an = &bsi->bsi_attrs[ i ];			int			j;			/* if one of the attributes listed here is			 * a subtype of another, it must be ignored,			 * because subtypes are already dealt with			 * by backsql_supad2at()			 */			for ( j = 0; !BER_BVISNULL( &bsi->bsi_attrs[ j ].an_name ); j++ ) {				/* skip self */				if ( j == i ) {					continue;				}				/* skip subtypes */				if ( is_at_subtype( an->an_desc->ad_type,							bsi->bsi_attrs[ j ].an_desc->ad_type ) )				{					goto next;				}			}			rc = backsql_supad2at( bsi->bsi_oc, an->an_desc, &vat );			if ( rc != 0 || vat == NULL ) {				Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "						"attribute \"%s\" is not defined "						"for objectlass \"%s\"\n",						an->an_name.bv_val, 						BACKSQL_OC_NAME( bsi->bsi_oc ), 0 );				continue;			}			for ( j = 0; vat[j]; j++ ) {    				backsql_get_attr_vals( vat[j], bsi );			}			ch_free( vat );next:;		}	}	if ( bsi->bsi_flags & BSQL_SF_RETURN_ENTRYUUID ) {		Attribute	*a_entryUUID,				**ap;		a_entryUUID = backsql_operational_entryUUID( bi, eid );		if ( a_entryUUID != NULL ) {			for ( ap = &bsi->bsi_e->e_attrs; 					*ap; 					ap = &(*ap)->a_next );			*ap = a_entryUUID;		}	}	if ( ( bsi->bsi_flags & BSQL_SF_ALL_OPER )			|| an_find( bsi->bsi_attrs, &AllOper )			|| an_find( bsi->bsi_attrs, &slap_schema.si_ad_structuralObjectClass->ad_cname ) )	{		ObjectClass	*soc = NULL;		if ( BACKSQL_CHECK_SCHEMA( bi ) ) {			Attribute	*a;			const char	*text = NULL;			char		textbuf[ 1024 ];			size_t		textlen = sizeof( textbuf );			struct berval	soc_name,					bv[ 2 ],					*nvals;			int		rc = LDAP_SUCCESS;			a = attr_find( bsi->bsi_e->e_attrs,					slap_schema.si_ad_objectClass );			if ( a != NULL ) {				nvals = a->a_nvals;			} else {				bv[ 0 ] = bsi->bsi_oc->bom_oc->soc_cname;				BER_BVZERO( &bv[ 1 ] );				nvals = bv;			}			rc = structural_class( nvals, &soc_name, &soc, 					&text, textbuf, textlen );			if ( rc != LDAP_SUCCESS ) {      				Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "					"structural_class() failed %d (%s)\n",					bsi->bsi_e->e_name.bv_val,					rc, text ? text : "" );				backsql_entry_clean( op, bsi->bsi_e );				return rc;			}			if ( !bvmatch( &soc->soc_cname, &bsi->bsi_oc->bom_oc->soc_cname ) ) {				if ( !is_object_subclass( bsi->bsi_oc->bom_oc, soc ) ) {      					Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "						"computed structuralObjectClass %s "						"does not match objectClass %s associated "						"to entry\n",						bsi->bsi_e->e_name.bv_val, soc->soc_cname.bv_val,						bsi->bsi_oc->bom_oc->soc_cname.bv_val );					backsql_entry_clean( op, bsi->bsi_e );					return rc;				}      				Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "					"computed structuralObjectClass %s "					"is subclass of objectClass %s associated "					"to entry\n",					bsi->bsi_e->e_name.bv_val, soc->soc_cname.bv_val,					bsi->bsi_oc->bom_oc->soc_cname.bv_val );			}		} else {			soc = bsi->bsi_oc->bom_oc;		}		rc = attr_merge_normalize_one( bsi->bsi_e,				slap_schema.si_ad_structuralObjectClass,				&soc->soc_cname,				bsi->bsi_op->o_tmpmemctx );		if ( rc != LDAP_SUCCESS ) {			backsql_entry_clean( op, bsi->bsi_e );			return rc;		}	}done:;	Debug( LDAP_DEBUG_TRACE, "<==backsql_id2entry()\n", 0, 0, 0 );	return LDAP_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -