URSULA / Z-ruth service.
[yazpp-moved-to-github.git] / src / yaz-z-server-sr.cpp
index 010fb13..4c0b58d 100644 (file)
@@ -3,7 +3,10 @@
  * See the file LICENSE for details.
  * 
  * $Log: yaz-z-server-sr.cpp,v $
- * Revision 1.1  2001-03-27 15:02:14  adam
+ * Revision 1.2  2001-04-04 14:02:49  adam
+ * URSULA / Z-ruth service.
+ *
+ * Revision 1.1  2001/03/27 15:02:14  adam
  * New server facility scheme.
  *
  */
 #include <yaz/log.h>
 #include <yaz++/yaz-z-server.h>
 
-/*
- * database record.
- */
-void Yaz_Facility_Retrieval::create_databaseRecord (
-    Z_NamePlusRecord *rec, const char *dbname, int format,
-    const void *buf, int len)
-{
-    rec->databaseName = dbname ? odr_strdup (m_odr, dbname) : 0;
-    rec->which = Z_NamePlusRecord_databaseRecord;
-    rec->u.databaseRecord = z_ext_record (m_odr, format,
-                                         (const char *) buf, len);
-}
-
-/*
- * surrogate diagnostic.
- */
-void Yaz_Facility_Retrieval::create_surrogateDiagnostics(
-    Z_NamePlusRecord *rec, const char *dbname, int error, char *const addinfo)
-{
-    int oid[OID_SIZE];
-    int *err = (int *)odr_malloc (m_odr, sizeof(*err));
-    oident bib1;
-    Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (m_odr, sizeof(*drec));
-    Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
-       odr_malloc (m_odr, sizeof(*dr));
-    
-    bib1.proto = PROTO_Z3950;
-    bib1.oclass = CLASS_DIAGSET;
-    bib1.value = VAL_BIB1;
-
-    yaz_log(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo);
-    *err = error;
-    rec->databaseName = dbname ? odr_strdup (m_odr, dbname) : 0;
-    rec->which = Z_NamePlusRecord_surrogateDiagnostic;
-    rec->u.surrogateDiagnostic = drec;
-    drec->which = Z_DiagRec_defaultFormat;
-    drec->u.defaultFormat = dr;
-    dr->diagnosticSetId = odr_oiddup (m_odr,
-                                      oid_ent_to_oid(&bib1, oid));
-    dr->condition = err;
-    dr->which = Z_DefaultDiagFormat_v2Addinfo;
-    dr->u.v2Addinfo = odr_strdup (m_odr, addinfo ? addinfo : "");
-}
-
-Z_Records *Yaz_Facility_Retrieval::create_nonSurrogateDiagnostics (
-    int error, const char *addinfo)
-{
-    int oid[OID_SIZE];
-    Z_Records *rec = (Z_Records *)
-        odr_malloc (m_odr, sizeof(*rec));
-    oident bib1;
-    int *err = (int *)
-        odr_malloc (m_odr, sizeof(*err));
-    Z_DiagRec *drec = (Z_DiagRec *)
-        odr_malloc (m_odr, sizeof(*drec));
-    Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
-        odr_malloc (m_odr, sizeof(*dr));
-
-    bib1.proto = PROTO_Z3950;
-    bib1.oclass = CLASS_DIAGSET;
-    bib1.value = VAL_BIB1;
-
-    *err = error;
-    rec->which = Z_Records_NSD;
-    rec->u.nonSurrogateDiagnostic = dr;
-    dr->diagnosticSetId =
-        odr_oiddup (m_odr, oid_ent_to_oid(&bib1, oid));
-    dr->condition = err;
-    dr->which = Z_DefaultDiagFormat_v2Addinfo;
-    dr->u.v2Addinfo = odr_strdup (m_odr, addinfo ? addinfo : "");
-    return rec;
-}
-
-Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
-                                      int start, int xnum,
-                                      Z_RecordComposition *comp,
-                                      int *next, int *pres,
-                                      int *format)
+Z_Records *Yaz_Facility_Retrieval::pack_records (Yaz_Z_Server *s,
+                                                const char *resultSetName,
+                                                int start, int xnum,
+                                                Z_RecordComposition *comp,
+                                                int *next, int *pres,
+                                                int *format)
 {
     int recno, total_length = 0, toget = xnum, dumped_records = 0;
     Z_Records *records =
-       (Z_Records *) odr_malloc (m_odr, sizeof(*records));
+       (Z_Records *) odr_malloc (odr_encode(), sizeof(*records));
     Z_NamePlusRecordList *reclist =
-       (Z_NamePlusRecordList *) odr_malloc (m_odr, sizeof(*reclist));
+       (Z_NamePlusRecordList *) odr_malloc (odr_encode(), sizeof(*reclist));
     Z_NamePlusRecord **list =
-       (Z_NamePlusRecord **) odr_malloc (m_odr, sizeof(*list) * toget);
+       (Z_NamePlusRecord **) odr_malloc (odr_encode(), sizeof(*list) * toget);
 
     records->which = Z_Records_DBOSD;
     records->u.databaseOrSurDiagnostics = reclist;
@@ -111,7 +42,7 @@ Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
     for (recno = start; reclist->num_records < toget; recno++)
     {
        Z_NamePlusRecord *this_rec =
-           (Z_NamePlusRecord *) odr_malloc (m_odr, sizeof(*this_rec));
+           (Z_NamePlusRecord *) odr_malloc (odr_encode(), sizeof(*this_rec));
        this_rec->databaseName = 0;
        this_rec->which = Z_NamePlusRecord_databaseRecord;
        this_rec->u.databaseRecord = 0;
@@ -129,15 +60,15 @@ Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
        if (this_rec->which == Z_NamePlusRecord_databaseRecord &&
            this_rec->u.databaseRecord == 0)
        {   // handler did not return a record..
-           create_surrogateDiagnostics(this_rec, 0, 14, 0);
+           create_surrogateDiagnostics(odr_encode(), this_rec, 0, 14, 0);
        }
        /*
         * we get the number of bytes allocated on the stream before any
         * allocation done by the backend - this should give us a reasonable
         * idea of the total size of the data so far.
         */
-       total_length = odr_total(m_odr) - dumped_records;
-       this_length = odr_total(m_odr) - total_length;
+       total_length = odr_total(odr_encode()) - dumped_records;
+       this_length = odr_total(odr_encode()) - total_length;
        yaz_log(LOG_LOG, "  fetched record, len=%d, total=%d",
                this_length, total_length);
        if (this_length + total_length > m_preferredMessageSize)
@@ -153,7 +84,7 @@ Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
            {   /* too big entirely */
                yaz_log(LOG_LOG, "Record > maxrcdsz");
                reclist->records[reclist->num_records] = this_rec;
-               create_surrogateDiagnostics(this_rec,
+               create_surrogateDiagnostics(odr_encode(), this_rec,
                                            this_rec->databaseName, 17, 0);
                reclist->num_records++;
                *next = recno + 1;
@@ -167,7 +98,7 @@ Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
                {
                    yaz_log(LOG_DEBUG, "  Dropped it");
                    reclist->records[reclist->num_records] = this_rec;
-                   create_surrogateDiagnostics(this_rec,
+                   create_surrogateDiagnostics(odr_encode(), this_rec,
                                                this_rec->databaseName,
                                                16, 0);
                    reclist->num_records++;
@@ -185,10 +116,11 @@ Z_Records *Yaz_Facility_Retrieval::pack_records (const char *resultSetName,
     return records;
 }
 
-void Yaz_Facility_Retrieval::fetch_via_piggyback (Z_SearchRequest *req,
+void Yaz_Facility_Retrieval::fetch_via_piggyback (Yaz_Z_Server *s,
+                                                 Z_SearchRequest *req,
                                                  Z_SearchResponse *res)
 {
-    bool_t *sr = (bool_t *)odr_malloc (m_odr, sizeof(*sr));
+    bool_t *sr = (bool_t *)odr_malloc (odr_encode(), sizeof(*sr));
     *sr = 1;
     
     int toget = 0;
@@ -196,7 +128,7 @@ void Yaz_Facility_Retrieval::fetch_via_piggyback (Z_SearchRequest *req,
     Z_RecordComposition comp, *compp = 0;
     int hits = *res->resultCount;
     
-    int *nulint = (int *)odr_malloc (m_odr, sizeof(*nulint));
+    int *nulint = (int *)odr_malloc (odr_encode(), sizeof(*nulint));
     *nulint = 0;
     
     comp.which = Z_RecordComp_simple;
@@ -218,10 +150,10 @@ void Yaz_Facility_Retrieval::fetch_via_piggyback (Z_SearchRequest *req,
     
     if (toget && !res->records)
     {
-       res->presentStatus = (int *) odr_malloc (m_odr, sizeof(int));
+       res->presentStatus = (int *) odr_malloc (odr_encode(), sizeof(int));
        *res->presentStatus = Z_PRES_SUCCESS;
        res->records =
-           pack_records(req->resultSetName, 1, toget, compp, 
+           pack_records(s, req->resultSetName, 1, toget, compp, 
                         res->nextResultSetPosition,
                         res->presentStatus,
                         req->preferredRecordSyntax);
@@ -244,25 +176,22 @@ void Yaz_Facility_Retrieval::fetch_via_piggyback (Z_SearchRequest *req,
     }
 }
 
-void Yaz_Facility_Retrieval::fetch_via_present (Z_PresentRequest *req,
-                                     Z_PresentResponse *res)
+void Yaz_Facility_Retrieval::fetch_via_present (Yaz_Z_Server *s,
+                                               Z_PresentRequest *req,
+                                               Z_PresentResponse *res)
 {
-    res->records = pack_records (req->resultSetId,*req->resultSetStartPoint, 
-                                *req->numberOfRecordsRequested,
-                                req->recordComposition,
-                                res->nextResultSetPosition,
-                                res->presentStatus,
-                                req->preferredRecordSyntax);
+    res->records =
+       pack_records (s, req->resultSetId,*req->resultSetStartPoint, 
+                     *req->numberOfRecordsRequested,
+                     req->recordComposition,
+                     res->nextResultSetPosition,
+                     res->presentStatus,
+                     req->preferredRecordSyntax);
     if (res->records->which == Z_Records_DBOSD)
        *res->numberOfRecordsReturned =
            res->records->u.databaseOrSurDiagnostics->num_records;
 }
 
-ODR Yaz_Facility_Retrieval::odr_encode()
-{
-    return m_odr;
-}
-
 int Yaz_Facility_Retrieval::init(Yaz_Z_Server *s, Z_InitRequest *initRequest,
                                 Z_InitResponse *initResponse)
 {
@@ -278,10 +207,21 @@ int Yaz_Facility_Retrieval::init(Yaz_Z_Server *s, Z_InitRequest *initRequest,
     return sr_init (initRequest, initResponse);
 }
 
+ODR Yaz_Facility_Retrieval::odr_encode()
+{
+    return m_odr_encode;
+}
+
+ODR Yaz_Facility_Retrieval::odr_decode()
+{
+    return m_odr_decode;
+}
+
 int Yaz_Facility_Retrieval::recv(Yaz_Z_Server *s, Z_APDU *apdu_request)
 {   
     Z_APDU *apdu_response;
-    m_odr = s->odr_encode();
+    m_odr_encode = s->odr_encode();
+    m_odr_decode = s->odr_decode();
     switch (apdu_request->which)
     {
     case Z_APDU_searchRequest:
@@ -291,7 +231,7 @@ int Yaz_Facility_Retrieval::recv(Yaz_Z_Server *s, Z_APDU *apdu_request)
                       apdu_response->u.searchResponse);
        if (!apdu_response->u.searchResponse->records)
        {
-           fetch_via_piggyback(apdu_request->u.searchRequest,
+           fetch_via_piggyback(s, apdu_request->u.searchRequest,
                                apdu_response->u.searchResponse);
        }
        s->send_Z_PDU(apdu_response);
@@ -302,7 +242,7 @@ int Yaz_Facility_Retrieval::recv(Yaz_Z_Server *s, Z_APDU *apdu_request)
        sr_present (apdu_request->u.presentRequest,
                    apdu_response->u.presentResponse);
        if (!apdu_response->u.presentResponse->records)
-           fetch_via_present(apdu_request->u.presentRequest,
+           fetch_via_present(s, apdu_request->u.presentRequest,
                              apdu_response->u.presentResponse);
        s->send_Z_PDU(apdu_response);
        return 1;