X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=3ab4d8aa614afb8e056cb3ba37a151fc3f5defe7;hb=10d6601ca574d93bd5534b3a997a6b12305c75bc;hp=2bdadcf96cf40415a09ae21367bc8a2d349f9ad4;hpb=75049be3951292bbbbd53d83ca38ccbd191e4b08;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index 2bdadcf..3ab4d8a 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: retrieve.c,v $ - * Revision 1.2 1998-10-16 08:14:33 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 @@ -27,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; @@ -71,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; @@ -122,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) {