mirror of https://git.48k.eu/ogserver
#942 Add weeks and week days to the schedule API
* add og_schedule_create_weekdays() * add og_schedule_create_weeks() * add og_schedule_create_days()master
parent
54c7ca3bb3
commit
130b6ffae8
|
@ -1554,10 +1554,12 @@ struct og_computer {
|
|||
#define OG_REST_PARAM_TASK (1UL << 31)
|
||||
#define OG_REST_PARAM_TIME_YEARS (1UL << 32)
|
||||
#define OG_REST_PARAM_TIME_MONTHS (1UL << 33)
|
||||
#define OG_REST_PARAM_TIME_DAYS (1UL << 34)
|
||||
#define OG_REST_PARAM_TIME_HOURS (1UL << 35)
|
||||
#define OG_REST_PARAM_TIME_AM_PM (1UL << 36)
|
||||
#define OG_REST_PARAM_TIME_MINUTES (1UL << 37)
|
||||
#define OG_REST_PARAM_TIME_WEEKS (1UL << 34)
|
||||
#define OG_REST_PARAM_TIME_WEEK_DAYS (1UL << 35)
|
||||
#define OG_REST_PARAM_TIME_DAYS (1UL << 36)
|
||||
#define OG_REST_PARAM_TIME_HOURS (1UL << 37)
|
||||
#define OG_REST_PARAM_TIME_AM_PM (1UL << 38)
|
||||
#define OG_REST_PARAM_TIME_MINUTES (1UL << 39)
|
||||
|
||||
enum og_rest_method {
|
||||
OG_METHOD_GET = 0,
|
||||
|
@ -1793,6 +1795,12 @@ static int og_json_parse_time_params(json_t *element,
|
|||
} else if (!strcmp(key, "months")) {
|
||||
err = og_json_parse_uint(value, ¶ms->time.months);
|
||||
params->flags |= OG_REST_PARAM_TIME_MONTHS;
|
||||
} else if (!strcmp(key, "weeks")) {
|
||||
err = og_json_parse_uint(value, ¶ms->time.weeks);
|
||||
params->flags |= OG_REST_PARAM_TIME_WEEKS;
|
||||
} else if (!strcmp(key, "week_days")) {
|
||||
err = og_json_parse_uint(value, ¶ms->time.week_days);
|
||||
params->flags |= OG_REST_PARAM_TIME_WEEK_DAYS;
|
||||
} else if (!strcmp(key, "days")) {
|
||||
err = og_json_parse_uint(value, ¶ms->time.days);
|
||||
params->flags |= OG_REST_PARAM_TIME_DAYS;
|
||||
|
@ -3742,12 +3750,15 @@ static int og_dbi_schedule_create(struct og_dbi *dbi,
|
|||
result = dbi_conn_queryf(dbi->conn,
|
||||
"INSERT INTO programaciones (tipoaccion,"
|
||||
" identificador, nombrebloque, annos, meses,"
|
||||
" diario, horas, ampm, minutos, suspendida) VALUES (%d,"
|
||||
" %s, '%s', %d, %d, %d, %d, %d, %d, %d)", type,
|
||||
params->task_id, params->name, params->time.years,
|
||||
params->time.months, params->time.days,
|
||||
params->time.hours, params->time.am_pm,
|
||||
params->time.minutes, suspended);
|
||||
" semanas, dias, diario, horas, ampm, minutos,"
|
||||
" suspendida) VALUES (%d, %s, '%s', %d, %d,"
|
||||
" %d, %d, %d, %d, %d, %d, %d)", type,
|
||||
params->task_id, params->name,
|
||||
params->time.years, params->time.months,
|
||||
params->time.weeks, params->time.week_days,
|
||||
params->time.days, params->time.hours,
|
||||
params->time.am_pm, params->time.minutes,
|
||||
suspended);
|
||||
if (!result) {
|
||||
dbi_conn_error(dbi->conn, &msglog);
|
||||
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
|
||||
|
@ -3946,6 +3957,8 @@ static int og_cmd_schedule_create(json_t *element, struct og_msg_params *params)
|
|||
OG_REST_PARAM_NAME |
|
||||
OG_REST_PARAM_TIME_YEARS |
|
||||
OG_REST_PARAM_TIME_MONTHS |
|
||||
OG_REST_PARAM_TIME_WEEKS |
|
||||
OG_REST_PARAM_TIME_WEEK_DAYS |
|
||||
OG_REST_PARAM_TIME_DAYS |
|
||||
OG_REST_PARAM_TIME_HOURS |
|
||||
OG_REST_PARAM_TIME_MINUTES |
|
||||
|
|
|
@ -128,13 +128,9 @@ static void get_last_week(struct tm *tm, int *days, int *j)
|
|||
days[(*j)++] = tm->tm_mday;
|
||||
|
||||
|
||||
syslog(LOG_ERR, "TM_WDAY: %d", tm->tm_wday);//XXX
|
||||
syslog(LOG_ERR, "TM_MDAY: %d", tm->tm_mday);//XXX
|
||||
/* Last day of this week? */
|
||||
if (tm->tm_wday == 1) {
|
||||
syslog(LOG_ERR, "break week");//XXX
|
||||
if (tm->tm_wday == 1)
|
||||
break;
|
||||
}
|
||||
|
||||
tm->tm_mday--;
|
||||
}
|
||||
|
@ -199,17 +195,140 @@ static void og_schedule_remove_duplicates()
|
|||
}
|
||||
}
|
||||
|
||||
static void og_schedule_create_weekdays(int month, int year,
|
||||
int *hours, int minutes, int week_days,
|
||||
uint32_t task_id, uint32_t schedule_id)
|
||||
{
|
||||
struct og_schedule *schedule;
|
||||
int month_days[5];
|
||||
int n_month_days;
|
||||
uint32_t wday;
|
||||
struct tm tm;
|
||||
int k, l;
|
||||
|
||||
for (wday = 0; wday < 7; wday++) {
|
||||
if (!((1 << wday) & week_days))
|
||||
continue;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_mon = month;
|
||||
tm.tm_year = year;
|
||||
|
||||
n_month_days = 0;
|
||||
memset(month_days, 0, sizeof(month_days));
|
||||
get_days_from_weekday(&tm, wday, month_days, &n_month_days);
|
||||
|
||||
for (k = 0; month_days[k] != 0 && k < n_month_days; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = year;
|
||||
tm.tm_mon = month;
|
||||
tm.tm_mday = month_days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void og_schedule_create_weeks(int month, int year,
|
||||
int *hours, int minutes, int weeks,
|
||||
uint32_t task_id, uint32_t schedule_id)
|
||||
{
|
||||
struct og_schedule *schedule;
|
||||
int month_days[7];
|
||||
int n_month_days;
|
||||
struct tm tm;
|
||||
int week;
|
||||
int k, l;
|
||||
|
||||
for (week = 0; week < 5; week++) {
|
||||
if (!((1 << week) & weeks))
|
||||
continue;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_mon = month;
|
||||
tm.tm_year = year;
|
||||
|
||||
n_month_days = 0;
|
||||
memset(month_days, 0, sizeof(month_days));
|
||||
if (week == 5)
|
||||
get_last_week(&tm, month_days, &n_month_days);
|
||||
else
|
||||
get_days_from_week(&tm, week, month_days, &n_month_days);
|
||||
|
||||
for (k = 0; month_days[k] != 0 && k < n_month_days; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = year;
|
||||
tm.tm_mon = month;
|
||||
tm.tm_mday = month_days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void og_schedule_create_days(int month, int year,
|
||||
int *hours, int minutes, int *days,
|
||||
uint32_t task_id, uint32_t schedule_id)
|
||||
{
|
||||
struct og_schedule *schedule;
|
||||
struct tm tm;
|
||||
int k, l;
|
||||
|
||||
for (k = 0; days[k] != 0 && k < 31; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = year;
|
||||
tm.tm_mon = month;
|
||||
tm.tm_mday = days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void og_schedule_create(unsigned int schedule_id, unsigned int task_id,
|
||||
struct og_schedule_time *time)
|
||||
{
|
||||
struct og_schedule *schedule;
|
||||
int year, month, minutes;
|
||||
int months[12] = {};
|
||||
int years[12] = {};
|
||||
int hours[12] = {};
|
||||
int days[31] = {};
|
||||
struct tm tm = {};
|
||||
int i, j, k, l = 0;
|
||||
int minutes;
|
||||
int i, j;
|
||||
|
||||
og_parse_years(time->years, years);
|
||||
og_parse_months(time->months, months);
|
||||
|
@ -219,105 +338,29 @@ void og_schedule_create(unsigned int schedule_id, unsigned int task_id,
|
|||
|
||||
for (i = 0; years[i] != 0 && i < 12; i++) {
|
||||
for (j = 0; months[j] != 0 && j < 12; j++) {
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = years[i];
|
||||
tm.tm_mon = months[j] - 1;
|
||||
if (time->week_days) {
|
||||
for (int wday = 0; wday < 7; wday++) {
|
||||
if ((1 << wday) & time->week_days) {
|
||||
int specific_month_days[5] = {};
|
||||
int n_month_days = 0;
|
||||
get_days_from_weekday(&tm,
|
||||
wday,
|
||||
specific_month_days,
|
||||
&n_month_days);
|
||||
month = months[j] - 1;
|
||||
year = years[i];
|
||||
|
||||
for (k = 0; specific_month_days[k] != 0 && k < n_month_days; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
if (time->week_days)
|
||||
og_schedule_create_weekdays(month, year,
|
||||
hours, minutes,
|
||||
time->week_days,
|
||||
task_id,
|
||||
schedule_id);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = years[i];
|
||||
tm.tm_mon = months[j] - 1;
|
||||
tm.tm_mday = specific_month_days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
if (time->weeks)
|
||||
og_schedule_create_weeks(month, year,
|
||||
hours, minutes,
|
||||
time->weeks,
|
||||
task_id,
|
||||
schedule_id);
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (time->weeks) {
|
||||
for (int week = 0; week < 5; week++) {
|
||||
if ((1 << week) & time->weeks) {
|
||||
int specific_month_days[7] = {};
|
||||
int n_month_days = 0;
|
||||
|
||||
if (week == 5)
|
||||
get_last_week(&tm,
|
||||
specific_month_days,
|
||||
&n_month_days);
|
||||
else
|
||||
get_days_from_week(&tm,
|
||||
week,
|
||||
specific_month_days,
|
||||
&n_month_days);
|
||||
|
||||
for (k = 0; specific_month_days[k] != 0 && k < n_month_days; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = years[i];
|
||||
tm.tm_mon = months[j] - 1;
|
||||
tm.tm_mday = specific_month_days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (time->days) {
|
||||
for (k = 0; days[k] != 0 && k < 31; k++) {
|
||||
for (l = 0; hours[l] != 0 && l < 31; l++) {
|
||||
schedule = (struct og_schedule *)
|
||||
calloc(1, sizeof(struct og_schedule));
|
||||
if (!schedule)
|
||||
return;
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
tm.tm_year = years[i];
|
||||
tm.tm_mon = months[j] - 1;
|
||||
tm.tm_mday = days[k];
|
||||
tm.tm_hour = hours[l] - 1;
|
||||
tm.tm_min = minutes;
|
||||
|
||||
schedule->seconds = mktime(&tm);
|
||||
schedule->task_id = task_id;
|
||||
schedule->schedule_id = schedule_id;
|
||||
og_schedule_add(schedule);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (time->days)
|
||||
og_schedule_create_days(month, year,
|
||||
hours, minutes,
|
||||
days,
|
||||
task_id,
|
||||
schedule_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue