X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=5e2ed207f68e9cd8fa3ef368be544134083a9e79;hb=9252c3f4231f9f3226326ce1360f055bad48b8d1;hp=f138bbf26e894a860293b7cfb0d2f8851b32237c;hpb=ce3907338568fce46c5751e7e1091a5ad1c8e291;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index f138bbf..5e2ed20 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -1,10 +1,31 @@ /* - * Copyright (C) 1995-1998, Index Data I/S + * Copyright (C) 1995-1999, 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.8 1999-03-09 16:27:49 adam + * More work on SDRKit integration. + * + * Revision 1.7 1999/03/02 16:15:43 quinn + * Added "tagsysno" and "tagrank" directives to zebra.cfg. + * + * Revision 1.6 1999/02/18 15:01:25 adam + * Minor changes. + * + * Revision 1.5 1999/02/17 11:29:56 adam + * Fixed in record_fetch. Minor updates to API. + * + * Revision 1.4 1999/02/02 14:51:07 adam + * Updated WIN32 code specific sections. Changed header. + * + * 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. * @@ -14,7 +35,7 @@ #include #include -#ifdef WINDOWS +#ifdef WIN32 #include #include #else @@ -24,6 +45,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 +97,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 +130,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 +148,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, "%.70s", fc.record_int_buf); + logf (LOG_LOG, "%.70s", fc.record_int_buf + + (fc.record_int_len - 70)); + } + else + logf (LOG_LOG, "%.*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) { @@ -145,6 +239,7 @@ int zebra_record_fetch (ZebraHandle zh, int sysno, int score, ODR stream, retrieveCtrl.comp = comp; retrieveCtrl.diagnostic = 0; retrieveCtrl.dh = zh->dh; + retrieveCtrl.res = zh->res; (*rt->retrieve)(&retrieveCtrl); *output_format = retrieveCtrl.output_format; *rec_bufp = retrieveCtrl.rec_buf;