void yaz_marc_reset(yaz_marc_t mt) { nmem_reset(mt->nmem); mt->nodes = 0; mt->nodes_pp = &mt->nodes; mt->subfield_pp = 0; }
/** \brief reset rules+configuration */ static void yaz_record_conv_reset(yaz_record_conv_t p) { struct yaz_record_conv_rule *r; for (r = p->rules; r; r = r->next) { r->type->destroy(r->info); } wrbuf_rewind(p->wr_error); nmem_reset(p->nmem); p->rules = 0; p->rules_p = &p->rules; }
static void http_io(IOCHAN i, int event) { struct http_channel *hc = iochan_getdata(i); while (event) { if (event == EVENT_INPUT) { int res, reqlen; struct http_buf *htbuf; htbuf = http_buf_create(hc->http_server); res = recv(iochan_getfd(i), htbuf->buf, HTTP_BUF_SIZE -1, 0); if (res == -1 && errno == EAGAIN) { http_buf_destroy(hc->http_server, htbuf); return; } if (res <= 0) { #if HAVE_SYS_TIME_H if (hc->http_server->record_file) { struct timeval tv; gettimeofday(&tv, 0); fprintf(hc->http_server->record_file, "%lld %lld %lld 0\n", (long long) tv.tv_sec, (long long) tv.tv_usec, (long long) iochan_getfd(i)); } #endif http_buf_destroy(hc->http_server, htbuf); fflush(hc->http_server->record_file); http_channel_destroy(i); return; } htbuf->buf[res] = '\0'; htbuf->len = res; http_buf_enqueue(&hc->iqueue, htbuf); while (1) { if (hc->state == Http_Busy) return; reqlen = request_check(hc->iqueue); if (reqlen <= 2) return; // we have a complete HTTP request nmem_reset(hc->nmem); #if HAVE_SYS_TIME_H if (hc->http_server->record_file) { struct timeval tv; int sz = 0; struct http_buf *hb; for (hb = hc->iqueue; hb; hb = hb->next) sz += hb->len; gettimeofday(&tv, 0); fprintf(hc->http_server->record_file, "%lld %lld %lld %d\n", (long long) tv.tv_sec, (long long) tv.tv_usec, (long long) iochan_getfd(i), sz); for (hb = hc->iqueue; hb; hb = hb->next) fwrite(hb->buf, 1, hb->len, hc->http_server->record_file); } #endif if (!(hc->request = http_parse_request(hc, &hc->iqueue, reqlen))) { yaz_log(YLOG_WARN, "Failed to parse request"); http_error(hc, 400, "Bad Request"); return; } hc->response = 0; yaz_log(YLOG_LOG, "Request: %s %s%s%s", hc->request->method, hc->request->path, *hc->request->search ? "?" : "", hc->request->search); if (hc->request->content_buf) yaz_log(YLOG_LOG, "%s", hc->request->content_buf); if (http_weshouldproxy(hc->request)) http_proxy(hc->request); else { // Execute our business logic! hc->state = Http_Busy; http_command(hc); } } } else if (event == EVENT_OUTPUT) { event = 0; if (hc->oqueue) { struct http_buf *wb = hc->oqueue; int res; res = send(iochan_getfd(hc->iochan), wb->buf + wb->offset, wb->len, 0); if (res <= 0) { yaz_log(YLOG_WARN|YLOG_ERRNO, "write"); http_channel_destroy(i); return; } if (res == wb->len) { hc->oqueue = hc->oqueue->next; http_buf_destroy(hc->http_server, wb); } else { wb->len -= res; wb->offset += res; } if (!hc->oqueue) { if (!hc->keep_alive) { http_channel_destroy(i); return; } else { iochan_clearflag(i, EVENT_OUTPUT); if (hc->iqueue) event = EVENT_INPUT; } } } if (!hc->oqueue && hc->proxy && !hc->proxy->iochan) http_channel_destroy(i); // Server closed; we're done } else { yaz_log(YLOG_WARN, "Unexpected event on connection"); http_channel_destroy(i); event = 0; } } }
struct icu_chain *icu_chain_xml_config(const xmlNode *xml_node, int sort, UErrorCode *status) { xmlNode *node = 0; int no_errors = 0; struct icu_chain *chain = 0; NMEM nmem = 0; *status = U_ZERO_ERROR; if (xml_node && xml_node->type == XML_ELEMENT_NODE) { const char *xml_locale = yaz_xml_get_prop((xmlNode *) xml_node, "locale"); if (xml_locale) chain = icu_chain_create((const char *) xml_locale, sort, status); } if (!chain) return 0; nmem = nmem_create(); for (node = xml_node->children; node; node = node->next) { char *rule = 0; struct icu_chain_step *step = 0; const char *attr_str; nmem_reset(nmem); if (node->type != XML_ELEMENT_NODE) continue; attr_str = yaz_xml_get_prop(node, "rule%s", &rule); if (attr_str) { yaz_log(YLOG_WARN, "Unsupported attribute '%s' for " "element '%s'", attr_str, node->name); no_errors++; } if (!rule && node->children) rule = nmem_text_node_cdata(node->children, nmem); if (!rule && strcmp((const char *) node->name, "display")) { yaz_log(YLOG_WARN, "Missing attribute 'rule' for element %s", (const char *) node->name); no_errors++; continue; } if (!strcmp((const char *) node->name, "casemap")) step = icu_chain_insert_step(chain, ICU_chain_step_type_casemap, rule, status); else if (!strcmp((const char *) node->name, "transform")) step = icu_chain_insert_step(chain, ICU_chain_step_type_transform, rule, status); else if (!strcmp((const char *) node->name, "transliterate")) step = icu_chain_insert_step(chain, ICU_chain_step_type_transliterate, rule, status); else if (!strcmp((const char *) node->name, "tokenize")) step = icu_chain_insert_step(chain, ICU_chain_step_type_tokenize, rule, status); else if (!strcmp((const char *) node->name, "display")) step = icu_chain_insert_step(chain, ICU_chain_step_type_display, rule, status); else if (!strcmp((const char *) node->name, "stemming")) step = icu_chain_insert_step(chain, YAZ_chain_step_type_stemming, rule, status); else if (!strcmp((const char *) node->name, "join")) step = icu_chain_insert_step(chain, ICU_chain_step_type_join, rule, status); else if (!strcmp((const char *) node->name, "normalize")) { yaz_log(YLOG_WARN, "Element %s is deprecated. " "Use transform instead", node->name); step = icu_chain_insert_step(chain, ICU_chain_step_type_transform, rule, status); } else if (!strcmp((const char *) node->name, "index") || !strcmp((const char *) node->name, "sortkey")) { yaz_log(YLOG_WARN, "Element %s is no longer needed. " "Remove it from the configuration", node->name); } else { yaz_log(YLOG_WARN, "Unknown element %s", node->name); no_errors++; continue; } if (!step) { yaz_log(YLOG_WARN, "Step not created for %s", node->name); no_errors++; } if (step && U_FAILURE(*status)) { yaz_log(YLOG_WARN, "ICU Error %d %s for element %s, rule %s", *status, u_errorName(*status), node->name, rule ? rule : ""); no_errors++; break; } } nmem_destroy(nmem); if (no_errors) { icu_chain_destroy(chain); return 0; } return chain; }