From f4da5fc20201328fd922dba4a2f0239998c06bab Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Wed, 2 May 2007 15:03:51 +0000 Subject: [PATCH] XML import half finished SVN revision: 1858 --- src/elogd.c | 262 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 246 insertions(+), 16 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index 18c8cb52..b7a28e96 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -12980,7 +12980,7 @@ int download_config() /*------------------------------------------------------------------*/ -void show_import_page(LOGBOOK * lbs) +void show_import_page_csv(LOGBOOK * lbs) { char str[256], str2[256]; @@ -13084,6 +13084,66 @@ void show_import_page(LOGBOOK * lbs) /*------------------------------------------------------------------*/ +void show_import_page_xml(LOGBOOK * lbs) +{ + /*---- header ----*/ + + show_html_header(lbs, FALSE, loc("ELOG XML import"), TRUE, FALSE, NULL, FALSE); + + rsprintf("
\n"); + + /*---- title ----*/ + + show_standard_title(lbs->name, "", 0); + + /*---- menu buttons ----*/ + + rsprintf("\n"); + + rsprintf("\n", loc("Cancel")); + rsprintf("\n", loc("Import")); + + rsprintf("\n\n"); + + /* table for two-column items */ + rsprintf(""); + rsprintf("\n"); + + /*---- entry form ----*/ + + rsprintf("\n", loc("Options")); + rsprintf("\n"); + + rsprintf("\n", loc("XML filename")); + rsprintf("\n"); + + rsprintf("
%s:"); + + if (isparam("head")) + rsprintf("\n"); + else + rsprintf("\n"); + rsprintf("
\n", loc("Derive attributes from CSV file")); + + rsprintf("\n"); + rsprintf("
\n", loc("Preview import")); + + rsprintf("
%s:"); + + if (isparam("xmlfile")) + rsprintf("%s:
\n", loc("Please re-enter filename")); + + rsprintf("
\n\n"); + show_bottom_text(lbs); + rsprintf("
\r\n"); + +} + +/*------------------------------------------------------------------*/ + void csv_import(LOGBOOK * lbs, char *csv, char *csvfile) { char *list, *line, *p, str[256], date[80], sep[80]; @@ -13310,6 +13370,164 @@ void csv_import(LOGBOOK * lbs, char *csv, char *csvfile) /*------------------------------------------------------------------*/ +void xml_import(LOGBOOK * lbs, char *xml, char *xmlfile) +{ + char str[256], date[80], error[256], *list, *p; + int i, j, index, n_attr, iline, n_imported, textcol; + PMXML_NODE root, entry; + + iline = n_imported = 0; + textcol = -1; + + n_attr = lbs->n_attr; + + root = mxml_parse_buffer(xml, error, sizeof(error)); + if (root == NULL) { + strencode2(str, error, sizeof(str)); + show_error(str); + return; + } + + root = mxml_find_node(root, "ELOG_LIST"); + if (root == NULL) { + sprintf(str, loc("XML file does not contain %s element"), "<ELOG_LIST>"); + show_error(str); + return; + } + + entry = mxml_subnode(root, 0); + + if (mxml_find_node(entry, "MID") == NULL) { + sprintf(str, loc("XML file does not contain %s element"), "<MID>"); + show_error(str); + return; + } + + if (mxml_find_node(entry, "DATE") == NULL) { + sprintf(str, loc("XML file does not contain %s element"), "<DATE>"); + show_error(str); + return; + } + + if (isparam("preview")) { + + /* title row */ + sprintf(str, loc("XML import preview of %s"), xmlfile); + show_standard_header(lbs, TRUE, str, "./", FALSE, NULL); + rsprintf("\n"); + rsprintf("\n", str, str); + + /* menu buttons */ + rsprintf("\n\n"); + rsprintf("
%s
\n"); + rsprintf("\n", loc("Cancel")); + rsprintf("\n", loc("XML Import")); + + rsprintf("
"); + } + + list = xmalloc(MAX_N_ATTR * NAME_LENGTH); + + /* derive attributes from XML file */ + if (isparam("head")) { + if (isparam("preview")) { + rsprintf("\n"); + for (i = 0; i < mxml_get_number_of_children(entry) ; i++) + rsprintf("\n", mxml_get_name(mxml_subnode(entry, i))); + + rsprintf("\n"); + n_attr = i; + } else { + for (i = j = 0; i < mxml_get_number_of_children(entry) ; i++) { + strlcpy(str, mxml_get_name(mxml_subnode(entry, i)), NAME_LENGTH); + if (stricmp(str, "ID") != 0 && stricmp(str, "Date") != 0 && stricmp(str, "Text") != 0) + strlcpy(attr_list[j++], mxml_get_name(mxml_subnode(entry, i)), NAME_LENGTH); + } + + if (!set_attributes(lbs, attr_list, j - 3)) + return; + lbs->n_attr = j - 3; + } + } + + for (index=0 ; index\n"); + for (i = 0; i < mxml_get_number_of_children(entry); i++) { + + strlcpy(str, mxml_get_name(mxml_subnode(entry, i)), NAME_LENGTH); + if (strieq(str, "TEXT")) + break; + + if (iline % 2 == 0) + rsputs("\n"); + } + + rsputs("\n"); + rsputs("\n"); + iline++; + + } else { + + for (i = 0; i < n_attr; i++) { + + for (j = 0; j < (int) attr_list[i]; j++) + str[j] = toupper(attr_list[i][j]); + + if (mxml_find_node(entry, str) == NULL) + *(list + (i*NAME_LENGTH)) = 0; + else + strlcpy(list + i*NAME_LENGTH, mxml_get_value(mxml_find_node(entry, str)), NAME_LENGTH); + } + + str[0] = 0; + if (mxml_find_node(entry, "TEXT")) + p = mxml_get_value(mxml_find_node(entry, "TEXT")); + else + p = str; + + /* submit entry */ + date[0] = 0; + if (el_submit(lbs, 0, FALSE, date, attr_list, (char (*)[NAME_LENGTH]) list, + n_attr, p, "", "", "plain", NULL, TRUE, NULL)) + n_imported++; + } + } + + xfree(list); + + if (isparam("preview")) { + rsprintf("
%s
"); + else + rsputs(""); + + strlcpy(str, mxml_get_value(mxml_subnode(entry, i)), NAME_LENGTH); + + if (!str[0]) + rsputs(" "); + else + rsputs(str); + + rsputs(""); + if (mxml_find_node(entry, "TEXT")) { + rsputs(mxml_get_value(mxml_find_node(entry, "TEXT"))); + } + rsputs("
\n"); + show_bottom_text(lbs); + rsprintf("\r\n"); + + return; + } + + sprintf(str, loc("%d entries successfully imported"), n_imported); + show_elog_list(lbs, 0, 0, 0, TRUE, str); +} + +/*------------------------------------------------------------------*/ + int show_md5_page(LOGBOOK * lbs) { int i, j; @@ -16332,7 +16550,7 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) strlcat(menu_str, "Config, ", sizeof(menu_str)); } - strcpy(other_str, "Preview, Back, Search, Download, CSV Import, "); + strcpy(other_str, "Preview, Back, Search, Download, Import, CSV Import, XML Import, "); strlcat(other_str, "Cancel, First, Last, Previous, Next, Requested, Forgot, ", sizeof(other_str)); /* only allow Submit & Co if "New" is allowed */ @@ -16350,10 +16568,6 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) strcat(other_str, "Remove user, New user, "); } - /* allow import if CSV import is present */ - if (stristr(menu_str, loc("CSV Import"))) - strcat(other_str, "Import, "); - /* allow change password if "config" possible */ if (strieq(command, loc("Change password")) && stristr(menu_str, "Config")) { return TRUE; @@ -18170,7 +18384,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa /* default menu commands */ if (menu_str[0] == 0) { - strlcpy(menu_str, "New, Find, Select, CSV Import, ", sizeof(menu_str)); + strlcpy(menu_str, "New, Find, Select, Import, ", sizeof(menu_str)); if (getcfg(lbs->name, "Password file", str, sizeof(str))) strlcat(menu_str, "Config, Logout, ", sizeof(menu_str)); @@ -24048,8 +24262,18 @@ void interprete(char *lbook, char *path) return; } - if (strieq(command, loc("CSV Import"))) { - show_import_page(lbs); + if (strieq(command, loc("Import"))) { + show_query(lbs, loc("ELOG import"), loc("Plese choose format to import:"), "CSV", "?cmd=CSV+Import", "XML", "?cmd=XML+Import"); + return; + } + + if (strieq(command, "CSV Import")) { + show_import_page_csv(lbs); + return; + } + + if (strieq(command, "XML Import")) { + show_import_page_xml(lbs); return; } @@ -24178,8 +24402,8 @@ void decode_post(char *logbook, LOGBOOK * lbs, char *string, char *boundary, int n_att = atoi(item + 10) + 1; } - if (strncmp(item, "csvfile", 7) == 0) { - /* evaluate CSV import file */ + if (strncmp(item, "csvfile", 7) == 0 || strncmp(item, "xmlfile", 7) == 0) { + /* evaluate CSV/XML import file */ if (strstr(string, "filename=")) { p = strstr(string, "filename=") + 9; if (*p == '\"') @@ -24194,7 +24418,7 @@ void decode_post(char *logbook, LOGBOOK * lbs, char *string, char *boundary, int strlcpy(file_name, p, sizeof(file_name)); if (file_name[0]) { if (verbose) - eprintf("decode_post: Found CSV import file\n"); + eprintf("decode_post: Found CSV/XML import file\n"); } /* find next boundary */ @@ -24217,11 +24441,17 @@ void decode_post(char *logbook, LOGBOOK * lbs, char *string, char *boundary, int ptmp += strlen(ptmp); } while (TRUE); - /* import CSVfile */ + /* import CSV/XML file */ if (file_name[0]) { - setparam("csvfile", file_name); - csv_import(lbs, string, file_name); - return; + if (strncmp(item, "csvfile", 7) == 0) { + setparam("csvfile", file_name); + csv_import(lbs, string, file_name); + return; + } else if (strncmp(item, "xmlfile", 7) == 0) { + setparam("xmlfile", file_name); + xml_import(lbs, string, file_name); + return; + } } string = strstr(p, boundary) + strlen(boundary);