diff --git a/src/elogd.c b/src/elogd.c index 1809e3cf..4416729a 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -439,6 +439,7 @@ void strencode2(char *b, const char *text, int size); void load_config_section(char *section, char **buffer, char *error); void remove_crlf(char *buffer); time_t convert_date(char *date_string); +time_t convert_datetime(char *date_string); int get_thumb_name(const char *file_name, char *thumb_name, int size, int index); int create_thumbnail(LOGBOOK * lbs, char *file_name); @@ -13743,7 +13744,7 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) const char *p; char *line, *list; char str[256], date[80], sep[80]; - int i, j, n, n_attr, iline, n_imported, textcol; + int i, j, n, n_attr, iline, n_imported, textcol, attr_offset; BOOL first, in_quotes, filltext; time_t ltime; @@ -13755,6 +13756,7 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) iline = n_imported = 0; filltext = FALSE; textcol = -1; + attr_offset = 0; strcpy(sep, ","); if (isparam("sep")) @@ -13844,16 +13846,28 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) } /* interprete date entries correctly */ - for (i = 0; i < n; i++) - if (attr_flags[i] & AF_DATE) { - /* convert to seconds in Unix format */ - ltime = convert_date(list + i * NAME_LENGTH); - if (ltime == 0) { - show_error(loc("Invalid date format")); - return; + if (!(first && isparam("head"))) { + for (i = attr_offset; i < n; i++) { + if (attr_flags[i-attr_offset] & AF_DATE) { + /* convert to seconds in Unix format */ + ltime = convert_date(list + i * NAME_LENGTH); + if (ltime == 0) { + show_error(loc("Invalid date format")); + return; + } + sprintf(list + i * NAME_LENGTH, "%d", (int) ltime); + } + if (attr_flags[i-attr_offset] & AF_DATETIME) { + /* convert to seconds in Unix format */ + ltime = convert_datetime(list + i * NAME_LENGTH); + if (ltime == 0) { + show_error(loc("Invalid date format")); + return; + } + sprintf(list + i * NAME_LENGTH, "%d", (int) ltime); } - sprintf(list + i * NAME_LENGTH, "%d", (int) ltime); } + } /* check if text column is present */ if (first && isparam("filltext") && atoi(getparam("filltext"))) { @@ -13867,9 +13881,16 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) /* derive attributes from first line */ if (first && isparam("head")) { + + /* skip message ID and date attributes */ + for (i = attr_offset = 0; i < n; i++) + if (strieq(list + i * NAME_LENGTH, "Message ID") || + strieq(list + i * NAME_LENGTH, "Date")) + attr_offset++; + if (isparam("preview")) { rsprintf("\n"); - for (i = 0; i < n; i++) + for (i = attr_offset; i < n; i++) if (i != textcol) rsprintf("%s\n", list + i * NAME_LENGTH); @@ -13879,23 +13900,23 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) rsprintf("\n"); if (filltext) - n_attr = n - 1; + n_attr = n - 1 - attr_offset; else - n_attr = n; + n_attr = n - attr_offset; } else { - for (i = j = 0; i < n; i++) - if (i != textcol) - strlcpy(attr_list[j++], list + i * NAME_LENGTH, NAME_LENGTH); + for (i = j = attr_offset; i < n; i++) + if (i != textcol) + strlcpy(attr_list[j++ - attr_offset], list + i * NAME_LENGTH, NAME_LENGTH); if (filltext) { - if (!set_attributes(lbs, attr_list, n - 1)) + if (!set_attributes(lbs, attr_list, n - 1 - attr_offset)) return; - lbs->n_attr = n - 1; + lbs->n_attr = n - 1 - attr_offset; } else { - if (!set_attributes(lbs, attr_list, n)) + if (!set_attributes(lbs, attr_list, n - attr_offset)) return; - lbs->n_attr = n; + lbs->n_attr = n - attr_offset; } } @@ -13903,7 +13924,7 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) if (isparam("preview")) { rsprintf("\n"); - for (i = j = 0; i < n_attr; i++) { + for (i = j = attr_offset; i < n_attr; i++) { if (iline % 2 == 0) rsputs(""); else @@ -13939,19 +13960,21 @@ void csv_import(LOGBOOK * lbs, const char *csv, const char *csvfile) if (!filltext) { /* submit entry */ date[0] = 0; - if (el_submit(lbs, 0, FALSE, date, attr_list, (char (*)[NAME_LENGTH]) list, + if (el_submit(lbs, 0, FALSE, date, attr_list, + (char (*)[NAME_LENGTH]) (list + attr_offset * NAME_LENGTH), n_attr, "", "", "", "plain", NULL, TRUE, NULL)) n_imported++; } else { strlcpy(line, list + textcol * NAME_LENGTH, 10000); insert_breaks(line, 78, 10000); - for (i = textcol; i < n_attr; i++) + for (i = textcol; i < n_attr + attr_offset; i++) strlcpy(list + i * NAME_LENGTH, list + (i + 1) * NAME_LENGTH, NAME_LENGTH); /* submit entry */ date[0] = 0; - if (el_submit(lbs, 0, FALSE, date, attr_list, (char (*)[NAME_LENGTH]) list, + if (el_submit(lbs, 0, FALSE, date, attr_list, + (char (*)[NAME_LENGTH]) (list + attr_offset * NAME_LENGTH), n_attr, line, "", "", "plain", NULL, TRUE, NULL)) n_imported++; } @@ -14171,6 +14194,8 @@ void xml_import(LOGBOOK * lbs, const char *xml, const char *xmlfile) for (i = 0; i < n_attr; i++) { strlcpy(str, attr_list[i], sizeof(str)); + while (strchr(str, ' ')) + *strchr(str, ' ') = '_'; if (mxml_find_node(entry, str) == NULL) *(list + (i * NAME_LENGTH)) = 0; else @@ -14178,7 +14203,7 @@ void xml_import(LOGBOOK * lbs, const char *xml, const char *xmlfile) } /* interprete date entries correctly */ - for (i = 0; i < n_attr; i++) + for (i = 0; i < n_attr; i++) { if (attr_flags[i] & AF_DATE) { /* convert to seconds in Unix format */ ltime = convert_date(list + i * NAME_LENGTH); @@ -14188,6 +14213,16 @@ void xml_import(LOGBOOK * lbs, const char *xml, const char *xmlfile) } sprintf(list + i * NAME_LENGTH, "%d", (int) ltime); } + if (attr_flags[i] & AF_DATETIME) { + /* convert to seconds in Unix format */ + ltime = convert_datetime(list + i * NAME_LENGTH); + if (ltime == 0) { + show_error(loc("Invalid date format")); + return; + } + sprintf(list + i * NAME_LENGTH, "%d", (int) ltime); + } + } encoding[0] = 0; if (mxml_find_node(entry, "ENCODING")) @@ -18141,6 +18176,87 @@ time_t convert_date(char *date_string) /*------------------------------------------------------------------*/ +time_t convert_datetime(char *date_string) +{ + /* convert date string in MM/DD/YY h:m:s AM/PM or DD.MM.YY hh:m:s format into Unix time */ + int year, month, day, hour, min, sec; + char *p, str[256]; + struct tm tms; + time_t ltime; + + strlcpy(str, date_string, sizeof(str)); + month = day = year = 0; + + if (strchr(str, '/')) { + /* MM/DD/YY format */ + p = strtok(str, "/"); + if (p) { + month = atoi(p); + p = strtok(NULL, "/"); + if (p) { + day = atoi(p); + p = strtok(NULL, "/"); + if (p) + year = atoi(p); + } + } + } else if (strchr(str, '.')) { + /* DD.MM.YY format */ + p = strtok(str, "."); + if (p) { + day = atoi(p); + p = strtok(NULL, "."); + if (p) { + month = atoi(p); + p = strtok(NULL, "."); + if (p) + year = atoi(p); + } + } + } else + return 0; + + strlcpy(str, p, sizeof(str)); + p = strtok(p, ":"); + if (p) { + hour = atoi(p); + p = strtok(NULL, ":"); + if (p) { + min = atoi(p); + p = strtok(NULL, ":"); + if (p) + sec = atoi(p); + } + } else + return 0; + + if (stristr(p, "PM") && hour < 12) + hour += 12; + + /* calculate years */ + if (year > 1900) /* 1900-2100 */ + year += 0; + else if (year < 70) /* 00-69 */ + year += 2000; + else if (year < 100) /* 70-99 */ + year += 1900; + + /* use last day of month */ + memset(&tms, 0, sizeof(struct tm)); + tms.tm_year = year - 1900; + tms.tm_mon = month - 1; + tms.tm_mday = day; + tms.tm_hour = hour; + tms.tm_min = min; + tms.tm_sec = sec; + + ltime = mktime(&tms); + + return ltime; +} + +/*------------------------------------------------------------------*/ + void show_rss_feed(LOGBOOK * lbs) { int i, n, size, index, status, message_id, offset;