#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#if HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-#if HAVE_NETDB_H
-#include <netdb.h>
-#endif
#include <signal.h>
-#include <ctype.h>
#include <assert.h>
#include <yaz/marcdisp.h>
#include <yaz/timing.h>
#endif
-#if HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
#include "pazpar2.h"
#include "client.h"
char *pquery; // Current search
char *cqlquery; // used for SRU targets only
int hits;
- int records;
- int setno;
- int requestid; // ID of current outstanding request
+ int record_offset;
int diagnostic;
enum client_state state;
struct show_raw *show_raw;
static const char *client_states[] = {
"Client_Connecting",
- "Client_Connected",
"Client_Idle",
- "Client_Initializing",
- "Client_Searching",
- "Client_Presenting",
+ "Client_Working",
"Client_Error",
"Client_Failed",
- "Client_Disconnected",
- "Client_Stopped",
- "Client_Continue"
+ "Client_Disconnected"
};
static struct client *client_freelist = 0;
// Close connection and set state to error
void client_fatal(struct client *cl)
{
- //client_show_raw_error(cl, "client connection failure");
yaz_log(YLOG_WARN, "Fatal error from %s", client_get_url(cl));
connection_destroy(cl->connection);
client_set_state(cl, Client_Error);
return cl->pquery;
}
-void client_set_requestid(struct client *cl, int id)
-{
- cl->requestid = id;
-}
-
-
static void client_send_raw_present(struct client *cl);
int client_show_raw_begin(struct client *cl, int position,
if (ZOOM_connection_error(link, &error, &addinfo))
{
cl->hits = 0;
- cl->state = Client_Error;
+ client_set_state(cl, Client_Error);
yaz_log(YLOG_WARN, "Search error %s (%s): %s",
error, addinfo, client_get_url(cl));
}
else
{
+ cl->record_offset = 0;
cl->hits = ZOOM_resultset_size(resultset);
se->total_hits += cl->hits;
}
ZOOM_resultset resultset = connection_get_resultset(co);
const char *error, *addinfo;
- yaz_log(YLOG_LOG, "client_record_response");
if (ZOOM_connection_error(link, &error, &addinfo))
{
- cl->state = Client_Error;
+ client_set_state(cl, Client_Error);
yaz_log(YLOG_WARN, "Search error %s (%s): %s",
error, addinfo, client_get_url(cl));
}
cl->show_raw->active = 0;
ingest_raw_record(cl, rec);
}
+ else
+ {
+ yaz_log(YLOG_WARN, "Expected record, but got NULL, offset=%d",
+ cl->show_raw->position-1);
+ }
}
else
{
- int offset = cl->records;
+ int offset = cl->record_offset;
if ((rec = ZOOM_resultset_record(resultset, offset)))
{
- yaz_log(YLOG_LOG, "Record with offset %d", offset);
-
- cl->records++;
+ cl->record_offset++;
if (ZOOM_record_error(rec, &msg, &addinfo, 0))
yaz_log(YLOG_WARN, "Record error %s (%s): %s (rec #%d)",
- error, addinfo, client_get_url(cl), cl->records);
+ error, addinfo, client_get_url(cl),
+ cl->record_offset);
else
{
struct session_database *sdb = client_get_database(cl);
nativesyntax_to_type(sdb, type);
if ((xmlrec = ZOOM_record_get(rec, type, NULL)))
{
- if (ingest_record(cl, xmlrec, cl->records))
+ if (ingest_record(cl, xmlrec, cl->record_offset))
{
session_alert_watch(cl->session, SESSION_WATCH_SHOW);
session_alert_watch(cl->session, SESSION_WATCH_RECORD);
}
}
+ else
+ {
+ yaz_log(YLOG_WARN, "Expected record, but got NULL, offset=%d",
+ offset);
+ }
}
- if (!rec)
- yaz_log(YLOG_WARN, "Expected record, but got NULL");
}
}
assert(link);
cl->hits = -1;
- cl->records = 0;
+ cl->record_offset = 0;
cl->diagnostic = 0;
+ client_set_state(cl, Client_Working);
if (*opt_piggyback)
ZOOM_connection_option_set(link, "piggyback", opt_piggyback);
sprintf(n, "%d", global_parameters.toget);
ZOOM_connection_option_set(link, "count", n);
}
- if (!databaseName || !*databaseName)
- databaseName = "Default";
- ZOOM_connection_option_set(link, "databaseName", databaseName);
+ if (databaseName)
+ ZOOM_connection_option_set(link, "databaseName", databaseName);
ZOOM_connection_option_set(link, "presentChunk", "20");
ZOOM_query q = ZOOM_query_create();
ZOOM_query_cql(q, cl->cqlquery);
rs = ZOOM_connection_search(link, q);
+ ZOOM_query_destroy(q);
}
else
rs = ZOOM_connection_search_pqf(link, cl->pquery);
r->connection = 0;
r->session = 0;
r->hits = 0;
- r->records = 0;
- r->setno = 0;
- r->requestid = -1;
+ r->record_offset = 0;
r->diagnostic = 0;
r->state = Client_Disconnected;
r->show_raw = 0;
ccl_qual_rm(&ccl_map);
if (!cn)
{
- cl->state = Client_Error;
+ client_set_state(cl, Client_Error);
yaz_log(YLOG_WARN, "Failed to parse query for %s",
client_get_database(cl)->database->url);
return -1;
int client_is_active(struct client *cl)
{
- if (cl->connection && (cl->state == Client_Continue ||
- cl->state == Client_Connecting ||
+ if (cl->connection && (cl->state == Client_Connecting ||
cl->state == Client_Working))
return 1;
return 0;
int client_get_num_records(struct client *cl)
{
- return cl->records;
+ return cl->record_offset;
}
int client_get_diagnostic(struct client *cl)