X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=3ab4d8aa614afb8e056cb3ba37a151fc3f5defe7;hb=c95a9e501773dedb579f26c59bfd529d0ef9c6ec;hp=f138bbf26e894a860293b7cfb0d2f8851b32237c;hpb=ce3907338568fce46c5751e7e1091a5ad1c8e291;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index f138bbf..3ab4d8a 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -1,10 +1,16 @@ /* - * Copyright (C) 1995-1998, Index Data I/S + * Copyright (C) 1995-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: retrieve.c,v $ - * Revision 1.1 1998-03-05 08:45:13 adam + * Revision 1.3 1998-10-28 10:54:40 adam + * SDRKit integration. + * + * Revision 1.2 1998/10/16 08:14:33 adam + * Updated record control system. + * + * Revision 1.1 1998/03/05 08:45:13 adam * New result set model and modular ranking system. Moved towards * descent server API. System information stored as "SGML" records. * @@ -24,6 +30,14 @@ #include #include "zserver.h" +#ifndef ZEBRASDR +#define ZEBRASDR 0 +#endif + +#if ZEBRASDR +#include "zebrasdr.h" +#endif + struct fetch_control { int record_offset; int record_int_pos; @@ -68,7 +82,7 @@ static int record_int_read (void *fh, char *buf, size_t count) int l = fc->record_int_len - fc->record_int_pos; if (l <= 0) return 0; - l = (l < count) ? l : count; + l = (l < (int) count) ? l : count; memcpy (buf, fc->record_int_buf + fc->record_int_pos, l); fc->record_int_pos += l; return l; @@ -101,7 +115,7 @@ int zebra_record_fetch (ZebraHandle zh, int sysno, int score, ODR stream, *basenamep = odr_malloc (stream, strlen(basename)+1); strcpy (*basenamep, basename); - if (!(rt = recType_byName (file_type, subType))) + if (!(rt = recType_byName (zh->recTypes, file_type, subType))) { logf (LOG_WARN, "Retrieve: Cannot handle type %s", file_type); return 14; @@ -119,7 +133,72 @@ int zebra_record_fetch (ZebraHandle zh, int sysno, int score, ODR stream, fc.record_int_pos = 0; logf (LOG_DEBUG, "Internal retrieve. %d bytes", fc.record_int_len); } - else +#if ZEBRASDR + else if (*fname == '%') + { + ZebraSdrHandle h; + int segment = 0, r; + char *cp, xname[128]; + unsigned char *buf; + + logf (LOG_DEBUG, "SDR"); + strcpy (xname, fname+1); + if ((cp = strrchr (xname, '.'))) + { + *cp++ = 0; + segment = atoi(cp); + } + h = zebraSdr_open (xname); + if (!h) + { + logf (LOG_WARN, "sdr open %s", xname); + return 0; + } + if (zebraSdr_segment (h, &segment) < 0) + { + logf (LOG_WARN, "zebraSdr_segment fail segment=%d", + segment); + rec_rm (&rec); + return 14; + } + r = zebraSdr_read (h, &buf); + if (r < 1) + { + logf (LOG_WARN, "zebraSdr_read fail segment=%d", + segment); + rec_rm (&rec); + return 14; + } + zebraSdr_close (h); + + fc.record_int_len = recordAttr->recordSize; + fc.record_int_buf = buf + recordAttr->recordOffset; + fc.record_int_pos = 0; + + logf (LOG_LOG, "segment = %d len=%d off=%d", + segment, + recordAttr->recordSize, + recordAttr->recordOffset); + if (fc.record_int_len > 180) + { + logf (LOG_LOG, "%0.70s", fc.record_int_buf); + logf (LOG_LOG, "%0.70s", fc.record_int_buf + + (fc.record_int_len - 70)); + } + else + logf (LOG_LOG, "%0.*s", + fc.record_int_len, fc.record_int_buf); + + /* the following two lines makes rec_rm delete buf */ + rec->size[recInfo_storeData] = r; + rec->info[recInfo_storeData] = buf; + + retrieveCtrl.readf = record_int_read; + retrieveCtrl.seekf = record_int_seek; + retrieveCtrl.tellf = record_int_tell; + } +#endif + else { if ((fc.fd = open (fname, O_BINARY|O_RDONLY)) == -1) {