📄 add.c
字号:
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 + -