projects
/
pazpar2-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
New block: Wait for preferred targets to be "ready"
[pazpar2-moved-to-github.git]
/
src
/
session.c
diff --git
a/src/session.c
b/src/session.c
index
b17b29b
..
ea09249
100644
(file)
--- a/
src/session.c
+++ b/
src/session.c
@@
-35,6
+35,9
@@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef WIN32
+#include <windows.h>
+#endif
#include <signal.h>
#include <ctype.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <assert.h>
@@
-52,6
+55,7
@@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <yaz/querytowrbuf.h>
#include <yaz/oid_db.h>
#include <yaz/snprintf.h>
#include <yaz/querytowrbuf.h>
#include <yaz/oid_db.h>
#include <yaz/snprintf.h>
+#include <yaz/gettimeofday.h>
#define USE_TIMING 0
#if USE_TIMING
#define USE_TIMING 0
#if USE_TIMING
@@
-142,7
+146,7
@@
void pull_terms(NMEM nmem, struct ccl_rpn_node *n, char **termlist, int *num)
}
}
-static void add_facet(struct session *s, const char *type, const char *value)
+void add_facet(struct session *s, const char *type, const char *value, int count)
{
int i;
{
int i;
@@
-164,7
+168,9
@@
static void add_facet(struct session *s, const char *type, const char *value)
= termlist_create(s->nmem, TERMLIST_HIGH_SCORE);
s->num_termlists = i + 1;
}
= termlist_create(s->nmem, TERMLIST_HIGH_SCORE);
s->num_termlists = i + 1;
}
- termlist_insert(s->termlists[i].termlist, value);
+ yaz_log(YLOG_DEBUG, "Session: facets for %s: %s (%d)", type, value, count);
+
+ termlist_insert(s->termlists[i].termlist, value, count);
}
static xmlDoc *record_to_xml(struct session_database *sdb, const char *rec)
}
static xmlDoc *record_to_xml(struct session_database *sdb, const char *rec)
@@
-430,7
+436,7
@@
void session_alert_watch(struct session *s, int what)
session_watchfun fun;
http_remove_observer(s->watchlist[what].obs);
session_watchfun fun;
http_remove_observer(s->watchlist[what].obs);
- fun = s->watchlist[what].fun;
+ fun = s->watchlist[what].fun;
data = s->watchlist[what].data;
/* reset watch before fun is invoked - in case fun wants to set
data = s->watchlist[what].data;
/* reset watch before fun is invoked - in case fun wants to set
@@
-503,6
+509,19
@@
int session_active_clients(struct session *s)
return res;
}
return res;
}
+int session_preferred_clients_ready(struct session *s)
+{
+ struct client_list *l;
+ int res = 0;
+
+ for (l = s->clients; l; l = l->next)
+ if (client_is_active_preferred(l->client))
+ res++;
+
+ return res == 0;
+}
+
+
enum pazpar2_error_code search(struct session *se,
const char *query,
enum pazpar2_error_code search(struct session *se,
const char *query,
@@
-514,7
+533,6
@@
enum pazpar2_error_code search(struct session *se,
int no_working = 0;
int no_failed = 0;
struct client_list *l;
int no_working = 0;
int no_failed = 0;
struct client_list *l;
- struct timespec abstime;
struct timeval tval;
yaz_log(YLOG_DEBUG, "Search");
struct timeval tval;
yaz_log(YLOG_DEBUG, "Search");
@@
-538,10
+556,9
@@
enum pazpar2_error_code search(struct session *se,
}
se->reclist = reclist_create(se->nmem);
}
se->reclist = reclist_create(se->nmem);
- gettimeofday(&tval, 0);
+ yaz_gettimeofday(&tval);
- abstime.tv_sec = tval.tv_sec + 5;
- abstime.tv_nsec = tval.tv_usec * 1000;
+ tval.tv_sec += 5;
for (l = se->clients; l; l = l->next)
{
for (l = se->clients; l; l = l->next)
{
@@
-561,7
+578,7
@@
enum pazpar2_error_code search(struct session *se,
if (client_prep_connection(cl, se->service->z3950_operation_timeout,
se->service->z3950_session_timeout,
se->service->server->iochan_man,
if (client_prep_connection(cl, se->service->z3950_operation_timeout,
se->service->z3950_session_timeout,
se->service->server->iochan_man,
- &abstime))
+ &tval))
client_start_search(cl);
}
}
client_start_search(cl);
}
}
@@
-979,7
+996,10
@@
static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name,
if (!strcmp((const char *) n->name, "metadata"))
{
xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
if (!strcmp((const char *) n->name, "metadata"))
{
xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
- if (!strcmp(name, (const char *) type))
+ if (type == NULL) {
+ yaz_log(YLOG_FATAL, "Missing type attribute on metadata element. Skipping!");
+ }
+ else if (!strcmp(name, (const char *) type))
{
xmlChar *value = xmlNodeListGetString(doc, n->children, 1);
if (value)
{
xmlChar *value = xmlNodeListGetString(doc, n->children, 1);
if (value)
@@
-1138,6
+1158,7
@@
static int ingest_to_cluster(struct client *cl,
\param cl client holds the result set for record
\param rec record buffer (0 terminated)
\param record_no record position (1, 2, ..)
\param cl client holds the result set for record
\param rec record buffer (0 terminated)
\param record_no record position (1, 2, ..)
+ \param nmem working NMEM
\retval 0 OK
\retval -1 failure
*/
\retval 0 OK
\retval -1 failure
*/
@@
-1369,22
+1390,23
@@
static int ingest_to_cluster(struct client *cl,
(char *) value, ser_md->rank,
ser_md->name);
(char *) value, ser_md->rank,
ser_md->name);
- // construct facets ...
- if (ser_md->termlist)
+ // construct facets ... unless the client already has reported them
+ if (ser_md->termlist && !client_has_facet(cl, (char *) type))
{
{
+
if (ser_md->type == Metadata_type_year)
{
char year[64];
sprintf(year, "%d", rec_md->data.number.max);
if (ser_md->type == Metadata_type_year)
{
char year[64];
sprintf(year, "%d", rec_md->data.number.max);
- add_facet(se, (char *) type, year);
+ add_facet(se, (char *) type, year, 1);
if (rec_md->data.number.max != rec_md->data.number.min)
{
sprintf(year, "%d", rec_md->data.number.min);
if (rec_md->data.number.max != rec_md->data.number.min)
{
sprintf(year, "%d", rec_md->data.number.min);
- add_facet(se, (char *) type, year);
+ add_facet(se, (char *) type, year, 1);
}
}
else
}
}
else
- add_facet(se, (char *) type, (char *) value);
+ add_facet(se, (char *) type, (char *) value, 1);
}
// cleaning up
}
// cleaning up