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

📄 add.c

📁 OpenLdap是LDAP的开源项目
💻 C
📖 第 1 页 / 共 3 页
字号:
				rc = SQLExecute( sth );				if ( rc == SQL_SUCCESS && prc == LDAP_SUCCESS ) {					rs->sr_err = LDAP_SUCCESS;				} else {					Debug( LDAP_DEBUG_TRACE,						"   backsql_modify_internal(): "						"add_proc execution failed "						"(rc=%d, prc=%d)\n",						rc, prc, 0 );					if ( prc != LDAP_SUCCESS ) {						/* SQL procedure executed fine 						 * but returned an error */						SQLFreeStmt( sth, SQL_DROP );						rs->sr_err = BACKSQL_SANITIZE_ERROR( prc );						rs->sr_text = at->bam_ad->ad_cname.bv_val;						return rs->sr_err;										} else {						backsql_PrintErrors( bi->sql_db_env, dbh,								sth, rc );						if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) 						{							SQLFreeStmt( sth, SQL_DROP );							rs->sr_err = LDAP_OTHER;							rs->sr_text = "SQL-backend error";							goto done;						}					}				}				SQLFreeStmt( sth, SQL_DROP );			}			break;				      	case LDAP_MOD_DELETE:			if ( at->bam_delete_proc == NULL ) {				Debug( LDAP_DEBUG_TRACE,					"   backsql_modify_internal(): "					"delete procedure is not defined "					"for attribute \"%s\"\n",					at->bam_ad->ad_cname.bv_val, 0, 0 );				if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {					rs->sr_err = LDAP_UNWILLING_TO_PERFORM;					rs->sr_text = "operation not permitted "						"within namingContext";					goto done;				}				break;			}			if ( sm_values == NULL ) {				Debug( LDAP_DEBUG_TRACE,					"   backsql_modify_internal(): "					"no values given to delete "					"for attribute \"%s\" "					"-- deleting all values\n",					at->bam_ad->ad_cname.bv_val, 0, 0 );				goto del_all;			}			Debug( LDAP_DEBUG_TRACE, "   backsql_modify_internal(): "				"deleting values for attribute \"%s\"\n",				at->bam_ad->ad_cname.bv_val, 0, 0 );			for ( i = 0, at_val = sm_values;					!BER_BVISNULL( at_val );					i++, at_val++ )			{				SQLHSTMT	sth = SQL_NULL_HSTMT;				/* first parameter position, parameter order */				SQLUSMALLINT	pno = 0,						po;				/* procedure return code */				int		prc = LDAP_SUCCESS;				rc = backsql_Prepare( dbh, &sth, at->bam_delete_proc, 0 );				if ( rc != SQL_SUCCESS ) {					Debug( LDAP_DEBUG_TRACE,						"   backsql_modify_internal(): "						"error preparing delete query\n", 						0, 0, 0 );					backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );					rs->sr_err = LDAP_OTHER;					rs->sr_text = "SQL-backend error";					goto done;				}				if ( BACKSQL_IS_DEL( at->bam_expect_return ) ) {					pno = 1;					rc = backsql_BindParamInt( sth, 1,						SQL_PARAM_OUTPUT, &prc );					if ( rc != SQL_SUCCESS ) {						Debug( LDAP_DEBUG_TRACE,							"   backsql_modify_internal(): "							"error binding output parameter for %s[%d]\n",							at->bam_ad->ad_cname.bv_val, i, 0 );						backsql_PrintErrors( bi->sql_db_env, dbh, 							sth, rc );						SQLFreeStmt( sth, SQL_DROP );						rs->sr_text = "SQL-backend error";						rs->sr_err = LDAP_OTHER;						goto done;					}				}				po = ( BACKSQL_IS_DEL( at->bam_param_order ) ) > 0;				rc = backsql_BindParamID( sth, pno + 1 + po,					SQL_PARAM_INPUT, &e_id->eid_keyval );				if ( rc != SQL_SUCCESS ) {					Debug( LDAP_DEBUG_TRACE,						"   backsql_modify_internal(): "						"error binding keyval parameter for %s[%d]\n",						at->bam_ad->ad_cname.bv_val, i, 0 );					backsql_PrintErrors( bi->sql_db_env, dbh, 						sth, rc );					SQLFreeStmt( sth, SQL_DROP );					rs->sr_text = "SQL-backend error";					rs->sr_err = LDAP_OTHER;					goto done;				}#ifdef BACKSQL_ARBITRARY_KEY				Debug( LDAP_DEBUG_TRACE,					"   backsql_modify_internal(): "					"arg(%d)=\"%s\"\n", 					pno + 1 + po, e_id->eid_keyval.bv_val, 0 );#else /* ! BACKSQL_ARBITRARY_KEY */				Debug( LDAP_DEBUG_TRACE,					"   backsql_modify_internal(): "					"arg(%d)=\"%lu\"\n", 					pno + 1 + po, e_id->eid_keyval, 0 );#endif /* ! BACKSQL_ARBITRARY_KEY */				/*				 * check for syntax needed here 				 * maybe need binary bind?				 */				rc = backsql_BindParamBerVal( sth, pno + 2 - po,					SQL_PARAM_INPUT, at_val );				if ( rc != SQL_SUCCESS ) {					Debug( LDAP_DEBUG_TRACE,						"   backsql_modify_internal(): "						"error binding value parameter for %s[%d]\n",						at->bam_ad->ad_cname.bv_val, i, 0 );					backsql_PrintErrors( bi->sql_db_env, dbh, 						sth, rc );					SQLFreeStmt( sth, SQL_DROP );					rs->sr_text = "SQL-backend error";					rs->sr_err = LDAP_OTHER;					goto done;				}				Debug( LDAP_DEBUG_TRACE,					"   backsql_modify_internal(): "					"executing \"%s\"\n", 					at->bam_delete_proc, 0, 0 );				rc = SQLExecute( sth );				if ( rc == SQL_SUCCESS && prc == LDAP_SUCCESS )				{					rs->sr_err = LDAP_SUCCESS;									} else {					Debug( LDAP_DEBUG_TRACE,						"   backsql_modify_internal(): "						"delete_proc execution "						"failed (rc=%d, prc=%d)\n",						rc, prc, 0 );					if ( prc != LDAP_SUCCESS ) {						/* SQL procedure executed fine						 * but returned an error */						rs->sr_err = BACKSQL_SANITIZE_ERROR( prc );						rs->sr_text = at->bam_ad->ad_cname.bv_val;						goto done;											} else {						backsql_PrintErrors( bi->sql_db_env,								dbh, sth, rc );						SQLFreeStmt( sth, SQL_DROP );						rs->sr_err = LDAP_OTHER;						rs->sr_text = at->bam_ad->ad_cname.bv_val;						goto done;					}				}				SQLFreeStmt( sth, SQL_DROP );			}			break;	      	case LDAP_MOD_INCREMENT:			Debug( LDAP_DEBUG_TRACE, "   backsql_modify_internal(): "				"increment not supported yet\n", 0, 0, 0 );			if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {				rs->sr_err = LDAP_OTHER;				rs->sr_text = "SQL-backend error";				goto done;			}			break;		}	}done:;	Debug( LDAP_DEBUG_TRACE, "<==backsql_modify_internal(): %d%s%s\n",		rs->sr_err,		rs->sr_text ? ": " : "",		rs->sr_text ? rs->sr_text : "" );	/*	 * FIXME: should fail in case one change fails?	 */	return rs->sr_err;}static intbacksql_add_attr(	Operation		*op,	SlapReply		*rs,	SQLHDBC 		dbh,	backsql_oc_map_rec 	*oc,	Attribute		*at,	unsigned long		new_keyval ){	backsql_info		*bi = (backsql_info*)op->o_bd->be_private;	backsql_at_map_rec	*at_rec = NULL;	struct berval		*at_val;	unsigned long		i;	RETCODE			rc;	SQLUSMALLINT		currpos;	SQLHSTMT 		sth = SQL_NULL_HSTMT;	at_rec = backsql_ad2at( oc, at->a_desc );   	if ( at_rec == NULL ) {		Debug( LDAP_DEBUG_TRACE, "   backsql_add_attr(\"%s\"): "			"attribute \"%s\" is not registered "			"in objectclass \"%s\"\n",			op->ora_e->e_name.bv_val,			at->a_desc->ad_cname.bv_val,			BACKSQL_OC_NAME( oc ) );		if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {			rs->sr_text = "operation not permitted "				"within namingContext";			return rs->sr_err = LDAP_UNWILLING_TO_PERFORM;		}		return LDAP_SUCCESS;	}		if ( at_rec->bam_add_proc == NULL ) {		Debug( LDAP_DEBUG_TRACE, "   backsql_add_attr(\"%s\"): "			"add procedure is not defined "			"for attribute \"%s\" "			"of structuralObjectClass \"%s\"\n",			op->ora_e->e_name.bv_val,			at->a_desc->ad_cname.bv_val,			BACKSQL_OC_NAME( oc ) );		if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {			rs->sr_text = "operation not permitted "				"within namingContext";			return rs->sr_err = LDAP_UNWILLING_TO_PERFORM;		}		return LDAP_SUCCESS;	}	for ( i = 0, at_val = &at->a_vals[ i ];		       	!BER_BVISNULL( at_val );			i++, at_val = &at->a_vals[ i ] )	{		/* procedure return code */		int		prc = LDAP_SUCCESS;		/* first parameter #, parameter order */		SQLUSMALLINT	pno, po;		char		logbuf[] = "val[18446744073709551615UL], id=18446744073709551615UL";				/*		 * Do not deal with the objectClass that is used		 * to build the entry		 */		if ( at->a_desc == slap_schema.si_ad_objectClass ) {			if ( dn_match( at_val, &oc->bom_oc->soc_cname ) )			{				continue;			}		}		rc = backsql_Prepare( dbh, &sth, at_rec->bam_add_proc, 0 );		if ( rc != SQL_SUCCESS ) {			rs->sr_text = "SQL-backend error";			return rs->sr_err = LDAP_OTHER;		}		if ( BACKSQL_IS_ADD( at_rec->bam_expect_return ) ) {			pno = 1;			rc = backsql_BindParamInt( sth, 1, SQL_PARAM_OUTPUT, &prc );			if ( rc != SQL_SUCCESS ) {				Debug( LDAP_DEBUG_TRACE,					"   backsql_add_attr(): "					"error binding output parameter for %s[%lu]\n",					at_rec->bam_ad->ad_cname.bv_val, i, 0 );				backsql_PrintErrors( bi->sql_db_env, dbh, 					sth, rc );				SQLFreeStmt( sth, SQL_DROP );				rs->sr_text = "SQL-backend error";				return rs->sr_err = LDAP_OTHER;			}		} else {			pno = 0;		}		po = ( BACKSQL_IS_ADD( at_rec->bam_param_order ) ) > 0;		currpos = pno + 1 + po;		rc = backsql_BindParamInt( sth, currpos,				SQL_PARAM_INPUT, &new_keyval );		if ( rc != SQL_SUCCESS ) {			Debug( LDAP_DEBUG_TRACE,				"   backsql_add_attr(): "				"error binding keyval parameter for %s[%lu]\n",				at_rec->bam_ad->ad_cname.bv_val, i, 0 );			backsql_PrintErrors( bi->sql_db_env, dbh, 				sth, rc );			SQLFreeStmt( sth, SQL_DROP );			rs->sr_text = "SQL-backend error";			return rs->sr_err = LDAP_OTHER;		}		currpos = pno + 2 - po;		/*		 * check for syntax needed here 		 * maybe need binary bind?		 */		rc = backsql_BindParamBerVal( sth, currpos, SQL_PARAM_INPUT, at_val );		if ( rc != SQL_SUCCESS ) {			Debug( LDAP_DEBUG_TRACE,				"   backsql_add_attr(): "				"error binding value parameter for %s[%lu]\n",				at_rec->bam_ad->ad_cname.bv_val, i, 0 );			backsql_PrintErrors( bi->sql_db_env, dbh, 				sth, rc );			SQLFreeStmt( sth, SQL_DROP );			rs->sr_text = "SQL-backend error";			return rs->sr_err = LDAP_OTHER;		}#ifdef LDAP_DEBUG		snprintf( logbuf, sizeof( logbuf ), "val[%lu], id=%lu",				i, new_keyval );		Debug( LDAP_DEBUG_TRACE, "   backsql_add_attr(\"%s\"): "			"executing \"%s\" %s\n", 			op->ora_e->e_name.bv_val,			at_rec->bam_add_proc, logbuf );#endif		rc = SQLExecute( sth );		if ( rc == SQL_SUCCESS && prc == LDAP_SUCCESS ) {			rs->sr_err = LDAP_SUCCESS;		} else {			Debug( LDAP_DEBUG_TRACE,				"   backsql_add_attr(\"%s\"): "				"add_proc execution failed (rc=%d, prc=%d)\n", 				op->ora_e->e_name.bv_val, rc, prc );			if ( prc != LDAP_SUCCESS ) {				/* SQL procedure executed fine				 * but returned an error */				rs->sr_err = BACKSQL_SANITIZE_ERROR( prc );				rs->sr_text = op->ora_e->e_name.bv_val;				SQLFreeStmt( sth, SQL_DROP );				return rs->sr_err;			} else {				backsql_PrintErrors( bi->sql_db_env, dbh,						sth, rc );				rs->sr_err = LDAP_OTHER;				rs->sr_text = op->ora_e->e_name.bv_val;				SQLFreeStmt( sth, SQL_DROP );				return rs->sr_err;			}		}		SQLFreeStmt( sth, SQL_DROP );	}	return LDAP_SUCCESS;}intbacksql_add( Operation *op, SlapReply *rs ){	backsql_info		*bi = (backsql_info*)op->o_bd->be_private;	SQLHDBC 		dbh = SQL_NULL_HDBC;	SQLHSTMT 		sth = SQL_NULL_HSTMT;	unsigned long		new_keyval = 0;	RETCODE			rc;	backsql_oc_map_rec 	*oc = NULL;	backsql_srch_info	bsi = { 0 };	Entry			p = { 0 }, *e = NULL;	Attribute		*at,				*at_objectClass = NULL;	struct berval		scname = BER_BVNULL;	struct berval		pdn;	struct berval		realdn = BER_BVNULL;	int			colnum;	slap_mask_t		mask;	char			textbuf[ SLAP_TEXT_BUFLEN ];	size_t			textlen = sizeof( textbuf );#ifdef BACKSQL_SYNCPROV	/*	 * NOTE: fake successful result to force contextCSN to be bumped up	 */	if ( op->o_sync ) {		char		buf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];		struct berval	csn;		csn.bv_val = buf;		csn.bv_len = sizeof( buf );		slap_get_csn( op, &csn, 1 );		rs->sr_err = LDAP_SUCCESS;		send_ldap_result( op, rs );		slap_graduate_commit_csn( op );		return 0;	}#endif /* BACKSQL_SYNCPROV */	Debug( LDAP_DEBUG_TRACE, "==>backsql_add(\"%s\")\n",			op->ora_e->e_name.bv_val, 0, 0 );	slap_add_opattrs( op, &rs->sr_text, textbuf, textlen, 1 );	/* check schema */	if ( BACKSQL_CHECK_SCHEMA( bi ) ) {		char		textbuf[ SLAP_TEXT_BUFLEN ] = { '\0' };		rs->sr_err = entry_schema_check( op, op->ora_e, NULL, 0,			&rs->sr_text, textbuf, sizeof( textbuf ) );		if ( rs->sr_err != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "				"entry failed schema check -- aborting\n",				op->ora_e->e_name.bv_val, 0, 0 );			e = NULL;			goto done;		}	}	/* search structuralObjectClass */	for ( at = op->ora_e->e_attrs; at != NULL; at = at->a_next ) {		if ( at->a_desc == slap_schema.si_ad_structuralObjectClass ) {			break;		}	}	/* there must exist */	if ( at == NULL ) {		char		buf[ SLAP_TEXT_BUFLEN ];		const char	*text;		/* search structuralObjectClass */		for ( at = op->ora_e->e_attrs; at != NULL; at = at->a_next ) {			if ( at->a_desc == slap_schema.si_ad_objectClass ) {				break;			}		}		if ( at == NULL ) {			Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "				"no objectClass\n",				op->ora_e->e_name.bv_val, 0, 0 );			rs->sr_err = LDAP_OBJECT_CLASS_VIOLATION;			e = NULL;			goto done;		}		rs->sr_err = structural_class( at->a_vals, &scname, NULL,				&text, buf, sizeof( buf ) );		if ( rs->sr_err != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "				"%s (%d)\n",				op->ora_e->e_name.bv_val, text, rs->sr_err );			e = NULL;			goto done;		}	} else {		scname = at->a_vals[0];	}	/* I guess we should play with sub/supertypes to find a suitable oc */	oc = backsql_name2oc( bi, &scname );	if ( oc == NULL ) {		Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "			"cannot map structuralObjectClass \"%s\" -- aborting\n",			op->ora_e->e_name.bv_val,			scname.bv_val, 0 );		rs->sr_err = LDAP_UNWILLING_TO_PERFORM;		rs->sr_text = "operation not permitted within namingContext";		e = NULL;		goto done;

⌨️ 快捷键说明

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