Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
authorDennis Schafroth <dennis@indexdata.com>
Tue, 15 Nov 2011 10:27:02 +0000 (11:27 +0100)
committerDennis Schafroth <dennis@indexdata.com>
Tue, 15 Nov 2011 10:27:02 +0000 (11:27 +0100)
Conflicts:
www/iphone/example_client.js

Fix: added md-author in branch. Added recIDs on head.

1  2 
.cproject
src/connection.c
www/iphone/example_client.js

diff --combined .cproject
+++ b/.cproject
@@@ -43,6 -43,6 +43,7 @@@
                                                                <option id="gnu.c.compiler.macosx.exe.debug.option.debugging.level.88106198" name="Debug Level" superClass="gnu.c.compiler.macosx.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
                                                                <option id="gnu.c.compiler.option.include.paths.16758435" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/yaz/include}&quot;"/>
++                                                                      <listOptionValue builtIn="false" value="/usr/local/include"/>
                                                                </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1159745856" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
                                                        </tool>
diff --combined src/connection.c
@@@ -150,7 -150,7 +150,7 @@@ static void connection_destroy(struct c
          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)
      {
@@@ -183,7 -183,8 +183,8 @@@ static struct connection *connection_cr
      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;
@@@ -260,7 -261,6 +261,7 @@@ static void non_block_events(struct con
          default:
              yaz_log(YLOG_LOG, "Unhandled event (%d) from %s",
                      ev, client_get_id(cl));
 +            break;
          }
      }
      if (got_records)
@@@ -368,6 -368,50 +369,50 @@@ static void connection_release(struct c
      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;
@@@ -383,7 -427,6 +428,6 @@@ static int connection_connect(struct co
      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);
@@@ -450,7 -501,9 +502,9 @@@ int client_prep_connection(struct clien
      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);
      }
@@@ -4,13 -4,18 +4,18 @@@
  // 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';
  }
@@@ -29,7 -34,10 +34,10 @@@ my_paz = new pz2( { "onshow": my_onshow
                      "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;
@@@ -52,7 -60,7 +60,7 @@@ function loginFormSubmit() 
        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;  
@@@ -130,6 -138,21 +138,21 @@@ function my_oninit() 
      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(''));
  }
  
@@@ -259,7 -291,7 +294,7 @@@ function my_onterm(data) 
      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 
@@@ -403,16 -435,25 +438,25 @@@ function resetPage(
      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 ()
@@@ -432,6 -473,27 +476,27 @@@ function limitQuery(field, value
  }
  
  // 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)
  {
@@@ -614,8 -699,8 +702,8 @@@ function renderDetails(data, marker
        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>';
      }
@@@ -672,9 -757,7 +760,9 @@@ function renderDetails_iphone(data, mar
          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>'