/* * as_pg_modify_accounts - modify accounts * * IN pg_conn: database connection * IN uid: user performing the modify operation * IN acct_cond: accounts to modify * IN acct: attribute of accounts after modification * RET: list of accounts modified */ extern List as_pg_modify_accounts(pgsql_conn_t *pg_conn, uint32_t uid, slurmdb_account_cond_t *acct_cond, slurmdb_account_rec_t *acct) { DEF_VARS; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL, *user_name = NULL; char *vals = NULL, *cond = NULL, *name_char = NULL; time_t now = time(NULL); if(!acct_cond || !acct) { error("as/pg: modify_accounts: we need something to change"); return NULL; } if (check_db_connection(pg_conn) != SLURM_SUCCESS) return NULL; if(acct_cond->assoc_cond) concat_cond_list(acct_cond->assoc_cond->acct_list, NULL, "name", &cond); concat_cond_list(acct_cond->description_list, NULL, "description", &cond); concat_cond_list(acct_cond->organization_list, NULL, "organization", &cond); if (!cond) { errno = SLURM_NO_CHANGE_IN_DATA; error("as/pg: modify_accounts: no condition given"); return NULL; } if(acct->description) xstrfmtcat(vals, ", description='%s'", acct->description); if(acct->organization) xstrfmtcat(vals, ", organization='%s'", acct->organization); if(!vals) { xfree(cond); errno = SLURM_NO_CHANGE_IN_DATA; error("as/pg: modify_accounts: no new values given"); return NULL; } query = xstrdup_printf("SELECT name FROM %s WHERE deleted=0 %s;", acct_table, cond); xfree(cond); result = DEF_QUERY_RET; if(!result) { xfree(vals); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); FOR_EACH_ROW { object = xstrdup(ROW(0)); list_append(ret_list, object); if(!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " OR name='%s'", object); } } END_EACH_ROW; PQclear(result); if(!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("as/pg: modify_accounts: didn't effect anything"); xfree(vals); return ret_list; } xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = pgsql_modify_common(pg_conn, DBD_MODIFY_ACCOUNTS, now, "", user_name, acct_table, name_char, vals); xfree(user_name); xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("as/pg: couldn't modify accounts"); list_destroy(ret_list); errno = SLURM_ERROR; ret_list = NULL; } return ret_list; }
/* * as_pg_modify_clusters - modify clusters * This is called by cs_p_register_ctld when ctld registers to dbd. * Also called when modify classification of cluster. * If you need to alter the default values of the cluster, use * modify_associations to change root association of the cluster. * * IN pg_conn: database connection * IN uid: user performing the modify operation * IN cluster_cond: which clusters to modify * IN cluster: attribute of clusters after modification * RET: list of clusters modified */ extern List as_pg_modify_clusters(pgsql_conn_t *pg_conn, uint32_t uid, slurmdb_cluster_cond_t *cluster_cond, slurmdb_cluster_rec_t *cluster) { DEF_VARS; List ret_list = NULL; int rc = SLURM_SUCCESS, set = 0; char *object = NULL, *user_name = NULL, *name_char = NULL; char *vals = NULL, *cond = NULL, *send_char = NULL; time_t now = time(NULL); bool clust_reg = false; if (!cluster_cond || !cluster) { error("as/pg: modify_clusters: we need something to change"); return NULL; } if(check_db_connection(pg_conn) != SLURM_SUCCESS) return NULL; if(!pg_conn->cluster_name && cluster_cond->cluster_list && list_count(cluster_cond->cluster_list)) pg_conn->cluster_name = xstrdup(list_peek(cluster_cond->cluster_list)); concat_cond_list(cluster_cond->cluster_list, NULL, "name", &cond); if(cluster_cond->classification) { xstrfmtcat(cond, " AND (classification & %u)", cluster_cond->classification); } set = 0; if (cluster->control_host) { xstrfmtcat(vals, ", control_host='%s'", cluster->control_host); set++; clust_reg = true; } if (cluster->control_port) { xstrfmtcat(vals, ", control_port=%u", cluster->control_port); set++; clust_reg = true; } if (cluster->rpc_version) { xstrfmtcat(vals, ", rpc_version=%u", cluster->rpc_version); set++; clust_reg = true; } if (cluster->dimensions) { xstrfmtcat(vals, ", dimensions=%u", cluster->dimensions); clust_reg = true; } if (cluster->plugin_id_select) { xstrfmtcat(vals, ", plugin_id_select=%u", cluster->plugin_id_select); clust_reg = true; } if (cluster->flags != NO_VAL) { xstrfmtcat(vals, ", flags=%u", cluster->flags); clust_reg = true; } if (cluster->classification) { xstrfmtcat(vals, ", classification=%u", cluster->classification); } if(!vals) { xfree(cond); errno = SLURM_NO_CHANGE_IN_DATA; error("as/pg: modify_clusters: nothing to change"); return NULL; } else if(clust_reg && (set != 3)) { xfree(vals); xfree(cond); errno = EFAULT; error("as/pg: modify_clusters: need control host, port and " "rpc version to register a cluster"); return NULL; } query = xstrdup_printf( "SELECT name, control_port FROM %s WHERE deleted=0 %s;", cluster_table, cond ?: ""); xfree(cond); result = DEF_QUERY_RET; if (!result) { xfree(vals); error("as/pg: modify_clusters: no result given"); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); FOR_EACH_ROW { object = xstrdup(ROW(0)); list_append(ret_list, object); if(!rc) { xstrfmtcat(name_char, "name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " OR name='%s'", object); } } END_EACH_ROW; PQclear(result); if(!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("as/pg: modify_cluster: nothing effected"); xfree(vals); return ret_list; } if(vals) { send_char = xstrdup_printf("(%s)", name_char); user_name = uid_to_string((uid_t) uid); rc = pgsql_modify_common(pg_conn, DBD_MODIFY_CLUSTERS, now, "", user_name, cluster_table, send_char, vals); xfree(user_name); xfree(send_char); if (rc != SLURM_SUCCESS) { error("Couldn't modify cluster 1"); list_destroy(ret_list); ret_list = NULL; goto end_it; } } end_it: xfree(name_char); xfree(vals); return ret_list; }