mirror of https://git.48k.eu/ogserver
#1051 Fix command schedule for several clients
A single command can be schedule for several clients.
Commit 141b0797e1
introduces a regression when scheduling a command for
several clients, the command only executes successfuly for the first
one.
Fix it by reintroducing the usage of the 'session' column to group
a single command into several actions (one for each client), the web
console interface already expects this 'session' column to be set
accordingly.
master
parent
7325a8629e
commit
33d8cecfe1
27
src/rest.c
27
src/rest.c
|
@ -2979,7 +2979,7 @@ static int og_dbi_queue_command(struct og_dbi *dbi, uint32_t task_id,
|
||||||
result = dbi_conn_queryf(dbi->conn,
|
result = dbi_conn_queryf(dbi->conn,
|
||||||
"SELECT idaccion, idcentro, idordenador, parametros "
|
"SELECT idaccion, idcentro, idordenador, parametros "
|
||||||
"FROM acciones "
|
"FROM acciones "
|
||||||
"WHERE idaccion = %u", task_id);
|
"WHERE sesion = %u", task_id);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
dbi_conn_error(dbi->conn, &msglog);
|
dbi_conn_error(dbi->conn, &msglog);
|
||||||
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
|
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
|
||||||
|
@ -4701,13 +4701,13 @@ static int og_cmd_post_schedule_command(json_t *element,
|
||||||
"INNER JOIN aulas AS a ON o.idaula = a.idaula "
|
"INNER JOIN aulas AS a ON o.idaula = a.idaula "
|
||||||
"INNER JOIN centros AS c ON a.idcentro = c.idcentro "
|
"INNER JOIN centros AS c ON a.idcentro = c.idcentro "
|
||||||
"WHERE o.ip = '%s';";
|
"WHERE o.ip = '%s';";
|
||||||
|
uint32_t sequence, session = 0;
|
||||||
int center_id, client_id, len;
|
int center_id, client_id, len;
|
||||||
struct og_cmd_json cmd = {};
|
struct og_cmd_json cmd = {};
|
||||||
const char *legacy_params;
|
const char *legacy_params;
|
||||||
const char *key, *msglog;
|
const char *key, *msglog;
|
||||||
struct og_dbi *dbi;
|
struct og_dbi *dbi;
|
||||||
char task_id[128];
|
char task_id[128];
|
||||||
uint32_t sequence;
|
|
||||||
bool when = false;
|
bool when = false;
|
||||||
dbi_result result;
|
dbi_result result;
|
||||||
json_t *value;
|
json_t *value;
|
||||||
|
@ -4819,6 +4819,26 @@ static int og_cmd_post_schedule_command(json_t *element,
|
||||||
dbi_result_free(result);
|
dbi_result_free(result);
|
||||||
|
|
||||||
sequence = dbi_conn_sequence_last(dbi->conn, NULL);
|
sequence = dbi_conn_sequence_last(dbi->conn, NULL);
|
||||||
|
|
||||||
|
/* This 'session' ID allows us to correlate the schedule with
|
||||||
|
* the commands after expansion.
|
||||||
|
*/
|
||||||
|
if (!session)
|
||||||
|
session = dbi_conn_sequence_last(dbi->conn, NULL);
|
||||||
|
|
||||||
|
result = dbi_conn_queryf(dbi->conn, "UPDATE acciones SET idordenador=%d, "
|
||||||
|
"idcentro=%d, parametros='%s', sesion=%d"
|
||||||
|
"WHERE idaccion=%d",
|
||||||
|
client_id, center_id, legacy_params,
|
||||||
|
session, sequence);
|
||||||
|
if (!result) {
|
||||||
|
dbi_conn_error(dbi->conn, &msglog);
|
||||||
|
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
|
||||||
|
__func__, __LINE__, msglog);
|
||||||
|
goto err_dbi_result;
|
||||||
|
}
|
||||||
|
dbi_result_free(result);
|
||||||
|
|
||||||
len = snprintf(task_id, sizeof(sequence), "%d", sequence);
|
len = snprintf(task_id, sizeof(sequence), "%d", sequence);
|
||||||
if (len >= (int)sizeof(task_id)) {
|
if (len >= (int)sizeof(task_id)) {
|
||||||
syslog(LOG_ERR, "truncated snprintf (%s:%d)\n",
|
syslog(LOG_ERR, "truncated snprintf (%s:%d)\n",
|
||||||
|
@ -4826,9 +4846,10 @@ static int og_cmd_post_schedule_command(json_t *element,
|
||||||
goto err_dbi;
|
goto err_dbi;
|
||||||
}
|
}
|
||||||
params->task_id = task_id;
|
params->task_id = task_id;
|
||||||
og_task_schedule_create(params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
og_task_schedule_create(params);
|
||||||
|
|
||||||
free((char *)legacy_params);
|
free((char *)legacy_params);
|
||||||
og_dbi_close(dbi);
|
og_dbi_close(dbi);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue