-/* $Id: client.c,v 1.20 2007-09-10 16:25:50 adam Exp $
+/* $Id: client.c,v 1.25 2007-09-20 09:22:37 adam Exp $
Copyright (c) 2006-2007, Index Data.
This file is part of Pazpar2.
"Client_Error",
"Client_Failed",
"Client_Disconnected",
- "Client_Stopped"
+ "Client_Stopped",
+ "Client_Continue"
};
static struct client *client_freelist = 0;
void client_set_state(struct client *cl, enum client_state st)
{
cl->state = st;
+ if (cl->session)
+ {
+ int no_active = session_active_clients(cl->session);
+ if (no_active == 0)
+ session_alert_watch(cl->session, SESSION_WATCH_SHOW);
+ }
}
static void client_show_raw_error(struct client *cl, const char *addinfo);
client_show_raw_error(cl, "client connection failure");
yaz_log(YLOG_WARN, "Fatal error from %s", client_get_url(cl));
connection_destroy(cl->connection);
- cl->state = Client_Error;
+ client_set_state(cl, Client_Error);
}
yaz_log(YLOG_DEBUG, "Init response %s", cl->database->database->url);
if (*r->result)
- cl->state = Client_Idle;
+ cl->state = Client_Continue;
else
cl->state = Client_Failed; // FIXME need to do something to the connection
}
if (*r->searchStatus)
{
cl->hits = *r->resultCount;
- se->total_hits += cl->hits;
+ if (cl->hits < 0)
+ {
+ yaz_log(YLOG_WARN, "Target %s returns hit count %d",
+ cl->database->database->url, cl->hits);
+ }
+ else
+ se->total_hits += cl->hits;
if (r->presentStatus && !*r->presentStatus && r->records)
{
yaz_log(YLOG_DEBUG, "Records in search response %s",
cl->database->database->url);
ingest_records(cl, r->records);
}
- cl->state = Client_Idle;
+ cl->state = Client_Continue;
}
else
{ /*"FAILED"*/
}
else
ingest_records(cl, recs);
- cl->state = Client_Idle;
+ cl->state = Client_Continue;
}
else if (*r->presentStatus)
{
if (cl->state == Client_Connected) {
client_init_request(cl);
}
- if (cl->state == Client_Idle)
+ if (cl->state == Client_Continue || cl->state == Client_Idle)
{
struct session *se = client_get_session(cl);
if (cl->requestid != se->requestid && cl->pquery) {
cl->records < cl->hits) {
client_send_present(cl);
}
+ else
+ client_set_state(cl, Client_Idle);
}
}
int client_is_active(struct client *cl)
{
- if (cl->connection && (cl->state == Client_Connecting ||
+ if (cl->connection && (cl->state == Client_Continue ||
+ cl->state == Client_Connecting ||
+ cl->state == Client_Connected ||
cl->state == Client_Initializing ||
cl->state == Client_Searching ||
cl->state == Client_Presenting))