DEBIAN_DIST="jessie wheezy squeeze"
UBUNTU_DIST="trusty precise"
CENTOS_DIST="centos5 centos6"
-VERSION=1.7.2
+VERSION=1.7.4
+--- 1.7.4 2014/09/02
+
+Log ingest failures and record failures:
+
+Clean up logging PAZ-942
+Use session lead in more places. Log hits/records/filtered for each
+target when fetching is complete. Log hit count when a search
+(response) is received. Remove some less useful log messages.
+
+Fix warning about about missing (internal) stylesheet PAZ-956
+
+Report number of filtered records in bytarget PAZ-954
+
+Cache XML documents as they appear after normalization. The key
+for the cache is database+record offset. Cache is removed if query
+is modified for search. This speeds up re-establishing a result set
+for databases where new query is same previous query.
+
+--- 1.7.3 2014/08/22
+
+poll: add assert for number of FDs; abort on poll failure
+
--- 1.7.2 2014/08/18
Fix hang for 2nd use of target with unresolved DNS PAZ-949
<!-- Simple test against a local test server (could be yaz-ztest) -->
<set name="pz:name" value="Local Test"/>
- <set name="pz:apdulog" value="1"/>
+ <set name="pz:apdulog" value="0"/>
<!-- mapping for unqualified search -->
<set name="pz:cclmap:term" value="u=1016 t=l,r s=al"/>
</xsl:template>
<xsl:template match="prim:display">
+
+<!--
<xsl:for-each select="prim:creator">
<pz:metadata type="author">
<xsl:value-of select="." />
</pz:metadata>
- </xsl:for-each>
+ </xsl:for-each>
+-->
<xsl:for-each select="prim:type">
<xsl:variable name="type" select="."/>
<pz:metadata type="medium">
</xsl:template>
<xsl:template match="prim:search">
+
+ <xsl:for-each select="prim:creatorcontrib">
+ <pz:metadata type="author">
+ <xsl:value-of select="." />
+ </pz:metadata>
+ </xsl:for-each>
+
<xsl:for-each select="prim:description">
<pz:metadata type="description">
<xsl:value-of select="." />
#include "relevance.h"
#include "incref.h"
+#define XDOC_CACHE_SIZE 100
+
static YAZ_MUTEX g_mutex = 0;
static int no_clients = 0;
Odr_int hits;
int record_offset;
int show_stat_no;
- int filtered; // When using local:, this will count the number of filtered records.
+ int filtered; /* number of records ignored for local filtering */
+ int ingest_failures; /* number of records where XSLT/other failed */
+ int record_failures; /* number of records where ZOOM reported error */
int maxrecs;
int startrecs;
int diagnostic;
int same_search;
char *sort_strategy;
char *sort_criteria;
+ xmlDoc **xdoc;
};
struct suggestions {
}
}
+static void client_init_xdoc(struct client *cl)
+{
+ int i;
+
+ cl->xdoc = xmalloc(sizeof(*cl->xdoc) * XDOC_CACHE_SIZE);
+ for (i = 0; i < XDOC_CACHE_SIZE; i++)
+ cl->xdoc[i] = 0;
+}
+
+static void client_destroy_xdoc(struct client *cl)
+{
+ int i;
+
+ assert(cl->xdoc);
+ for (i = 0; i < XDOC_CACHE_SIZE; i++)
+ if (cl->xdoc[i])
+ xmlFreeDoc(cl->xdoc[i]);
+ xfree(cl->xdoc);
+}
+
+xmlDoc *client_get_xdoc(struct client *cl, int record_no)
+{
+ assert(cl->xdoc);
+ if (record_no >= 0 && record_no < XDOC_CACHE_SIZE)
+ return cl->xdoc[record_no];
+ return 0;
+}
+
+void client_store_xdoc(struct client *cl, int record_no, xmlDoc *xdoc)
+{
+ assert(cl->xdoc);
+ if (record_no >= 0 && record_no < XDOC_CACHE_SIZE)
+ {
+ if (cl->xdoc[record_no])
+ xmlFreeDoc(cl->xdoc[record_no]);
+ cl->xdoc[record_no] = xdoc;
+ }
+ else
+ {
+ xmlFreeDoc(xdoc);
+ }
+}
+
+
static void client_show_raw_error(struct client *cl, const char *addinfo);
struct connection *client_get_connection(struct client *cl)
struct connection *co = cl->connection;
ZOOM_connection link = connection_get_link(co);
ZOOM_resultset resultset = cl->resultset;
+ struct session *se = client_get_session(cl);
const char *error, *addinfo = 0;
if (ZOOM_connection_error(link, &error, &addinfo))
{
cl->hits = 0;
+ session_log(se, YLOG_WARN, "%s: Error %s (%s)",
+ client_get_id(cl), error, addinfo);
client_set_state(cl, Client_Error);
- yaz_log(YLOG_WARN, "Search error %s (%s): %s",
- error, addinfo, client_get_id(cl));
}
else
{
client_report_facets(cl, resultset);
cl->record_offset = cl->startrecs;
cl->hits = ZOOM_resultset_size(resultset);
- yaz_log(YLOG_DEBUG, "client_search_response: hits " ODR_INT_PRINTF,
- cl->hits);
+ session_log(se, YLOG_LOG, "%s: hits: " ODR_INT_PRINTF,
+ client_get_id(cl), cl->hits);
if (cl->suggestions)
client_suggestions_destroy(cl);
cl->suggestions =
ZOOM_record rec = 0;
ZOOM_resultset resultset = cl->resultset;
struct session *se = client_get_session(cl);
+ xmlDoc *xdoc;
+ int offset = cl->record_offset + 1; /* 0 versus 1 numbered offsets */
- if ((rec = ZOOM_resultset_record_immediate(resultset, cl->record_offset)))
+ xdoc = client_get_xdoc(cl, offset);
+ if (xdoc)
+ {
+ if (cl->session)
+ {
+ NMEM nmem = nmem_create();
+ int rc = ingest_xml_record(cl, xdoc, offset, nmem, 1);
+ if (rc == -1)
+ {
+ session_log(se, YLOG_WARN,
+ "%s: #%d: failed to ingest xdoc",
+ client_get_id(cl), offset);
+ cl->ingest_failures++;
+ }
+ else if (rc == -2)
+ cl->filtered++;
+ nmem_destroy(nmem);
+ }
+ }
+ else if ((rec = ZOOM_resultset_record_immediate(resultset,
+ cl->record_offset)))
{
- int offset = ++cl->record_offset;
if (cl->session == 0)
; /* no operation */
else if (ZOOM_record_error(rec, &msg, &addinfo, 0))
{
session_log(se, YLOG_WARN, "Record error %s (%s): %s #%d",
msg, addinfo, client_get_id(cl), offset);
+ cl->record_failures++;
}
else
{
if (!xmlrec)
{
const char *rec_syn = ZOOM_record_get(rec, "syntax", NULL);
- session_log(se, YLOG_WARN, "ZOOM_record_get failed from %s #%d",
+ session_log(se, YLOG_WARN, "%s: #%d: ZOOM_record_get failed",
client_get_id(cl), offset);
session_log(se, YLOG_LOG, "pz:nativesyntax=%s . "
"ZOOM record type=%s . Actual record syntax=%s",
s ? s : "null", type,
rec_syn ? rec_syn : "null");
+ cl->ingest_failures++;
}
else
{
/* OK = 0, -1 = failure, -2 = Filtered */
- int rc = ingest_record(cl, xmlrec, cl->record_offset, nmem);
+ int rc = ingest_record(cl, xmlrec, offset, nmem);
if (rc == -1)
{
const char *rec_syn = ZOOM_record_get(rec, "syntax", NULL);
session_log(se, YLOG_WARN,
- "Failed to ingest record from %s #%d",
+ "%s: #%d: failed to ingest record",
client_get_id(cl), offset);
session_log(se, YLOG_LOG, "pz:nativesyntax=%s . "
"ZOOM record type=%s . Actual record syntax=%s",
s ? s : "null", type,
rec_syn ? rec_syn : "null");
+ cl->ingest_failures++;
}
- if (rc == -2)
- cl->filtered += 1;
+ else if (rc == -2)
+ cl->filtered++;
}
nmem_destroy(nmem);
}
else
{
session_log(se, YLOG_WARN, "Got NULL record from %s #%d",
- client_get_id(cl), cl->record_offset);
+ client_get_id(cl), offset);
}
+ cl->record_offset++;
}
void client_record_response(struct client *cl, int *got_records)
if (ZOOM_connection_error(link, &error, &addinfo))
{
+ struct session *se = client_get_session(cl);
+ session_log(se, YLOG_WARN, "%s: Error %s (%s)",
+ client_get_id(cl), error, addinfo);
client_set_state(cl, Client_Error);
- yaz_log(YLOG_WARN, "Search error %s (%s): %s",
- error, addinfo, client_get_id(cl));
}
else
{
{
int i = cl->startrecs;
int to = cl->record_offset;
- cl->filtered = 0;
+ cl->record_failures = cl->ingest_failures = cl->filtered = 0;
cl->record_offset = i;
for (; i < to; i++)
/* Nothing has changed and we already have a result */
if (cl->same_search == 1 && rc_prep_connection == 2)
{
- session_log(se, YLOG_LOG, "client %s resuse result", client_get_id(cl));
+ session_log(se, YLOG_LOG, "%s: reuse result", client_get_id(cl));
client_report_facets(cl, cl->resultset);
return client_reingest(cl);
}
else if (!rc_prep_connection)
{
- session_log(se, YLOG_LOG, "client %s postponing search: No connection",
+ session_log(se, YLOG_LOG, "%s: postponing search: No connection",
client_get_id(cl));
client_set_state_nb(cl, Client_Working);
return -1;
link = connection_get_link(co);
assert(link);
- session_log(se, YLOG_LOG, "client %s new search", client_get_id(cl));
+ session_log(se, YLOG_LOG, "%s: new search", client_get_id(cl));
cl->diagnostic = 0;
- cl->filtered = 0;
+ cl->record_failures = cl->ingest_failures = cl->filtered = 0;
+
+ client_destroy_xdoc(cl);
+ client_init_xdoc(cl);
if (extra_args && *extra_args)
ZOOM_connection_option_set(link, "extraArgs", extra_args);
query = ZOOM_query_create();
if (cl->cqlquery)
{
- yaz_log(YLOG_LOG, "Client %s: Search CQL: %s", client_get_id(cl),
- cl->cqlquery);
+ session_log(se, YLOG_LOG, "%s: Search CQL: %s", client_get_id(cl),
+ cl->cqlquery);
ZOOM_query_cql(query, cl->cqlquery);
if (*opt_sort)
ZOOM_query_sortby(query, opt_sort);
}
else
{
- yaz_log(YLOG_LOG, "Client %s: Search PQF: %s", client_get_id(cl),
- cl->pquery);
-
+ session_log(se, YLOG_LOG, "%s: Search PQF: %s", client_get_id(cl),
+ cl->pquery);
ZOOM_query_prefix(query, cl->pquery);
}
if (cl->sort_strategy && cl->sort_criteria) {
cl->sort_criteria = 0;
assert(id);
cl->id = xstrdup(id);
+ client_init_xdoc(cl);
client_use(1);
yaz_log(YLOG_DEBUG, "client_create c=%p %s", cl, id);
assert(!c->connection);
facet_limits_destroy(c->facet_limits);
+ client_destroy_xdoc(c);
if (c->resultset)
{
ZOOM_resultset_destroy(c->resultset);
return cl->hits;
}
-int client_get_num_records(struct client *cl)
+int client_get_num_records(struct client *cl, int *filtered, int *ingest,
+ int *failed)
{
+ if (filtered)
+ *filtered = cl->filtered;
+ if (ingest)
+ *ingest = cl->ingest_failures;
+ if (failed)
+ *failed = cl->record_failures;
return cl->record_offset;
}
-int client_get_num_records_filtered(struct client *cl)
-{
- return cl->filtered;
-}
-
void client_set_diagnostic(struct client *cl, int diagnostic,
const char *message, const char *addinfo)
{
facet_limits_t facet_limits, const char **error_msg);
Odr_int client_get_hits(struct client *cl);
Odr_int client_get_approximation(struct client *cl);
-int client_get_num_records(struct client *cl);
-int client_get_num_records_filtered(struct client *cl);
+int client_get_num_records(struct client *cl, int *filtered, int *ingest,
+ int *failed);
int client_get_diagnostic(struct client *cl,
const char **message, const char **addinfo);
void client_set_diagnostic(struct client *cl, int diagnostic,
void client_update_show_stat(struct client *cl, int cmd);
+void client_store_xdoc(struct client *cl, int record_no, xmlDoc *xdoc);
+
#endif
/*
int err;
if ((err = ZOOM_connection_error(link, &error, &addinfo)))
{
- yaz_log(YLOG_LOG, "Error %s from %s",
- error, client_get_id(cl));
+ struct session *se = client_get_session(cl);
+
+ session_log(se, YLOG_WARN, "%s: Error %s (%s)",
+ client_get_id(cl), error, addinfo);
client_set_diagnostic(cl, err, error, addinfo);
client_set_state(cl, Client_Error);
}
case ZOOM_EVENT_RECV_APDU:
break;
case ZOOM_EVENT_CONNECT:
- yaz_log(YLOG_LOG, "Connected to %s", client_get_id(cl));
co->state = Conn_Open;
break;
case ZOOM_EVENT_RECV_SEARCH:
if (fds[i].input_mask)
fds[i].fd = p->fd;
}
+ assert(i == no_fds);
yaz_log(man->log_level, "yaz_poll begin nofds=%d", no_fds);
res = yaz_poll(fds, no_fds, tv_sec, 0);
yaz_log(man->log_level, "yaz_poll returned res=%d", res);
else
{
yaz_log(YLOG_ERRNO | YLOG_WARN, "poll");
- return 0;
+ abort();
}
}
if (man->sel_fd != -1)
wrbuf_printf(c->wrbuf, "<records>%d</records>\n",
ht[i].records - ht[i].filtered);
+ wrbuf_printf(c->wrbuf, "<filtered>%d</filtered>\n", ht[i].filtered);
if (version >= 2)
{
- wrbuf_printf(c->wrbuf, "<filtered>%d</filtered>\n", ht[i].filtered);
wrbuf_printf(c->wrbuf, "<approximation>" ODR_INT_PRINTF
"</approximation>\n", ht[i].approximation);
}
for (i = 0; i < num; i++)
{
- WRBUF fname = conf_get_fname(conf, stylesheets[i]);
-
*m = nmem_malloc(nt->nmem, sizeof(**m));
(*m)->marcmap = NULL;
(*m)->stylesheet1 = NULL;
-
(*m)->stylesheet2 = service_xslt_get(service, stylesheets[i]);
if ((*m)->stylesheet2)
;
else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl"))
{
+ WRBUF fname = conf_get_fname(conf, stylesheets[i]);
if (!((*m)->stylesheet1 =
xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname))))
{
stylesheets[i]);
no_errors++;
}
+ wrbuf_destroy(fname);
}
else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap"))
{
+ WRBUF fname = conf_get_fname(conf, stylesheets[i]);
if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), nt->nmem)))
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s",
stylesheets[i]);
no_errors++;
}
+ wrbuf_destroy(fname);
}
else
{
yaz_log(YLOG_FATAL, "Cannot handle stylesheet: %s", stylesheets[i]);
no_errors++;
}
-
- wrbuf_destroy(fname);
m = &(*m)->next;
}
}
}
pazpar2_mutex_init();
- config = config_create(config_fname, global_parameters.dump_records);
+ if (!test_mode)
+ {
+ yaz_log(YLOG_LOG, "Pazpar2 start " VERSION " "
+#ifdef PAZPAR2_VERSION_SHA1
+ PAZPAR2_VERSION_SHA1
+#else
+ "-"
+#endif
+ );
+ }
+ config = config_create(config_fname);
if (!config)
return 1;
sc_stop_config = config;
}
else
{
- yaz_log(YLOG_LOG, "Pazpar2 start " VERSION " "
-#ifdef PAZPAR2_VERSION_SHA1
- PAZPAR2_VERSION_SHA1
-#else
- "-"
-#endif
- );
ret = 0;
if (daemon && !log_file_in_use)
{
return 0;
}
-struct conf_config *config_create(const char *fname, int verbose)
+struct conf_config *config_create(const char *fname)
{
xmlDoc *doc = xmlReadFile(fname,
NULL,
r = yaz_xml_include_simple(n, wrbuf_cstr(config->confdir));
if (r == 0) /* OK */
{
- if (verbose)
- {
- yaz_log(YLOG_LOG, "Configuration %s after include processing",
- fname);
+ yaz_log(YLOG_LOG, "Configuration %s after include processing",
+ fname);
#if LIBXML_VERSION >= 20600
- xmlDocFormatDump(yaz_log_file(), doc, 0);
+ xmlDocFormatDump(yaz_log_file(), doc, 0);
#else
- xmlDocDump(yaz_log_file(), doc);
+ xmlDocDump(yaz_log_file(), doc);
#endif
- }
r = parse_config(config, n);
}
xmlFreeDoc(doc);
iochan_man_t iochan_man;
};
-struct conf_config *config_create(const char *fname, int verbose);
+struct conf_config *config_create(const char *fname);
void config_destroy(struct conf_config *config);
void config_process_events(struct conf_config *config);
void info_services(struct conf_server *server, WRBUF w);
#include <yaz/yaz-util.h>
#include <yaz/nmem.h>
#include <yaz/snprintf.h>
-#include <yaz/tpath.h>
#include <yaz/xml_include.h>
#include "service_xslt.h"
#include <yaz/oid_db.h>
#include <yaz/snprintf.h>
-#define USE_TIMING 1
+#define USE_TIMING 0
#if USE_TIMING
#include <yaz/timing.h>
#endif
WRBUF w = wrbuf_alloc();
const char *name = session_setting_oneval(client_get_database(cl),
PZ_NAME);
-
res[*count].id = client_get_id(cl);
res[*count].name = *name ? name : "Unknown";
res[*count].hits = client_get_hits(cl);
res[*count].approximation = client_get_approximation(cl);
- res[*count].records = client_get_num_records(cl);
- res[*count].filtered = client_get_num_records_filtered(cl);
+ res[*count].records = client_get_num_records(cl,
+ &res[*count].filtered,
+ 0, 0);
res[*count].diagnostic =
client_get_diagnostic(cl, &res[*count].message,
&res[*count].addinfo);
}
else
{
- session_log(se, YLOG_LOG, "%s: no more to fetch",
- client_get_id(cl));
+ int filtered;
+ int ingest_failures;
+ int record_failures;
+ int num = client_get_num_records(
+ cl, &filtered, &ingest_failures, &record_failures);
+
+ session_log(se, YLOG_LOG, "%s: hits=" ODR_INT_PRINTF
+ " fetched=%d filtered=%d",
+ client_get_id(cl),
+ client_get_hits(cl),
+ num, filtered);
+ if (ingest_failures || record_failures)
+ {
+ session_log(se, YLOG_WARN, "%s:"
+ " ingest failures=%d record failures=%d",
+ client_get_id(cl),
+ ingest_failures, record_failures);
+ }
}
}
else
{
int ret = 0;
struct session *se = client_get_session(cl);
- struct conf_service *service = se->service;
-
- insert_settings_values(sdb, xdoc, root, service);
if (!check_record_filter(root, sdb))
{
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;
+ int r = ingest_xml_record(cl, xdoc, record_no, nmem, 0);
+ client_store_xdoc(cl, record_no, xdoc);
+ return r;
+}
+int ingest_xml_record(struct client *cl, xmlDoc *xdoc,
+ int record_no, NMEM nmem, int cached_copy)
+{
+ struct session *se = client_get_session(cl);
+ struct session_database *sdb = client_get_database(cl);
+ struct conf_service *service = se->service;
+ xmlNode *root;
+ int r = 0;
if (!xdoc)
return -1;
if (sroot->type == XML_ELEMENT_NODE &&
!strcmp((const char *) sroot->name, "record"))
{
+ if (!cached_copy)
+ insert_settings_values(sdb, xdoc, root, service);
r = ingest_sub_record(cl, xdoc, sroot, record_no, nmem, sdb,
mk);
}
mk->value = nmem_strdup(nmem, mergekey_norm);
mk->next = 0;
+ if (!cached_copy)
+ insert_settings_values(sdb, xdoc, root, service);
r = ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb, mk);
}
}
(const char *) root->name);
r = -1;
}
- xmlFreeDoc(xdoc);
return r;
}
if (check_limit_local(cl, record, record_no))
{
- session_log(se, YLOG_LOG, "Facet filtered out record no %d from %s",
- record_no, sdb->database->id);
if (type)
xmlFree(type);
if (value)
const char *session_setting_oneval(struct session_database *db, int offset);
int ingest_record(struct client *cl, const char *rec, int record_no, NMEM nmem);
+int ingest_xml_record(struct client *cl, xmlDoc *xdoc,
+ int record_no, NMEM nmem, int cached_copy);
void session_alert_watch(struct session *s, int what);
void add_facet(struct session *s, const char *type, const char *value, int count);
<hits>4</hits>
<diagnostic>0</diagnostic>
<records>2</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>6</hits>
<diagnostic>0</diagnostic>
<records>2</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>7</hits>
<diagnostic>0</diagnostic>
<records>7</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>0</hits>
<diagnostic>0</diagnostic>
<records>0</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1</hits>
<diagnostic>0</diagnostic>
<records>1</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1</hits>
<diagnostic>0</diagnostic>
<records>1</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>10</hits>
<diagnostic>0</diagnostic>
<records>10</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target>
<target><id>Target-2</id>
<hits>2015</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>10</hits>
<diagnostic>0</diagnostic>
<records>10</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target>
<target><id>Target-2</id>
<hits>2015</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1</hits>
<diagnostic>0</diagnostic>
<records>1</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>10</hits>
<diagnostic>0</diagnostic>
<records>10</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>10</hits>
<diagnostic>0</diagnostic>
<records>10</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<message>Unsupported Use attribute</message>
<addinfo>host_wildcard</addinfo>
<records>0</records>
+<filtered>0</filtered>
<state>Client_Error</state>
<settings>
<set name="pz:elements" value="F"/>
<hits>0</hits>
<diagnostic>0</diagnostic>
<records>0</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
<settings>
<set name="pz:elements" value="F"/>
<hits>1995</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1995</hits>
<diagnostic>0</diagnostic>
<records>200</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1995</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1995</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>1995</hits>
<diagnostic>0</diagnostic>
<records>200</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>23</hits>
<diagnostic>0</diagnostic>
<records>23</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target>
<target><id>id_solr</id>
<hits>2015</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>23</hits>
<diagnostic>0</diagnostic>
<records>23</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target>
<target><id>id_solr</id>
<hits>2015</hits>
<diagnostic>0</diagnostic>
<records>100</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>23</hits>
<diagnostic>0</diagnostic>
<records>23</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
<hits>3</hits>
<diagnostic>0</diagnostic>
<records>3</records>
+<filtered>0</filtered>
<state>Client_Idle</state>
</target></bytarget>
\ No newline at end of file
DEBUG=0 # 0 for release, 1 for debug
USE_MANIFEST = 1 # Can be enabled Visual Studio 2005/2008
PACKAGE_NAME=pazpar2
-PACKAGE_VERSION=1.7.2
+PACKAGE_VERSION=1.7.4
# YAZ
YAZ_DIR=..\..\yaz