X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=c5b10a8c34d12d0e0ee2eedc1339302338fc4009;hb=3d99aecedf9d6e6ebeadcedbee081049b03dbbf8;hp=1d35d95c0c52d588257f624fe783b5cdc8b0a531;hpb=9267d02c3601122f74bdf3a9d21f30080a4a1a9a;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 1d35d95..c5b10a8 100644 --- a/src/client.c +++ b/src/client.c @@ -154,6 +154,51 @@ const char *client_get_pquery(struct client *cl) } static void client_send_raw_present(struct client *cl); +static int nativesyntax_to_type(struct session_database *sdb, char *type, + ZOOM_record rec); + +static void client_show_immediate(struct client *cl, int position, + void *data, + void (*error_handler)(void *data, const char *addinfo), + void (*record_handler)(void *data, const char *buf, + size_t sz), + int binary) +{ + struct connection *co = cl->connection; + struct session_database *sdb = client_get_database(cl); + ZOOM_resultset resultset = 0; + ZOOM_record rec = 0; + char type[80]; + const char *buf; + int len; + + assert(co); + + resultset = connection_get_resultset(co); + if (!resultset) + { + error_handler(data, "no resultset"); + return; + } + rec = ZOOM_resultset_record(resultset, position-1); + if (!rec) + { + error_handler(data, "no record"); + return; + } + if (binary) + strcpy(type, "raw"); + else + nativesyntax_to_type(sdb, type, rec); + buf = ZOOM_record_get(rec, type, &len); + if (!buf) + { + error_handler(data, "no record"); + return; + } + record_handler(data, buf, len); +} + int client_show_raw_begin(struct client *cl, int position, const char *syntax, const char *esn, @@ -161,47 +206,51 @@ int client_show_raw_begin(struct client *cl, int position, void (*error_handler)(void *data, const char *addinfo), void (*record_handler)(void *data, const char *buf, size_t sz), - void **data2, int binary) { - struct show_raw *rr, **rrp; if (!cl->connection) - { /* the client has no connection */ return -1; - } - rr = xmalloc(sizeof(*rr)); - *data2 = rr; - rr->position = position; - rr->active = 0; - rr->data = data; - rr->error_handler = error_handler; - rr->record_handler = record_handler; - rr->binary = binary; - if (syntax) - rr->syntax = xstrdup(syntax); - else - rr->syntax = 0; - if (esn) - rr->esn = xstrdup(esn); - else - rr->esn = 0; - rr->next = 0; - - for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) - ; - *rrp = rr; - if (cl->state == Client_Failed) - { - client_show_raw_error(cl, "client failed"); - } - else if (cl->state == Client_Disconnected) - { - client_show_raw_error(cl, "client disconnected"); - } + if (syntax == 0 && esn == 0) + client_show_immediate(cl, position, data, + error_handler, record_handler, + binary); else { - client_send_raw_present(cl); + struct show_raw *rr, **rrp; + rr = xmalloc(sizeof(*rr)); + rr->position = position; + rr->active = 0; + rr->data = data; + rr->error_handler = error_handler; + rr->record_handler = record_handler; + rr->binary = binary; + if (syntax) + rr->syntax = xstrdup(syntax); + else + rr->syntax = 0; + if (esn) + rr->esn = xstrdup(esn); + else + rr->esn = 0; + rr->next = 0; + + for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) + ; + *rrp = rr; + + if (cl->state == Client_Failed) + { + client_show_raw_error(cl, "client failed"); + } + else if (cl->state == Client_Disconnected) + { + client_show_raw_error(cl, "client disconnected"); + } + else + { + client_send_raw_present(cl); + } } return 0; } @@ -271,7 +320,8 @@ static void client_send_raw_present(struct client *cl) connection_continue(co); } -static int nativesyntax_to_type(struct session_database *sdb, char *type, ZOOM_record rec) +static int nativesyntax_to_type(struct session_database *sdb, char *type, + ZOOM_record rec) { const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX);