/* * pgsql_modify_common - modify the entity table and insert a txn record * * IN pg_conn: database connection * IN type: modification action type * IN now: current time * IN cluster: which cluster is modified, "" for shared tables * IN user_name: user performing the modify operation * IN table: name of the table to modify * IN name_char: which entities to modify * FORMAT: "(name=val1 OR name=val2...)" * IN vals: values of new attributes of the entities * FORMAT: ", field1=val1,field2=val2..." * NOTE the leading ", " * RET: error code */ extern int pgsql_modify_common(pgsql_conn_t *pg_conn, uint16_t type, time_t now, char *cluster, char *user_name, char *table, char *name_char, char *vals) { char *query = NULL; int rc = SLURM_SUCCESS; query = xstrdup_printf("UPDATE %s SET mod_time=%ld %s " "WHERE deleted=0 AND %s;", table, now, vals, name_char); rc = DEF_QUERY_RET_RC; if (rc == SLURM_SUCCESS) rc = add_txn(pg_conn, now, cluster, type, name_char, user_name, (vals+2)); if (rc != SLURM_SUCCESS) { reset_pgsql_conn(pg_conn); return SLURM_ERROR; } return SLURM_SUCCESS; }
/* * as_pg_add_clusters - add clusters * * IN pg_conn: database connection * IN uid: user performing the add operation * IN cluster_list: clusters to add * RET: error code */ extern int as_pg_add_clusters(pgsql_conn_t *pg_conn, uint32_t uid, List cluster_list) { ListIterator itr = NULL; int rc = SLURM_SUCCESS, added = 0; slurmdb_cluster_rec_t *object = NULL; time_t now = time(NULL); List assoc_list = NULL; slurmdb_association_rec_t *assoc = NULL; char *txn_info = NULL, *query = NULL, *user_name = NULL; if (check_db_connection(pg_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; assoc_list = list_create(slurmdb_destroy_association_rec); user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(cluster_list); while((object = list_next(itr))) { if(!object->name) { error("as/pg: add_clusters: We need a cluster " "name to add."); rc = SLURM_ERROR; continue; } if (strchr(object->name, '.')) { error("as/pg: add_clusters: invalid cluster name %s", object->name); rc = SLURM_ERROR; continue; } if (cluster_in_db(pg_conn, object->name)) { error("cluster %s already added", object->name); rc = SLURM_ERROR; continue; } query = xstrdup_printf( "SELECT public.add_cluster(" "(%ld, %ld, 0, '%s', '', 0, 0, %u, 1, 0, 0));", (long)now, (long)now, object->name, object->classification); rc = DEF_QUERY_RET_RC; if(rc != SLURM_SUCCESS) { error("Couldn't add cluster %s", object->name); added = 0; /* rollback modification to DB */ break; } rc = _create_cluster_tables(pg_conn, object->name); if (rc != SLURM_SUCCESS) { error("Failed creating cluster tables for %s", object->name); added = 0; break; } /* add root account assoc: <'cluster', 'root', '', ''> */ if (add_cluster_root_assoc(pg_conn, now, object, &txn_info) != SLURM_SUCCESS) { added = 0; break; } if (add_txn(pg_conn, now, "", DBD_ADD_CLUSTERS, object->name, user_name, txn_info) != SLURM_SUCCESS) { error("as/pg: add_cluster: couldn't add txn"); } else { added ++; } xfree(txn_info); /* Add user root by default to run from the root * association. This gets popped off so we need to * read it every time here. */ assoc = xmalloc(sizeof(slurmdb_association_rec_t)); slurmdb_init_association_rec(assoc, 0); list_append(assoc_list, assoc); assoc->cluster = xstrdup(object->name); assoc->user = xstrdup("root"); assoc->acct = xstrdup("root"); if(acct_storage_p_add_associations(pg_conn, uid, assoc_list) == SLURM_ERROR) { error("Problem adding root user association"); rc = SLURM_ERROR; } list_flush(assoc_list); /* do not add it again, in case not popped */ } list_iterator_destroy(itr); xfree(user_name); list_destroy(assoc_list); if (!added) { reset_pgsql_conn(pg_conn); } else { /* when loading sacctmgr cfg file, get_assoc will be called before commit */ pg_conn->cluster_changed = 1; } return rc; }