- break;
- }
-
- if ( at->bam_delete_proc == NULL ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "delete procedure is not defined "
- "for attribute '%s' "
- "- adding only\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;
- }
-
- goto add_only;
- }
-
-del_all:
- rc = backsql_Prepare( dbh, &asth, at->bam_query, 0 );
- if ( rc != SQL_SUCCESS ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "error preparing query\n", 0, 0, 0 );
- backsql_PrintErrors( bi->db_env, dbh,
- asth, rc );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
-
- break;
- }
-
- rc = backsql_BindParamID( asth, 1, &e_id->keyval );
- if ( rc != SQL_SUCCESS ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "error binding key value parameter\n",
- 0, 0, 0 );
- backsql_PrintErrors( bi->db_env, dbh,
- asth, rc );
- SQLFreeStmt( asth, SQL_DROP );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
-
- break;
- }
-
- rc = SQLExecute( asth );
- if ( !BACKSQL_SUCCESS( rc ) ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "error executing attribute query\n",
- 0, 0, 0 );
- backsql_PrintErrors( bi->db_env, dbh,
- asth, rc );
- SQLFreeStmt( asth, SQL_DROP );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
-
- break;
- }
-
- backsql_BindRowAsStrings( asth, &row );
- rc = SQLFetch( asth );
- for ( ; BACKSQL_SUCCESS( rc ); rc = SQLFetch( asth ) ) {
- for ( i = 0; i < row.ncols; i++ ) {
- if ( BACKSQL_IS_DEL( at->bam_expect_return ) ) {
- pno = 1;
- SQLBindParameter(sth, 1,
- SQL_PARAM_OUTPUT,
- SQL_C_ULONG,
- SQL_INTEGER,
- 0, 0, &prc, 0, 0 );
- } else {
- pno = 0;
- }
- po = ( BACKSQL_IS_DEL( at->bam_param_order ) ) > 0;
- SQLBindParameter( sth, pno + 1 + po,
- SQL_PARAM_INPUT,
- SQL_C_ULONG, SQL_INTEGER,
- 0, 0, &e_id->keyval, 0, 0 );
-
- /*
- * check for syntax needed here
- * maybe need binary bind?
- */
- SQLBindParameter(sth, pno + 2 - po,
- SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR,
- 0, 0, row.cols[ i ],
- strlen( row.cols[ i ] ), 0 );
-
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "executing '%s'\n",
- at->bam_delete_proc, 0, 0 );
- rc = SQLExecDirect( sth,
- at->bam_delete_proc, SQL_NTS );
- if ( rc != SQL_SUCCESS ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "delete_proc "
- "execution failed\n",
- 0, 0, 0 );
- backsql_PrintErrors( bi->db_env,
- dbh, sth, rc );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
- }
-#ifdef BACKSQL_REALLOC_STMT
- SQLFreeStmt( sth, SQL_DROP );
- SQLAllocStmt( dbh, &sth );
-#endif /* BACKSQL_REALLOC_STMT */
- }
- }
- backsql_FreeRow( &row );
- SQLFreeStmt( asth, SQL_DROP );
- }
-
- /*
- * PASSTHROUGH - to add new attributes -- do NOT add break
- */
- case LDAP_MOD_ADD:
- case SLAP_MOD_SOFTADD:
-add_only:;
- if ( at->bam_add_proc == NULL ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "add 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;
- }
-
- Debug( LDAP_DEBUG_TRACE, "backsql_modify_internal(): "
- "adding new values for attribute '%s'\n",
- at->bam_ad->ad_cname.bv_val, 0, 0 );
- for ( i = 0, at_val = c_mod->sm_bvalues;
- at_val->bv_val != NULL;
- i++, at_val++ ) {
- if ( BACKSQL_IS_ADD( at->bam_expect_return ) ) {
- pno = 1;
- SQLBindParameter( sth, 1,
- SQL_PARAM_OUTPUT,
- SQL_C_ULONG, SQL_INTEGER,
- 0, 0, &prc, 0, 0);
- } else {
- pno = 0;
- }
- po = ( BACKSQL_IS_ADD( at->bam_param_order ) ) > 0;
- SQLBindParameter( sth, pno + 1 + po,
- SQL_PARAM_INPUT,
- SQL_C_ULONG, SQL_INTEGER,
- 0, 0, &e_id->keyval, 0, 0 );
-
- /*
- * check for syntax needed here
- * maybe need binary bind?
- */
- SQLBindParameter( sth, pno + 2 - po,
- SQL_PARAM_INPUT,
- SQL_C_CHAR, SQL_CHAR,
- 0, 0, at_val->bv_val,
- at_val->bv_len, 0 );
-
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "executing '%s'\n",
- at->bam_add_proc, 0, 0 );
- rc = SQLExecDirect( sth, at->bam_add_proc,
- SQL_NTS );
- if ( rc != SQL_SUCCESS ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "add_proc execution failed\n",
- 0, 0, 0 );
- backsql_PrintErrors( bi->db_env,
- dbh, sth, rc );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
- }
-#ifdef BACKSQL_REALLOC_STMT
- SQLFreeStmt( sth, SQL_DROP );
- SQLAllocStmt( dbh, &sth );
-#endif /* BACKSQL_REALLOC_STMT */
- }
- 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 ( c_mod->sm_bvalues == 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 = c_mod->sm_bvalues;
- at_val->bv_val != NULL;
- i++, at_val++ ) {
- if ( BACKSQL_IS_DEL( at->bam_expect_return ) ) {
- pno = 1;
- SQLBindParameter( sth, 1,
- SQL_PARAM_OUTPUT,
- SQL_C_ULONG, SQL_INTEGER,
- 0, 0, &prc, 0, 0 );
- } else {
- pno = 0;
- }
- po = ( BACKSQL_IS_DEL( at->bam_param_order ) ) > 0;
- SQLBindParameter( sth, pno + 1 + po,
- SQL_PARAM_INPUT,
- SQL_C_ULONG, SQL_INTEGER,
- 0, 0, &e_id->keyval, 0, 0 );
-
- /*
- * check for syntax needed here
- * maybe need binary bind?
- */
- SQLBindParameter( sth, pno + 2 - po,
- SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
- 0, 0, at_val->bv_val,
- at_val->bv_len, 0 );
-
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "executing '%s'\n",
- at->bam_delete_proc, 0, 0 );
- rc = SQLExecDirect( sth, at->bam_delete_proc,
- SQL_NTS );
- if ( rc != SQL_SUCCESS ) {
- Debug( LDAP_DEBUG_TRACE,
- "backsql_modify_internal(): "
- "delete_proc execution "
- "failed\n", 0, 0, 0 );
- backsql_PrintErrors( bi->db_env,
- dbh, sth, rc );
-
- if ( BACKSQL_FAIL_IF_NO_MAPPING( bi ) ) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "SQL-backend error";
- goto done;
- }
- }
-#ifdef BACKSQL_REALLOC_STMT
- SQLFreeStmt( sth, SQL_DROP );
- SQLAllocStmt( dbh, &sth );
-#endif /* BACKSQL_REALLOC_STMT */
- }
- break;
- }
-#ifndef BACKSQL_REALLOC_STMT
- SQLFreeStmt( sth, SQL_RESET_PARAMS );
-#else /* BACKSQL_REALLOC_STMT */
- SQLFreeStmt( sth, SQL_DROP );
-#endif /* BACKSQL_REALLOC_STMT */
- }
-
-done:;
-
-#ifndef BACKSQL_REALLOC_STMT
- SQLFreeStmt( sth, SQL_DROP );
-#endif /* BACKSQL_REALLOC_STMT */
-
- /*
- * FIXME: should fail in case one change fails?
- */
- return rs->sr_err;
-}