Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 29 Sep 2009 07:48:22 +0000 (09:48 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 29 Sep 2009 07:48:22 +0000 (09:48 +0200)
1  2 
src/connection.c
src/logic.c

diff --combined src/connection.c
@@@ -63,7 -63,7 +63,7 @@@ struct connection 
          Conn_Connecting,
          Conn_Open
      } state;
 -    int connect_timeout;
 +    int operation_timeout;
      int session_timeout;
      struct connection *next; // next for same host or next in free list
  };
@@@ -134,7 -134,7 +134,7 @@@ void connection_destroy(struct connecti
  // Creates a new connection for client, associated with the host of 
  // client's database
  static struct connection *connection_create(struct client *cl,
 -                                            int connect_timeout,
 +                                            int operation_timeout,
                                              int session_timeout)
  {
      struct connection *new;
      client_set_connection(cl, new);
      new->link = 0;
      new->state = Conn_Resolving;
 -    new->connect_timeout = connect_timeout;
 +    new->operation_timeout = operation_timeout;
      new->session_timeout = session_timeout;
      if (host->ipport)
          connection_connect(new);
@@@ -188,7 -188,6 +188,7 @@@ static void non_block_events(struct con
                      yaz_log(YLOG_LOG, "Error %s from %s",
                              error, client_get_url(cl));
                  }
 +                iochan_settimeout(iochan, co->session_timeout);
                  client_set_state(cl, Client_Idle);
              }
              break;
              break;
          case ZOOM_EVENT_SEND_APDU:
              client_set_state(co->client, Client_Working);
 +            iochan_settimeout(iochan, co->operation_timeout);
              break;
          case ZOOM_EVENT_RECV_APDU:
              break;
          case ZOOM_EVENT_CONNECT:
              yaz_log(YLOG_LOG, "Connected to %s", client_get_url(cl));
              co->state = Conn_Open;
 -            iochan_settimeout(iochan, co->session_timeout);
              break;
          case ZOOM_EVENT_RECV_SEARCH:
              client_search_response(cl);
@@@ -390,7 -389,7 +390,7 @@@ static int connection_connect(struct co
      con->link = link;
      con->iochan = iochan_create(0, connection_handler, 0);
      con->state = Conn_Connecting;
 -    iochan_settimeout(con->iochan, con->connect_timeout);
 +    iochan_settimeout(con->iochan, con->operation_timeout);
      iochan_setdata(con->iochan, con);
      iochan_setsocketfun(con->iochan, socketfun);
      iochan_setmaskfun(con->iochan, maskfun);
@@@ -409,7 -408,7 +409,7 @@@ const char *connection_get_url(struct c
  
  // Ensure that client has a connection associated
  int client_prep_connection(struct client *cl,
 -                           int connect_timeout, int session_timeout)
 +                           int operation_timeout, int session_timeout)
  {
      struct connection *co;
      struct session *se = client_get_session(cl);
      if (zproxy && zproxy[0] == '\0')
          zproxy = 0;
  
+     if (!host)
+         return 0;
      co = client_get_connection(cl);
  
      yaz_log(YLOG_DEBUG, "Client prep %s", client_get_url(cl));
              connection_release(co);
              client_set_connection(cl, co);
              co->client = cl;
 +            co->operation_timeout = operation_timeout;
 +            co->session_timeout = session_timeout;
              /* tells ZOOM to reconnect if necessary. Disabled becuase
                 the ZOOM_connection_connect flushes the task queue */
 -            co->connect_timeout = connect_timeout;
 -            co->session_timeout = session_timeout;
              ZOOM_connection_connect(co->link, 0, 0);
          }
          else
          {
 -            co = connection_create(cl, connect_timeout, session_timeout);
 +            co = connection_create(cl, operation_timeout, session_timeout);
          }
      }
  
diff --combined src/logic.c
@@@ -566,7 -566,7 +566,7 @@@ enum pazpar2_error_code search(struct s
          else
          {
              no_working++;
 -            if (client_prep_connection(cl, se->service->z3950_connect_timeout,
 +            if (client_prep_connection(cl, se->service->z3950_operation_timeout,
                      se->service->z3950_session_timeout))
                  client_start_search(cl);
          }
@@@ -1035,20 -1035,6 +1035,6 @@@ static const char *get_mergekey(xmlDoc 
      return mergekey_norm;
  }
  
- static const char *str_tok_n(const char *s, const char *delim,
-                              const char **res, size_t *len)
- {
-     *res = s;
-     while (*s && !strchr(delim, *s))
-         s++;
-     *len = s - *res;
-     if (*len == 0)
-         return 0;
-     if (*s && strchr(delim, *s))
-         s++;
-     return s;
- }
  /** \brief see if metadata for pz:recordfilter exists 
      \param root xml root element of normalized record
      \param sdb session database for client
@@@ -1078,21 -1064,22 +1064,22 @@@ static int check_record_filter(xmlNode 
              xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
              if (type)
              {
-                 const char *s1 = s;
                  size_t len;
-                 const char *value;
-                 while ((s1 = str_tok_n(s1, ",", &value, &len)) != 0)
+                 const char *eq = strchr(s, '=');
+                 if (eq)
+                     len = eq - s;
+                 else
+                     len = strlen(s);
+                 if (len == strlen((const char *)type) &&
+                     !memcmp((const char *) type, s, len))
                  {
-                     if (len == strlen((const char *)type) &&
-                         !memcmp((const char *) type, s, len))
+                     xmlChar *value = xmlNodeGetContent(n);
+                     if (value && *value)
                      {
-                         xmlChar *value = xmlNodeGetContent(n);
-                         if (value && *value)
-                         {
-                             xmlFree(value);
+                         if (!eq || strstr((const char *) value, eq+1))
                              match = 1;
-                         }
                      }
+                     xmlFree(value);
                  }
                  xmlFree(type);
              }