X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=9e52d59f4492b128d9061973c747fbdf12e6fb6f;hb=7db45d2bc967511916800d163b2c3e290c62da40;hp=a42cedce0e9ab6a0b603d4cdb14675b69b96180b;hpb=946243040b4b9c47fca3d3896a9ba256b3b17fea;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index a42cedc..9e52d59 100644 --- a/src/session.c +++ b/src/session.c @@ -297,7 +297,8 @@ static void insert_settings_parameters(struct session_database *sdb, // Add static values from session database settings if applicable static void insert_settings_values(struct session_database *sdb, xmlDoc *doc, - struct conf_service *service) + xmlNode *root, + struct conf_service *service) { int i; @@ -312,8 +313,7 @@ static void insert_settings_values(struct session_database *sdb, xmlDoc *doc, const char *val = session_setting_oneval(sdb, offset); if (val) { - xmlNode *r = xmlDocGetRootElement(doc); - xmlNode *n = xmlNewTextChild(r, 0, (xmlChar *) "metadata", + xmlNode *n = xmlNewTextChild(root, 0, (xmlChar *) "metadata", (xmlChar *) val); xmlSetProp(n, (xmlChar *) "type", (xmlChar *) md->name); } @@ -338,17 +338,6 @@ static xmlDoc *normalize_record(struct session *se, { session_log(se, YLOG_WARN, "Normalize failed"); } - else - { - insert_settings_values(sdb, rdoc, service); - - if (global_parameters.dump_records) - { - session_log(se, YLOG_LOG, "Normalized record from %s", - sdb->database->id); - log_xml_doc(rdoc); - } - } } return rdoc; } @@ -951,7 +940,7 @@ void session_apply_setting(struct session *se, char *dbname, char *setting, void session_destroy(struct session *se) { struct session_database *sdb; - session_log(se, YLOG_DEBUG, "Destroying"); + session_log(se, YLOG_LOG, "destroy"); session_use(-1); session_remove_cached_clients(se); @@ -1021,6 +1010,8 @@ struct session *new_session(NMEM nmem, struct conf_service *service, session->normalize_cache = normalize_cache_create(); session->session_mutex = 0; pazpar2_mutex_create(&session->session_mutex, tmp_str); + session_log(session, YLOG_LOG, "create"); + session_use(1); return session; } @@ -1548,12 +1539,12 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name, return no_found; } -static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no, +static const char *get_mergekey(xmlDoc *doc, xmlNode *root, + struct client *cl, int record_no, struct conf_service *service, NMEM nmem, const char *session_mergekey) { char *mergekey_norm = 0; - xmlNode *root = xmlDocGetRootElement(doc); WRBUF norm_wr = wrbuf_alloc(); xmlChar *mergekey; @@ -1676,38 +1667,31 @@ static int ingest_to_cluster(struct client *cl, xmlDoc *xdoc, xmlNode *root, int record_no, - const char *mergekey_norm); + struct record_metadata_attr *mergekey); static int ingest_sub_record(struct client *cl, xmlDoc *xdoc, xmlNode *root, int record_no, NMEM nmem, - struct session_database *sdb) + struct session_database *sdb, + struct record_metadata_attr *mergekeys) { int ret = 0; - const char *mergekey_norm; struct session *se = client_get_session(cl); struct conf_service *service = se->service; - if (!check_record_filter(root, sdb)) - { - session_log(se, YLOG_LOG, "Filtered out record no %d from %s", record_no, sdb->database->id); - xmlFreeDoc(xdoc); - return -2; - } + insert_settings_values(sdb, xdoc, root, service); - mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem, - se->mergekey); - if (!mergekey_norm) + if (!check_record_filter(root, sdb)) { - session_log(se, YLOG_WARN, "Got no mergekey"); - xmlFreeDoc(xdoc); - return -1; + session_log(se, YLOG_LOG, + "Filtered out record no %d from %s", + record_no, sdb->database->id); + return 0; } session_enter(se, "ingest_sub_record"); if (client_get_session(cl) == se && se->relevance) - ret = ingest_to_cluster(cl, xdoc, root, record_no, mergekey_norm); + ret = ingest_to_cluster(cl, xdoc, root, record_no, mergekeys); session_leave(se, "ingest_sub_record"); - xmlFreeDoc(xdoc); return ret; } @@ -1727,28 +1711,67 @@ int ingest_record(struct client *cl, const char *rec, struct session_database *sdb = client_get_database(cl); struct conf_service *service = se->service; xmlDoc *xdoc = normalize_record(se, sdb, service, rec, nmem); + int r = 0; xmlNode *root; if (!xdoc) return -1; + if (global_parameters.dump_records) + { + session_log(se, YLOG_LOG, "Normalized record from %s", + sdb->database->id); + log_xml_doc(xdoc); + } + root = xmlDocGetRootElement(xdoc); if (!strcmp((const char *) root->name, "cluster")) { - root = root->children; - return ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb); + xmlNode *sroot; + for (sroot = root->children; sroot; sroot = sroot->next) + if (sroot->type == XML_ELEMENT_NODE) + { + const char *mergekey_norm = + get_mergekey(xdoc, sroot, cl, record_no, service, nmem, + se->mergekey); + + struct record_metadata_attr *mk = (struct record_metadata_attr*) + nmem_malloc(nmem, sizeof(*mk)); + mk->name = 0; + mk->value = nmem_strdup(nmem, mergekey_norm); + mk->next = 0; + + r = ingest_sub_record(cl, xdoc, sroot, record_no, nmem, sdb, + mk); + if (r) + break; + } } else if (!strcmp((const char *) root->name, "record")) { - return ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb); + const char *mergekey_norm = + get_mergekey(xdoc, root, cl, record_no, service, nmem, + se->mergekey); + if (mergekey_norm) + { + struct record_metadata_attr *mk = (struct record_metadata_attr*) + nmem_malloc(nmem, sizeof(*mk)); + mk->name = 0; + mk->value = nmem_strdup(nmem, mergekey_norm); + mk->next = 0; + + r = ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb, mk); + } } else { session_log(se, YLOG_WARN, "Bad pz root element: %s", (const char *) root->name); - return -1; + r = -1; } + xmlFreeDoc(xdoc); + return r; } @@ -1913,7 +1936,7 @@ static int ingest_to_cluster(struct client *cl, xmlDoc *xdoc, xmlNode *root, int record_no, - const char *mergekey_norm) + struct record_metadata_attr *merge_keys) { xmlNode *n; xmlChar *type = 0; @@ -2016,7 +2039,7 @@ static int ingest_to_cluster(struct client *cl, return -2; } cluster = reclist_insert(se->reclist, service, record, - mergekey_norm, &se->total_merged); + merge_keys, &se->total_merged); if (!cluster) return 0; // complete match with existing record