int m_resultset_max;
int m_session_ttl;
bool m_optimize_search;
+ bool m_restart;
int m_session_max;
};
}
}
}
BackendClassPtr bc = frontend->m_backend_class;
- BackendInstancePtr backend = bc->get_backend(package);
-
+ BackendInstancePtr backend;
mp::odr odr;
- if (!backend)
+
+ // we only need to get init response from "first" target in
+ // backend class - the assumption being that init response is
+ // same for all
+ if (bc->m_init_response.get() == 0)
{
- Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
- *apdu->u.initResponse->result = 0;
- package.response() = apdu;
- package.session().close();
+ backend = bc->get_backend(package);
}
- else
{
boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
- yazpp_1::GDU init_response = bc->m_init_response;
- Z_GDU *response_gdu = init_response.get();
- mp::util::transfer_referenceId(odr, gdu->u.z3950,
- response_gdu->u.z3950);
-
- Z_Options *server_options =
- response_gdu->u.z3950->u.initResponse->options;
- Z_Options *client_options = &frontend->m_init_options;
-
- int i;
- for (i = 0; i<30; i++)
- if (!ODR_MASK_GET(client_options, i))
- ODR_MASK_CLEAR(server_options, i);
- package.response() = init_response;
+ if (bc->m_init_response.get() == 0)
+ {
+ Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
+ *apdu->u.initResponse->result = 0;
+ package.response() = apdu;
+ package.session().close();
+ }
+ else
+ {
+ yazpp_1::GDU init_response = bc->m_init_response;
+ Z_GDU *response_gdu = init_response.get();
+ mp::util::transfer_referenceId(odr, gdu->u.z3950,
+ response_gdu->u.z3950);
+
+ Z_Options *server_options =
+ response_gdu->u.z3950->u.initResponse->options;
+ Z_Options *client_options = &frontend->m_init_options;
+
+ int i;
+ for (i = 0; i < 30; i++)
+ if (!ODR_MASK_GET(client_options, i))
+ ODR_MASK_CLEAR(server_options, i);
+ package.response() = init_response;
+ }
}
if (backend)
bc->release_backend(backend);
}
}
- if (!session_restarted &&
+ if (m_p->m_restart && !session_restarted &&
condition == YAZ_BIB1_TEMPORARY_SYSTEM_ERROR)
{
+ package.log("session_shared", YLOG_LOG, "restart");
bc->remove_backend(found_backend);
session_restarted = true;
found_backend.reset();
return; // search error
}
}
- if (!session_restarted && new_set->m_result_set_size < 0)
+ if (m_p->m_restart && !session_restarted && new_set->m_result_set_size < 0)
{
+ package.log("session_shared", YLOG_LOG, "restart");
bc->remove_backend(found_backend);
session_restarted = true;
found_backend.reset();
query.set_Z_Query(req->query);
Databases databases;
int i;
- for (i = 0; i<req->num_databaseNames; i++)
+ for (i = 0; i < req->num_databaseNames; i++)
databases.push_back(req->databaseNames[i]);
BackendSetPtr found_set; // null
m_resultset_max = 10;
m_session_ttl = 90;
m_optimize_search = true;
+ m_restart = false;
m_session_max = 100;
}
m_p->m_optimize_search =
mp::xml::get_bool(attr->children, true);
}
+ else if (!strcmp((const char *) attr->name, "restart"))
+ {
+ m_p->m_restart = mp::xml::get_bool(attr->children, true);
+ }
else
throw mp::filter::FilterException(
"Bad attribute " + std::string((const char *)