summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/ogAdmServer.c33
-rw-r--r--sources/schedule.c259
2 files changed, 174 insertions, 118 deletions
diff --git a/sources/ogAdmServer.c b/sources/ogAdmServer.c
index 0855431..f8803aa 100644
--- a/sources/ogAdmServer.c
+++ b/sources/ogAdmServer.c
@@ -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, &params->time.months);
params->flags |= OG_REST_PARAM_TIME_MONTHS;
+ } else if (!strcmp(key, "weeks")) {
+ err = og_json_parse_uint(value, &params->time.weeks);
+ params->flags |= OG_REST_PARAM_TIME_WEEKS;
+ } else if (!strcmp(key, "week_days")) {
+ err = og_json_parse_uint(value, &params->time.week_days);
+ params->flags |= OG_REST_PARAM_TIME_WEEK_DAYS;
} else if (!strcmp(key, "days")) {
err = og_json_parse_uint(value, &params->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 |
diff --git a/sources/schedule.c b/sources/schedule.c
index 21db921..6299acc 100644
--- a/sources/schedule.c
+++ b/sources/schedule.c
@@ -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);
-
- 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->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);
- }
- }
- }
+ month = months[j] - 1;
+ year = years[i];
+
+ if (time->week_days)
+ og_schedule_create_weekdays(month, year,
+ hours, minutes,
+ time->week_days,
+ task_id,
+ schedule_id);
+
+ if (time->weeks)
+ og_schedule_create_weeks(month, year,
+ hours, minutes,
+ time->weeks,
+ task_id,
+ schedule_id);
+
+ if (time->days)
+ og_schedule_create_days(month, year,
+ hours, minutes,
+ days,
+ task_id,
+ schedule_id);
}
}