Command record may return cached records (bug #2799).
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 1 May 2009 10:37:12 +0000 (12:37 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 1 May 2009 10:37:12 +0000 (12:37 +0200)
The 'record' command with argument 'offset' given but with no
'syntax' and 'esn' parameter now fetches records from last search.
This allows fast retrieval of marcxml and raw records. If, OTOH, esn
and syntax is given the record is assumed not to be cached and a new
present request is fired as before.

src/client.c
src/client.h
src/http_command.c

index 1d35d95..e1ced23 100644 (file)
@@ -154,6 +154,54 @@ 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);
+
+int client_show_raw_immediate(struct client *cl, int position,
+                              const char *syntax, const char *esn,
+                              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;
+
+    if (!co)
+        return -1;
+
+    resultset = connection_get_resultset(co);
+    if (!resultset)
+    {
+        error_handler(data, "no resultset");
+        return 0;
+    }
+    rec = ZOOM_resultset_record(resultset, position-1);
+    if (!rec)
+    {
+        error_handler(data, "no record");
+        return 0;
+    }
+    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 0;
+    }
+    record_handler(data, buf, len);
+    return 0;
+}
+
 
 int client_show_raw_begin(struct client *cl, int position,
                           const char *syntax, const char *esn,
@@ -271,7 +319,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);
 
index 7db53d6..64713a1 100644 (file)
@@ -45,6 +45,15 @@ int client_show_raw_begin(struct client *cl, int position,
                                                  size_t sz),
                           void **data2,
                           int binary);
+
+int client_show_raw_immediate(struct client *cl, int position,
+                              const char *syntax, const char *esn,
+                              void *data,
+                              void (*error_handler)(void *data, const char *addinfo),
+                              void (*record_handler)(void *data, const char *buf,
+                                                     size_t sz),
+                              int binary);
+
 void client_show_raw_remove(struct client *cl, void *rr);
 
 const char *client_get_state_str(struct client *cl);
index 8ec3264..9ca5481 100644 (file)
@@ -593,20 +593,40 @@ static void cmd_record(struct http_channel *c)
             error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given");
             return;
         }
+        else if (syntax == 0 && esn == 0)
+        {
+            http_channel_observer_t obs =
+                http_add_observer(c, r->client, show_raw_reset);
+            int ret = client_show_raw_immediate(
+                r->client, r->position, syntax, esn, 
+                obs,
+                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;
+            }
+        }
         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));
+                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));
             if (ret == -1)
             {
                 http_remove_observer(obs);