mirror of https://git.48k.eu/ogserver
#942 Improve scope break down process
OpenGnsys has a hierarchical scope system to organize clients: +------+ |Center| +------+ | | | | v v +--------------------+ +----------+ +-->+Groups of classrooms+----->+Classrooms| | +-+------------------+ +----------+ | | | | +-----+ | | v v +-----------------+ +-------+ +-->+Groups of clients+--------->+Clients| | +-+---------------+ +-------+ | | +-----+ OpenGnsys can send commands and tasks to several clients simultaneously selecting a scope. For example: send poweroff to center Faculty of Pharmacy. We had a waterfall process to loop through all members of the scope and obtain the clients. This commit simplifies the process with queries that save us to loop through the members. Co-authored-by: Irina Gómez <irinagomez@us.es>master
parent
87be2ce08d
commit
e4907cc26a
|
@ -3397,45 +3397,6 @@ static int og_queue_task_group_clients(struct og_dbi *dbi, struct og_task *task,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int og_queue_task_classrooms(struct og_dbi *dbi, struct og_task *task,
|
|
||||||
char *query)
|
|
||||||
{
|
|
||||||
|
|
||||||
const char *msglog;
|
|
||||||
dbi_result result;
|
|
||||||
|
|
||||||
result = dbi_conn_queryf(dbi->conn, query);
|
|
||||||
if (!result) {
|
|
||||||
dbi_conn_error(dbi->conn, &msglog);
|
|
||||||
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
|
|
||||||
__func__, __LINE__, msglog);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (dbi_result_next_row(result)) {
|
|
||||||
uint32_t classroom_id = dbi_result_get_uint(result, "idaula");
|
|
||||||
|
|
||||||
sprintf(query, "SELECT idgrupo FROM gruposordenadores "
|
|
||||||
"WHERE idaula=%d AND grupoid=0", classroom_id);
|
|
||||||
if (og_queue_task_group_clients(dbi, task, query)) {
|
|
||||||
dbi_result_free(result);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(query,"SELECT ip, mac, idordenador FROM ordenadores "
|
|
||||||
"WHERE idaula=%d AND grupoid=0", classroom_id);
|
|
||||||
if (og_queue_task_command(dbi, task, query)) {
|
|
||||||
dbi_result_free(result);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
dbi_result_free(result);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int og_queue_task_group_classrooms(struct og_dbi *dbi,
|
static int og_queue_task_group_classrooms(struct og_dbi *dbi,
|
||||||
struct og_task *task, char *query)
|
struct og_task *task, char *query)
|
||||||
{
|
{
|
||||||
|
@ -3461,8 +3422,13 @@ static int og_queue_task_group_classrooms(struct og_dbi *dbi,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(query,"SELECT idaula FROM aulas WHERE grupoid=%d", group_id);
|
sprintf(query,
|
||||||
if (og_queue_task_classrooms(dbi, task, query)) {
|
"SELECT ip,mac,idordenador "
|
||||||
|
"FROM ordenadores INNER JOIN aulas "
|
||||||
|
"WHERE ordenadores.idaula=aulas.idaula "
|
||||||
|
"AND aulas.grupoid=%d",
|
||||||
|
group_id);
|
||||||
|
if (og_queue_task_command(dbi, task, query)) {
|
||||||
dbi_result_free(result);
|
dbi_result_free(result);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -3474,47 +3440,42 @@ static int og_queue_task_group_classrooms(struct og_dbi *dbi,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int og_queue_task_center(struct og_dbi *dbi, struct og_task *task,
|
|
||||||
char *query)
|
|
||||||
{
|
|
||||||
|
|
||||||
sprintf(query,"SELECT idgrupo FROM grupos WHERE idcentro=%i AND grupoid=0 AND tipo=%d",
|
|
||||||
task->scope, AMBITO_GRUPOSAULAS);
|
|
||||||
if (og_queue_task_group_classrooms(dbi, task, query))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
sprintf(query,"SELECT idaula FROM aulas WHERE idcentro=%i AND grupoid=0",
|
|
||||||
task->scope);
|
|
||||||
if (og_queue_task_classrooms(dbi, task, query))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int og_queue_task_clients(struct og_dbi *dbi, struct og_task *task)
|
static int og_queue_task_clients(struct og_dbi *dbi, struct og_task *task)
|
||||||
{
|
{
|
||||||
char query[4096];
|
char query[4096];
|
||||||
|
|
||||||
switch (task->type_scope) {
|
switch (task->type_scope) {
|
||||||
case AMBITO_CENTROS:
|
case AMBITO_CENTROS:
|
||||||
return og_queue_task_center(dbi, task, query);
|
sprintf(query,
|
||||||
|
"SELECT ip,mac,idordenador "
|
||||||
|
"FROM ordenadores INNER JOIN aulas "
|
||||||
|
"WHERE ordenadores.idaula=aulas.idaula "
|
||||||
|
"AND idcentro=%d",
|
||||||
|
task->scope);
|
||||||
|
return og_queue_task_command(dbi, task, query);
|
||||||
case AMBITO_GRUPOSAULAS:
|
case AMBITO_GRUPOSAULAS:
|
||||||
sprintf(query, "SELECT idgrupo FROM grupos "
|
sprintf(query,
|
||||||
"WHERE idgrupo=%i AND tipo=%d",
|
"SELECT idgrupo FROM grupos "
|
||||||
task->scope, AMBITO_GRUPOSAULAS);
|
"WHERE idgrupo=%i AND tipo=%d",
|
||||||
|
task->scope, AMBITO_GRUPOSAULAS);
|
||||||
return og_queue_task_group_classrooms(dbi, task, query);
|
return og_queue_task_group_classrooms(dbi, task, query);
|
||||||
case AMBITO_AULAS:
|
case AMBITO_AULAS:
|
||||||
sprintf(query, "SELECT idaula FROM aulas "
|
sprintf(query,
|
||||||
"WHERE idaula = %d", task->scope);
|
"SELECT ip,mac,idordenador FROM ordenadores "
|
||||||
return og_queue_task_classrooms(dbi, task, query);
|
"WHERE idaula=%d",
|
||||||
|
task->scope);
|
||||||
|
return og_queue_task_command(dbi, task, query);
|
||||||
case AMBITO_GRUPOSORDENADORES:
|
case AMBITO_GRUPOSORDENADORES:
|
||||||
sprintf(query, "SELECT idgrupo FROM gruposordenadores "
|
sprintf(query,
|
||||||
"WHERE idgrupo = %d", task->scope);
|
"SELECT idgrupo FROM gruposordenadores "
|
||||||
|
"WHERE idgrupo = %d",
|
||||||
|
task->scope);
|
||||||
return og_queue_task_group_clients(dbi, task, query);
|
return og_queue_task_group_clients(dbi, task, query);
|
||||||
case AMBITO_ORDENADORES:
|
case AMBITO_ORDENADORES:
|
||||||
sprintf(query, "SELECT ip, mac, idordenador "
|
sprintf(query,
|
||||||
"FROM ordenadores "
|
"SELECT ip, mac, idordenador FROM ordenadores "
|
||||||
"WHERE idordenador = %d", task->scope);
|
"WHERE idordenador = %d",
|
||||||
|
task->scope);
|
||||||
return og_queue_task_command(dbi, task, query);
|
return og_queue_task_command(dbi, task, query);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue