extern List as_mysql_remove_accts(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_account_cond_t *acct_cond) { ListIterator itr = NULL; List ret_list = NULL; List coord_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; bool jobs_running = 0; if (!acct_cond) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (acct_cond->assoc_cond && acct_cond->assoc_cond->acct_list && list_count(acct_cond->assoc_cond->acct_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->assoc_cond->acct_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->description_list && list_count(acct_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->organization_list && list_count(acct_cond->organization_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->organization_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "organization='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (!extra) { error("Nothing to remove"); return NULL; } query = xstrdup_printf("select name from %s %s;", acct_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { char *object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "name='%s'", object); xstrfmtcat(assoc_char, "t2.acct='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); xstrfmtcat(assoc_char, " || t2.acct='%s'", object); } } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); /* We need to remove these accounts from the coord's that have it */ coord_list = as_mysql_remove_coord( mysql_conn, uid, ret_list, NULL); if (coord_list) list_destroy(coord_list); user_name = uid_to_string((uid_t) uid); slurm_mutex_lock(&as_mysql_cluster_list_lock); itr = list_iterator_create(as_mysql_cluster_list); while ((object = list_next(itr))) { if ((rc = remove_common(mysql_conn, DBD_REMOVE_ACCOUNTS, now, user_name, acct_table, name_char, assoc_char, object, ret_list, &jobs_running)) != SLURM_SUCCESS) break; } list_iterator_destroy(itr); slurm_mutex_unlock(&as_mysql_cluster_list_lock); xfree(user_name); xfree(name_char); xfree(assoc_char); if (rc == SLURM_ERROR) { list_destroy(ret_list); return NULL; } if (jobs_running) errno = ESLURM_JOBS_RUNNING_ON_ASSOC; else errno = SLURM_SUCCESS; return ret_list; }
extern List as_mysql_remove_users(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_user_cond_t *user_cond) { ListIterator itr = NULL; List ret_list = NULL; List coord_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; slurmdb_user_cond_t user_coord_cond; slurmdb_association_cond_t assoc_cond; slurmdb_wckey_cond_t wckey_cond; bool jobs_running = 0; if (!user_cond) { error("we need something to remove"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (user_cond->assoc_cond && user_cond->assoc_cond->user_list && list_count(user_cond->assoc_cond->user_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } ret_list = _get_other_user_names_to_mod(mysql_conn, uid, user_cond); if (user_cond->admin_level != SLURMDB_ADMIN_NOTSET) { xstrfmtcat(extra, " && admin_level=%u", user_cond->admin_level); } if (!extra && !ret_list) { error("Nothing to remove"); return NULL; } else if (!extra) { /* means we got a ret_list and don't need to look at the user_table. */ goto no_user_table; } /* Only handle this if we need to actually query the user_table. If a request comes in stating they want to remove all users with default account of whatever then that doesn't deal with the user_table. */ query = xstrdup_printf("select name from %s where deleted=0 %s;", user_table, extra); xfree(extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); return NULL; } if (!ret_list) ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) slurm_addto_char_list(ret_list, row[0]); mysql_free_result(result); no_user_table: if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); memset(&user_coord_cond, 0, sizeof(slurmdb_user_cond_t)); memset(&assoc_cond, 0, sizeof(slurmdb_association_cond_t)); /* we do not need to free the objects we put in here since they are also placed in a list that will be freed */ assoc_cond.user_list = list_create(NULL); user_coord_cond.assoc_cond = &assoc_cond; itr = list_iterator_create(ret_list); while ((object = list_next(itr))) { slurmdb_user_rec_t *user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); list_append(assoc_cond.user_list, object); if (name_char) { xstrfmtcat(name_char, " || name='%s'", object); xstrfmtcat(assoc_char, " || t2.user='******'", object); } else { xstrfmtcat(name_char, "name='%s'", object); xstrfmtcat(assoc_char, "t2.user='******'", object); } user_rec->name = xstrdup(object); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_USER, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); /* We need to remove these accounts from the coord's that have it */ coord_list = as_mysql_remove_coord( mysql_conn, uid, NULL, &user_coord_cond); if (coord_list) list_destroy(coord_list); /* We need to remove these users from the wckey table */ memset(&wckey_cond, 0, sizeof(slurmdb_wckey_cond_t)); wckey_cond.user_list = assoc_cond.user_list; coord_list = as_mysql_remove_wckeys(mysql_conn, uid, &wckey_cond); if (coord_list) list_destroy(coord_list); list_destroy(assoc_cond.user_list); user_name = uid_to_string((uid_t) uid); slurm_mutex_lock(&as_mysql_cluster_list_lock); itr = list_iterator_create(as_mysql_cluster_list); while ((object = list_next(itr))) { if ((rc = remove_common(mysql_conn, DBD_REMOVE_USERS, now, user_name, user_table, name_char, assoc_char, object, ret_list, &jobs_running)) != SLURM_SUCCESS) break; } list_iterator_destroy(itr); slurm_mutex_unlock(&as_mysql_cluster_list_lock); xfree(user_name); xfree(name_char); if (rc == SLURM_ERROR) { list_destroy(ret_list); xfree(assoc_char); return NULL; } query = xstrdup_printf( "update %s as t2 set deleted=1, mod_time=%ld where %s", acct_coord_table, (long)now, assoc_char); xfree(assoc_char); rc = mysql_db_query(mysql_conn, query); xfree(query); if (rc != SLURM_SUCCESS) { error("Couldn't remove user coordinators"); list_destroy(ret_list); return NULL; } if (jobs_running) errno = ESLURM_JOBS_RUNNING_ON_ASSOC; else errno = SLURM_SUCCESS; return ret_list; }