X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhttp_command.c;h=f9c5d42bbc5597929a8dedb1b247b820b49aacce;hb=5b4ea0cf66dd82c871ed7d69a5801d78789087b2;hp=16c890ab577c5657dfd76ee5d50d8db1ff66b0c7;hpb=2819110732a5e3cdc6de71333977ff39d7cf8bf3;p=pazpar2-moved-to-github.git
diff --git a/src/http_command.c b/src/http_command.c
index 16c890a..f9c5d42 100644
--- a/src/http_command.c
+++ b/src/http_command.c
@@ -37,7 +37,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "eventl.h"
#include "pazpar2.h"
#include "http.h"
-#include "http_command.h"
#include "settings.h"
#include "client.h"
@@ -53,7 +52,8 @@ struct http_session {
struct http_session *next;
};
-static struct http_session *session_list = 0;
+static struct http_session *session_list = 0; /* thread pr */
+
void http_session_destroy(struct http_session *s);
static void session_timeout(IOCHAN i, int event)
@@ -62,12 +62,12 @@ static void session_timeout(IOCHAN i, int event)
http_session_destroy(s);
}
-struct http_session *http_session_create(void)
+struct http_session *http_session_create(struct conf_service *service)
{
NMEM nmem = nmem_create();
struct http_session *r = nmem_malloc(nmem, sizeof(*r));
- r->psession = new_session(nmem);
+ r->psession = new_session(nmem, service);
r->session_id = 0;
r->timestamp = 0;
r->nmem = nmem;
@@ -155,7 +155,7 @@ static void error(struct http_response *rs,
unsigned int make_sessionid(void)
{
- static int seq = 0;
+ static int seq = 0; /* thread pr */
unsigned int res;
seq++;
@@ -185,7 +185,7 @@ unsigned int make_sessionid(void)
static struct http_session *locate_session(struct http_request *rq, struct http_response *rs)
{
struct http_session *p;
- char *session = http_argbyname(rq, "session");
+ const char *session = http_argbyname(rq, "session");
unsigned int id;
if (!session)
@@ -237,7 +237,7 @@ static int process_settings(struct session *se, struct http_request *rq,
static void cmd_exit(struct http_channel *c)
{
yaz_log(YLOG_WARN, "exit");
- http_close_server();
+ http_close_server(c->server);
}
static void cmd_init(struct http_channel *c)
@@ -245,9 +245,18 @@ static void cmd_init(struct http_channel *c)
unsigned int sesid;
char buf[1024];
const char *clear = http_argbyname(c->request, "clear");
- struct http_session *s = http_session_create();
+ const char *service_name = http_argbyname(c->request, "service");
+ struct conf_service *service = locate_service(c->server,
+ service_name);
+ struct http_session *s = http_session_create(service);
struct http_response *rs = c->response;
+ if (!service)
+ {
+ error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "service");
+ return;
+ }
+
yaz_log(YLOG_DEBUG, "HTTP Session init");
if (!clear || *clear == '0')
session_init_databases(s->psession);
@@ -333,8 +342,8 @@ static void cmd_termlist(struct http_channel *c)
struct termlist_score **p;
int len;
int i;
- char *name = http_argbyname(rq, "name");
- char *nums = http_argbyname(rq, "num");
+ const char *name = http_argbyname(rq, "name");
+ const char *nums = http_argbyname(rq, "num");
int num = 15;
int status;
@@ -357,7 +366,7 @@ static void cmd_termlist(struct http_channel *c)
while (*name)
{
char tname[256];
- char *tp;
+ const char *tp;
if (!(tp = strchr(name, ',')))
tp = name + strlen(name);
@@ -550,9 +559,9 @@ static void cmd_record(struct http_channel *c)
struct http_response *rs = c->response;
struct http_request *rq = c->request;
struct http_session *s = locate_session(rq, rs);
- struct record_cluster *rec;
+ struct record_cluster *rec, *prev_r, *next_r;
struct record *r;
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = s->psession->service;
const char *idstr = http_argbyname(rq, "id");
const char *offsetstr = http_argbyname(rq, "offset");
const char *binarystr = http_argbyname(rq, "binary");
@@ -565,7 +574,7 @@ static void cmd_record(struct http_channel *c)
return;
}
wrbuf_rewind(c->wrbuf);
- if (!(rec = show_single(s->psession, idstr)))
+ if (!(rec = show_single(s->psession, idstr, &prev_r, &next_r)))
{
if (session_set_watch(s->psession, SESSION_WATCH_RECORD,
cmd_record_ready, c, c) != 0)
@@ -595,23 +604,20 @@ static void cmd_record(struct http_channel *c)
}
else
{
- void *data2;
http_channel_observer_t obs =
http_add_observer(c, r->client, show_raw_reset);
- int ret =
- client_show_raw_begin(r->client, r->position, syntax, esn,
- obs /* data */,
- show_raw_record_error,
- (binary ?
- show_raw_record_ok_binary :
- show_raw_record_ok),
- &data2,
- (binary ? 1 : 0));
+ int ret = client_show_raw_begin(r->client, r->position,
+ syntax, esn,
+ obs /* data */,
+ show_raw_record_error,
+ (binary ?
+ show_raw_record_ok_binary :
+ show_raw_record_ok),
+ (binary ? 1 : 0));
if (ret == -1)
{
http_remove_observer(obs);
error(rs, PAZPAR2_NO_SESSION, 0);
- return;
}
}
}
@@ -621,6 +627,20 @@ static void cmd_record(struct http_channel *c)
wrbuf_puts(c->wrbuf, "");
wrbuf_xmlputs(c->wrbuf, rec->recid);
wrbuf_puts(c->wrbuf, "\n");
+ if (prev_r)
+ {
+ wrbuf_puts(c->wrbuf, "");
+ wrbuf_xmlputs(c->wrbuf, prev_r->recid);
+ wrbuf_puts(c->wrbuf, "\n");
+ }
+ if (next_r)
+ {
+ wrbuf_puts(c->wrbuf, "");
+ wrbuf_xmlputs(c->wrbuf, next_r->recid);
+ wrbuf_puts(c->wrbuf, "\n");
+ }
+ wrbuf_printf(c->wrbuf, "%d\n",
+ session_active_clients(s->psession));
write_metadata(c->wrbuf, service, rec->metadata, 1);
for (r = rec->records; r; r = r->next)
write_subrecord(r, c->wrbuf, service, 1);
@@ -644,9 +664,9 @@ static void show_records(struct http_channel *c, int active)
struct http_session *s = locate_session(rq, rs);
struct record_cluster **rl;
struct reclist_sortparms *sp;
- char *start = http_argbyname(rq, "start");
- char *num = http_argbyname(rq, "num");
- char *sort = http_argbyname(rq, "sort");
+ const char *start = http_argbyname(rq, "start");
+ const char *num = http_argbyname(rq, "num");
+ const char *sort = http_argbyname(rq, "sort");
int startn = 0;
int numn = 20;
int total;
@@ -666,7 +686,7 @@ static void show_records(struct http_channel *c, int active)
numn = atoi(num);
if (!sort)
sort = "relevance";
- if (!(sp = reclist_parse_sortparms(c->nmem, sort)))
+ if (!(sp = reclist_parse_sortparms(c->nmem, sort, s->psession->service)))
{
error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "sort");
return;
@@ -687,7 +707,7 @@ static void show_records(struct http_channel *c, int active)
int ccount;
struct record *p;
struct record_cluster *rec = rl[i];
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = s->psession->service;
wrbuf_puts(c->wrbuf, "\n");
write_metadata(c->wrbuf, service, rec->metadata, 0);
@@ -718,7 +738,7 @@ static void cmd_show(struct http_channel *c)
struct http_request *rq = c->request;
struct http_response *rs = c->response;
struct http_session *s = locate_session(rq, rs);
- char *block = http_argbyname(rq, "block");
+ const char *block = http_argbyname(rq, "block");
int status;
if (!s)
@@ -784,8 +804,8 @@ static void cmd_search(struct http_channel *c)
struct http_request *rq = c->request;
struct http_response *rs = c->response;
struct http_session *s = locate_session(rq, rs);
- char *query = http_argbyname(rq, "query");
- char *filter = http_argbyname(rq, "filter");
+ const char *query = http_argbyname(rq, "query");
+ const char *filter = http_argbyname(rq, "filter");
enum pazpar2_error_code code;
const char *addinfo = 0;
@@ -820,12 +840,18 @@ static void cmd_stat(struct http_channel *c)
struct statistics stat;
int clients;
+ float progress = 0;
+
if (!s)
return;
clients = session_active_clients(s->psession);
statistics(s->psession, &stat);
+ if (stat.num_clients > 0) {
+ progress = (stat.num_clients - clients) / (float)stat.num_clients;
+ }
+
wrbuf_rewind(c->wrbuf);
wrbuf_puts(c->wrbuf, "");
wrbuf_printf(c->wrbuf, "%d\n", clients);
@@ -838,6 +864,7 @@ static void cmd_stat(struct http_channel *c)
wrbuf_printf(c->wrbuf, "%d\n", stat.num_idle);
wrbuf_printf(c->wrbuf, "%d\n", stat.num_failed);
wrbuf_printf(c->wrbuf, "%d\n", stat.num_error);
+ wrbuf_printf(c->wrbuf, "\n", progress);
wrbuf_puts(c->wrbuf, "");
rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
http_send_response(c);
@@ -851,7 +878,11 @@ static void cmd_info(struct http_channel *c)
wrbuf_rewind(c->wrbuf);
wrbuf_puts(c->wrbuf, "\n");
wrbuf_puts(c->wrbuf, " \n");
- wrbuf_puts(c->wrbuf, "");
+ wrbuf_puts(c->wrbuf, "wrbuf, " sha1=\"%s\"", PAZPAR2_VERSION_SHA1);
+#endif
+ wrbuf_puts(c->wrbuf, ">");
wrbuf_xmlputs(c->wrbuf, VERSION);
wrbuf_puts(c->wrbuf, "");
@@ -890,7 +921,7 @@ struct {
void http_command(struct http_channel *c)
{
- char *command = http_argbyname(c->request, "command");
+ const char *command = http_argbyname(c->request, "command");
struct http_response *rs = http_create_response(c);
int i;
@@ -919,7 +950,9 @@ void http_command(struct http_channel *c)
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab
*/
+