ZOOM_connection_destroy(co->link);
iochan_destroy(co->iochan);
}
- yaz_log(YLOG_DEBUG, "%p Connection destroy %s", co, co->host->hostport);
+ yaz_log(YLOG_DEBUG, "%p Connection destroy %s", co, co->host->url);
if (co->client)
{
co->operation_timeout = operation_timeout;
co->session_timeout = session_timeout;
- connection_connect(co, iochan_man);
+ if (host->ipport)
+ connection_connect(co, iochan_man);
yaz_mutex_enter(host->mutex);
co->next = co->host->connections;
default:
yaz_log(YLOG_LOG, "Unhandled event (%d) from %s",
ev, client_get_id(cl));
+ break;
}
}
if (got_records)
co->client = 0;
}
+ void connect_resolver_host(struct host *host, iochan_man_t iochan_man)
+ {
+ struct connection *con;
+
+ start:
+ yaz_mutex_enter(host->mutex);
+ con = host->connections;
+ while (con)
+ {
+ if (con->state == Conn_Closed)
+ {
+ if (!host->ipport) /* unresolved */
+ {
+ remove_connection_from_host(con);
+ yaz_mutex_leave(host->mutex);
+ connection_destroy(con);
+ goto start;
+ /* start all over .. at some point it will be NULL */
+ }
+ else if (!con->client)
+ {
+ remove_connection_from_host(con);
+ yaz_mutex_leave(host->mutex);
+ connection_destroy(con);
+ /* start all over .. at some point it will be NULL */
+ goto start;
+ }
+ else
+ {
+ yaz_mutex_leave(host->mutex);
+ connection_connect(con, iochan_man);
+ client_start_search(con->client);
+ goto start;
+ }
+ }
+ else
+ {
+ yaz_log(YLOG_LOG, "connect_resolver_host: state=%d", con->state);
+ con = con->next;
+ }
+ }
+ yaz_mutex_leave(host->mutex);
+ }
+
static struct host *connection_get_host(struct connection *con)
{
return con->host;
const char *sru_version = 0;
struct session_database *sdb = client_get_database(con->client);
- const char *zproxy = session_setting_oneval(sdb, PZ_ZPROXY);
const char *apdulog = session_setting_oneval(sdb, PZ_APDULOG);
assert(con);
if ((charset = session_setting_oneval(sdb, PZ_NEGOTIATION_CHARSET)))
ZOOM_options_set(zoptions, "charset", charset);
- if (zproxy && *zproxy)
+ assert(host->ipport);
+ if (host->proxy)
{
- con->zproxy = xstrdup(zproxy);
- ZOOM_options_set(zoptions, "proxy", zproxy);
+ yaz_log(YLOG_LOG, "proxy=%s", host->ipport);
+ ZOOM_options_set(zoptions, "proxy", host->ipport);
}
+ else
+ {
+ assert(host->tproxy);
+ yaz_log(YLOG_LOG, "tproxy=%s", host->ipport);
+ ZOOM_options_set(zoptions, "tproxy", host->ipport);
+ }
+
if (apdulog && *apdulog)
ZOOM_options_set(zoptions, "apdulog", apdulog);
{
char http_hostport[512];
strcpy(http_hostport, "http://");
- strcat(http_hostport, host->hostport);
+ strcat(http_hostport, host->url);
+ yaz_log(YLOG_LOG, "SRU connect to : %s", http_hostport);
ZOOM_connection_connect(con->link, http_hostport, 0);
}
else
{
- ZOOM_connection_connect(con->link, host->hostport, 0);
+ ZOOM_connection_connect(con->link, host->url, 0);
}
-
con->iochan = iochan_create(-1, connection_handler, 0, "connection_socket");
con->state = Conn_Connecting;
iochan_settimeout(con->iochan, con->operation_timeout);
struct session_database *sdb = client_get_database(cl);
const char *zproxy = session_setting_oneval(sdb, PZ_ZPROXY);
const char *url = session_setting_oneval(sdb, PZ_URL);
+ const char *sru = session_setting_oneval(sdb, PZ_SRU);
struct host *host = 0;
+ int default_port = *sru ? 80 : 210;
if (zproxy && zproxy[0] == '\0')
zproxy = 0;
url = sdb->database->id;
host = find_host(client_get_session(cl)->service->server->database_hosts,
- url);
+ url, zproxy, default_port, iochan_man);
yaz_log(YLOG_DEBUG, "client_prep_connection: target=%s url=%s",
client_get_id(cl), url);
+ if (!host)
+ return 0;
co = client_get_connection(cl);
}
if (co)
{
- yaz_log(YLOG_LOG, "num_connections = %d (reusing)", num_connections);
+ yaz_log(YLOG_LOG, "Host %s: num_connections = %d (reusing)", host->hostport, num_connections);
break;
}
}
if (max_connections <= 0 || num_connections < max_connections)
{
- yaz_log(YLOG_LOG, "num_connections = %d (new); max = %d",
- num_connections, max_connections);
+ yaz_log(YLOG_LOG, "Host %s: num_connections = %d (new); max = %d",
+ host->hostport, num_connections, max_connections);
break;
}
- yaz_log(YLOG_LOG, "num_connections = %d (waiting) max = %d",
- num_connections, max_connections);
+ yaz_log(YLOG_LOG, "Host %s: num_connections = %d (waiting) max = %d",
+ host->hostport, num_connections, max_connections);
if (yaz_cond_wait(host->cond_ready, host->mutex, abstime))
{
- yaz_log(YLOG_LOG, "out of connections %s", client_get_id(cl));
+ yaz_log(YLOG_LOG, "Host %s: out of connections %s", host->hostport, client_get_id(cl));
client_set_state(cl, Client_Error);
yaz_mutex_leave(host->mutex);
return 0;
}
if (co)
{
- yaz_log(YLOG_LOG, "%p Connection reuse. state: %d", co, co->state);
+ yaz_log(YLOG_LOG, "Host %s: %p Connection reuse. state: %d", host->hostport, co, co->state);
connection_release(co);
client_set_connection(cl, co);
co->client = cl;
else
{
yaz_mutex_leave(host->mutex);
- co = connection_create(cl, host, operation_timeout, session_timeout,
- iochan_man);
+ co = connection_create(cl, host, operation_timeout, session_timeout, iochan_man);
+ yaz_log(YLOG_LOG, "Host %s: %p Connection new", host->hostport, co);
+
}
assert(co->host);
}
// create a parameters array and pass it to the pz2's constructor
// then register the form submit event with the pz2.search function
// autoInit is set to true on default
- var usesessions = true;
+ var usesessions = false;
var pazpar2path = '/service-proxy/';
var showResponseType = '';
+ // Facet configuration
var querys = {'su': '', 'au': '', 'xt': ''};
- var showResponseType = 'json';
+ var query_client_server = {'su': 'subject', 'au': 'author', 'xt': 'xtargets'};
+ var querys_server = {};
+ var useLimit = 1;
+ // Fail to get JSON working stabil.
+ var showResponseType = 'xml';
if (document.location.hash == '#pazpar2' || document.location.search.match("useproxy=false")) {
- usesessions = false;
+ usesessions = true;
pazpar2path = '/pazpar2/search.pz2';
showResponseType = 'xml';
}
"onrecord": my_onrecord } );
// some state vars
var curPage = 1;
- var recPerPage = 20;
+ var recPerPage = 100;
+ var recToShowPageSize = 20;
+ var recToShow = recToShowPageSize;
+ var recIDs = {};
var totalRec = 0;
var curDetRecId = '';
var curDetRecData = null;
authCb, authCb);
}
- function handleKeyPress(e, formId, focusId)
+ function handleKeyPress(e)
{
var key;
if(window.event)
if(key == 13 || key == 10)
{
- document.getElementById(formId).submit();
- focusElement = document.getElementById(focusId);
- if (focusElement)
- focusElement.focus();
- return false;
+ button = document.getElementById('button');
+ button.focus();
+ button.click();
+
+ return false;
}
else
return true;
my_paz.bytarget();
}
+ function showMoreRecords() {
+ var i = recToShow;
+ recToShow += recToShowPageSize;
+ for ( ; i < recToShow && i < recPerPage; i++) {
+ var element = document.getElementById(recIDs[i]);
+ if (element)
+ element.style.display = '';
+ }
+ if (i == recPerPage) {
+ var element = document.getElementById('recdiv_END');
+ if (element)
+ element.style.display = 'none';
+ }
+ }
+
function my_onshow(data) {
totalRec = data.merged;
// move it out
drawPager(pager);
var results = document.getElementById("results");
-
+
var html = [];
if (data.hits == undefined)
- return ;
+ return ;
+ var style = '';
for (var i = 0; i < data.hits.length; i++) {
var hit = data.hits[i];
- html.push('<li id="recdiv_'+hit.recid+'" >'
- /* +'<span>'+ (i + 1 + recPerPage * (curPage - 1)) +'. </span>' */
- +'<a href="#" id="rec_'+hit.recid
- +'" onclick="showDetails(this.id);return false;">'
- + hit["md-title"] +'</a> ');
- if (hit["md-title-remainder"] !== undefined) {
- html.push('<a href="#">' + hit["md-title-remainder"] + ' </a> ');
- if (hit["md-author"] != undefined) {
- html.push('<a href="#">'+hit["md-author"]+'</a> ');
- }
- else if (hit["md-title-responsibility"] !== undefined) {
- html.push('<a href="#">'+hit["md-title-responsibility"]+'</a> ');
- }
- }
+ var recID = "recdiv_" + hit.recid;
+ //var recID = "recdiv_" + i;
+ recIDs[i] = recID;
+ if (i == recToShow)
+ style = ' style="display:none" ';
+ html.push('<li id="' + recID + '" ' + style + '>'
+ +'<a href="#" id="rec_'+hit.recid
+ +'" onclick="showDetails(this.id);return false;">'
+ + hit["md-title"] +'</a> ');
- if (hit["md-title-responsibility"] !== undefined) {
++ if (hit["md-title-remainder"] !== undefined) {
++ html.push('<a href="#">' + hit["md-title-remainder"] + ' </a> ');
++ }
++ if (hit["md-author"] != undefined) {
++ html.push('<a href="#">'+hit["md-author"]+'</a> ');
++ }
++ else if (hit["md-title-responsibility"] !== undefined) {
+ html.push('<a href="#">'+hit["md-title-responsibility"]+'</a> ');
- if (hit["md-title-remainder"] !== undefined) {
- html.push('<a href="#">' + hit["md-title-remainder"] + ' </a> ');
- }
- }
++ }
if (hit.recid == curDetRecId) {
html.push(renderDetails_iphone(curDetRecData));
}
- html.push('</div>');
+ html.push('</li>');
+ }
+ // set up "More..." if needed.
+ style = 'display:none';
+ if (recToShow < recPerPage) {
+ style = 'display:block';
}
+ html.push('<li id="recdiv_END" style="' + style + '"><a onclick="showMoreRecords()">More...</a></li>');
+
replaceHtml(results, html.join(''));
}
termlists.push('<ul>');
termlists.push('<li><a href="#" onclick="limitOrResetQuery(\'reset_au\',\'All\');return false;">All<a></li>');
for (var i = 0; i < data.author.length && i < AuthorMax; i++ ) {
- termlists.push('<li><a href="#" onclick="limitQuery(\'au\', \'' + data.author[i].name +'\');return false;">'
+ termlists.push('<li><a href="#" onclick="limitOrResetQuery(\'au\', \'' + data.author[i].name +'\');return false;">'
+ data.author[i].name
+ ' ('
+ data.author[i].freq
totalRec = 0;
}
+ function getFacets() {
+ var result = "";
+ for (var key in querys_server) {
+ if (result.length > 0)
+ result += ","
+ result += querys_server[key];
+ }
+ return result;
+ }
+
function triggerSearch ()
{
- my_paz.search(document.search.query.value, recPerPage, curSort, curFilter);
- /*
- , startWith,
+ // Restore to initial page size
+ recToShow = recToShowPageSize;
+ my_paz.search(document.search.query.value, recPerPage, curSort, curFilter, undefined,
{
"limit" : getFacets()
}
);
- */
}
function loadSelect ()
}
// limit the query after clicking the facet
+ function limitQueryServer(field, value)
+ {
+ // Check for client field usage
+ var fieldname = query_client_server[field];
+ if (!fieldname)
+ fieldname = field;
+
+ var newQuery = fieldname + '=' + value.replace(",", "\\,").replace("|", "\\,");
+ // Does it already exists?
+ if (querys_server[fieldname])
+ querys_server[fieldname] += "," + newQuery;
+ else
+ querys_server[fieldname] = newQuery;
+ // document.search.query.value += newQuery;
+ onFormSubmitEventHandler();
+ showhide("recordview");
+ }
+
+
+
+ // limit the query after clicking the facet
function removeQuery (field, value) {
document.search.query.value.replace(' and ' + field + '="' + value + '"', '');
onFormSubmitEventHandler();
// limit the query after clicking the facet
function limitOrResetQuery (field, value, selected) {
- if (field == 'reset_su' || field == 'reset_au') {
- var reset_field = field.substring(6);
- document.search.query.value = document.search.query.value.replace(querys[reset_field], '');
- querys[reset_field] = '';
- onFormSubmitEventHandler();
- showhide("recordview");
- }
- else
- limitQuery(field, value);
+ if (useLimit) {
+ limitOrResetQueryServer(field,value, selected);
+ return ;
+ }
+ if (field == 'reset_su' || field == 'reset_au') {
+ var reset_field = field.substring(6);
+ document.search.query.value = document.search.query.value.replace(querys[reset_field], '');
+ querys[reset_field] = '';
+ onFormSubmitEventHandler();
+ showhide("recordview");
+ }
+ else
+ limitQuery(field, value);
//alert("limitOrResetQuerry: query after: " + document.search.query.value);
}
+ // limit the query after clicking the facet
+ function limitOrResetQueryServer (field, value, selected) {
+ if (field.substring(0,6) == 'reset_') {
+ var clientname = field.substring(6);
+ var fieldname = query_client_server[clientname];
+ if (!fieldname)
+ fieldname = clientname;
+ delete querys_server[fieldname];
+ onFormSubmitEventHandler();
+ showhide("recordview");
+ }
+ else
+ limitQueryServer(field, value);
+ //alert("limitOrResetQuerry: query after: " + document.search.query.value);
+ }
+
+
+
+
// limit by target functions
function limitTarget (id, name)
{
if (data["md-title-remainder"] !== undefined) {
details += ' : <span>' + data["md-title-remainder"] + ' </span>';
}
- if (data["md-title-responsibility"] !== undefined) {
- details += ' <span><i>'+ data["md-title-responsibility"] +'</i></span>';
+ if (data["md-author"] !== undefined) {
+ details += ' <span><i>'+ data["md-auhtor"] +'</i></span>';
}
details += '</td></tr>';
}
if (data["md-title-remainder"] !== undefined) {
details += ' ' + data["md-title-remainder"] + ' ';
}
- if (data["md-title-responsibility"] !== undefined) {
+ if (data["md-author"] !== undefined) {
+ details += '<i>'+ data["md-author"] +'</i>';
+ } else if (data["md-title-responsibility"] !== undefined) {
details += '<i>'+ data["md-title-responsibility"] +'</i>';
}
details += '</big>'