root/trunk/b7x.c

Revision 389, 8.7 kB (checked in by heitor.barbieri, 3 weeks ago)

essage first commit

Line 
1LONGX CIB7::b6_hit(RECSTRU *irecp, LONGX nord, LONGX setno)
2#else /* CICPP */
3LONGX b6_hit(cib6p,irec,nord,setno)                                   /*
4-----------
5                    abenda se vrecp nao inicializado;
6                    abenda se registro irec nao alocado;
7                    abenda se registro irec invalido;
8                    retorna total de hits se nord = 0;
9                    se nord > total de hits
10                        zera hit e mfn correntes e retorna -1;
11                    mantem controles para chamadas subsequentes;
12                    retorna o mfn correspondente ao hit nord
13                    (retorna -2 .. -n se algum erro)
14                                                                      */
15b6_CIB7 *cib6p;
16LONGX irec;             /* indice de vrecp, para info/store */
17LONGX nord;             /* numero de ordem do hit a analisar */
18LONGX setno;            /* query number */
19#endif /* CICPP */
20{
21    RECSTRU *recp;
22    LONGX hits,hcur,hsiz,hmfn;
23    int xdir_hits,xdir_hcur,xdir_hsiz,xdir_hmfn,xdir_hmem;
24    unsigned char *p;
25    char buffup[B7UPLEN+1];       /* area for fldupdat */
26    char filname[CIMPL+1];
27    int fd;
28    LONGX offset,mfn;
29    LONGX by8left,block,lastblock,maxblock;
30    LONGX bufleft,bufsiz,lastbsize;
31    off_t seek;
32    unsigned int toread,nr;
33    int loop,n,delta8,delta1,found;
34
35   /* b6_CIB7 *debug=cib6p; */
36
37#if HITTRACE
38 printf("b6_hit - irec,nord: %"_LD_,%"_LD_" \n",irec,nord);
39#endif
40#if SHOWCORE
41 if (b60trace) showcore("b6_hit");
42#endif
43    strcpy(b6errxy,"b6_hit");          /* b6_hiterr() */
44
45#if CICPP
46    recp=irecp;
47    if (!recp)
48#if CDROM
49        return(-2L);
50#else
51        fatal("b6_hit/recp");
52#endif
53    if (!recp->recmfp)
54#if CDROM
55        return(-3L);
56#else
57        fatal("b6_hit/recmfp");
58#endif
59#else /* CICPP */
60    recp=vrecp[irec];
61    if (!recp)
62#if CDROM
63        return(-3L);
64#else
65        fatal("b6_hit/irec");
66#endif
67#endif /* CICPP */
68
69    if (RECtype != TYPEMFQ || RECrc != RCNORMAL)
70#if CDROM
71        return(-4L);
72#else
73        fatal("b6_hit/check");
74#endif
75
76#if CICPP
77    if ((xdir_hits=irecp->xfieldx(MFQTHITS,1)) < 0)
78#else /* CICPP */
79    if ((xdir_hits=fieldx(irec,MFQTHITS,1)) < 0)
80#endif /* CICPP */
81#if CDROM
82        return(-5L);
83#else
84        fatal("b6_hit/xdir_hits");
85#endif
86
87    for (hits=0, p=(unsigned char *)FIELDP(xdir_hits), loop=DIRlen(xdir_hits); loop--; p++)
88        hits = hits * 10 + (*p - '0');
89    if (nord < 0 || nord > (hits+1))
90#if CDROM
91        return(-6L);
92#else
93        fatal("b6_hit/nord");
94#endif
95
96#if CICPP
97    if ((xdir_hcur=irecp->xfieldx(MFQTHCUR,1)) < 0)
98#else /* CICPP */
99    if ((xdir_hcur=fieldx(irec,MFQTHCUR,1)) < 0)
100#endif /* CICPP */
101#if CDROM
102        return(-7L);
103#else
104        fatal("b6_hit/xdir_hcur");
105#endif
106
107#if CICPP
108    if ((xdir_hmfn=irecp->xfieldx(MFQTHMFN,1)) < 0)
109#else /* CICPP */
110    if ((xdir_hmfn=fieldx(irec,MFQTHMFN,1)) < 0)
111#endif /* CICPP */
112#if CDROM
113        return(-8L);
114#else
115        fatal("b6_hit/xdir_hmfn");
116#endif
117
118#if CICPP
119    if ((xdir_hsiz=irecp->xfieldx(MFQTHSIZ,1)) < 0)
120#else /* CICPP */
121    if ((xdir_hsiz=fieldx(irec,MFQTHSIZ,1)) < 0)
122#endif /* CICPP */
123#if CDROM
124        return(-9L);
125#else
126        fatal("b6_hit/xdir_hsiz");
127#endif
128
129
130    if (nord == 0 || nord > hits) {
131        if (nord == 0)
132            mfn=hits;           /* returning value */
133        else
134            mfn=(-1L);
135    }
136    else {
137        for (hcur=0, p=(unsigned char *)FIELDP(xdir_hcur), loop=DIRlen(xdir_hcur); loop--; p++)
138            hcur = hcur * 10 + (*p - '0');
139        for (hmfn=0, p=(unsigned char *)FIELDP(xdir_hmfn), loop=DIRlen(xdir_hmfn); loop--; p++)
140            hmfn = hmfn * 10 + (*p - '0');
141        for (hsiz=0, p=(unsigned char *)FIELDP(xdir_hsiz), loop=DIRlen(xdir_hsiz); loop--; p++)
142            hsiz = hsiz * 10 + (*p - '0');
143#if HITTRACx
144 printf("b6_hit - rec - hits=%"_LD_" hcur=%"_LD_" hsiz=%"_LD_" hmfn=%"_LD_"\n",
145  hits,hcur,hsiz,hmfn);
146#endif
147        if (hcur == nord)
148            mfn=hmfn;
149        else {
150#if CICPP
151            if ((xdir_hmem=irecp->xfieldx(MFQTHMEM,1)) < 0)
152#else /* CICPP */
153            if ((xdir_hmem=fieldx(irec,MFQTHMEM,1)) < 0)
154#endif /* CICPP */
155#if CDROM
156                return(-10L);
157#else
158                fatal("b6_hit/xdir_hmem");
159#endif
160       if (!b6bufferp)
161#if CICPP
162        b6_hballoc(hsiz,&(b6bufferp));
163            if (b6bufferp->bufsiz <= 0) fatal("b6_hit/bufsiz");
164            if (hcur == 0 || b6bufferp->setno != setno) b6_hbinit(setno,b6bufferp);
165#else /* CICPP */
166        b6_hballoc(cib6p,hsiz,&(b6bufferp));
167            if (b6bufferp->bufsiz <= 0) fatal("b6_hit/bufsiz");
168            if (hcur == 0 || b6bufferp->setno != setno) b6_hbinit(cib6p,setno,b6bufferp);
169#endif /* CICPP */
170            fd=0; found=0;
171            if (nord > hcur) {
172                delta8 =  8; delta1 =  1;
173            }
174            else {
175                delta8 = -8; delta1 = -1;
176            }
177        mfn = (hcur == 0) ? 0 : hmfn+delta1;
178        offset = (mfn/8);
179
180                hsiz = hsiz/8 + 1;
181
182            bufsiz = (b6bufferp->bufsiz <= hsiz) ? b6bufferp->bufsiz : hsiz;
183            block = offset / bufsiz;
184            maxblock = (hsiz-1) / bufsiz;
185            bufleft = (block+1)*bufsiz - offset;
186            p = b6bufferp->area + bufsiz - bufleft;
187            if (nord > hcur) {
188                lastblock = maxblock;
189                lastbsize = hsiz % bufsiz; /* hsiz - (lastblock+1)*bufsiz; */
190                if (lastbsize == 0) lastbsize=bufsiz;
191                by8left = hsiz - offset;
192                if (block == lastblock) bufleft=lastbsize;
193            }
194            else {
195                lastblock = 0;
196                lastbsize = bufsiz;
197                by8left = offset + 1;
198                bufleft = bufsiz - bufleft + 1;
199            }
200            if (bufleft <= 0 || bufleft > bufsiz) fatal("b6_hit/bufleft");
201            if (lastbsize <= 0 || lastbsize>bufsiz) fatal("b6_hit/lastbsize");
202            if (b6bufferp->block != block) {
203                memcpy(filname,FIELDP(xdir_hmem),n=DIRlen(xdir_hmem));
204                filname[n]='\0';
205                fd=dbxopen(b6_gidbnp,filname,"");
206                seek=block*bufsiz;
207                if (LSEEK64(fd,seek,SEEK_SET) != seek) fatal("b6_hit/lseek");
208                toread = (block == lastblock) ? lastbsize : bufsiz;
209                nr=(unsigned)CIREAD(fd,b6bufferp->area,toread);
210                if (nr != toread) fatal("b6_hit/read/1");
211                b6bufferp->block = block;
212#if HITTRACx
213 printf("b6_hit - left/1=%"_LD_"/%"_LD_" hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" block=%"_LD_"=%d",
214  by8left,bufleft,hcur,nord,mfn,block,nr);
215 for (n=0; n < nr; n++) printf(" %02x",bufferp->area[n]);
216 printf("\n");
217#endif
218            }
219            for (; by8left--; p+=delta1) {
220                if (!bufleft--) {
221                    block+=delta1;
222                    if (block < 0 || block > maxblock) fatal("b6_hit/block");
223                }
224#if HITTRACx
225 printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" hmfn=%"_LD_" left=%"_LD_"/%"_LD_"
226block=%"_LD_"\n",
227  hcur,nord,mfn,hmfn,by8left,bufleft,block);
228#endif
229                if (b6bufferp->block != block) {
230                    if (fd == 0) {
231                        memcpy(filname,FIELDP(xdir_hmem),n=DIRlen(xdir_hmem));
232                        filname[n]='\0';
233                        fd=dbxopen(b6_gidbnp,filname,"");
234                    }
235                    seek=block*bufsiz;
236                    if (LSEEK64(fd,seek,SEEK_SET) != seek) fatal("b6_hit/lseek");
237                    toread = (block == lastblock) ? lastbsize : bufsiz;
238                    nr=(unsigned)CIREAD(fd,b6bufferp->area,toread);
239                    if (nr != toread) fatal("b6_hit/read/2");
240                    b6bufferp->block = block;
241                    bufleft = bufsiz;
242                    if (block == lastblock) bufleft=lastbsize;
243                    if (nord > hcur)
244                        p = b6bufferp->area;
245                    else
246                        p = b6bufferp->area + (bufsiz - 1);
247#if HITTRACx
248 printf("b6_hit - left/2=%"_LD_"/%"_LD_" hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" block=%"_LD_"=%d",
249  by8left,bufleft,hcur,nord,mfn,block,nr);
250 for (n=0; n < nr; n++) printf(" %02x",b6bufferp->area[n]);
251 printf("\n");
252#endif
253                    bufleft--;
254                }
255                if (!*p) {
256                    mfn+=delta8;
257#if HITTRACx
258 printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x - continue\n",
259  hcur,nord,mfn,*p);
260#endif
261                }
262                else {
263                    if (nord > hcur)
264                        loop = 8 - (mfn&BY8RMASK);
265                    else
266                        loop = (mfn&BY8RMASK) + 1;
267                    for (; loop--; mfn+=delta1) {
268                        n=mfn&BY8RMASK;
269#if HITTRACx
270 printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x loop=%d n=%d\n",
271  hcur,nord,mfn,*p,loop,n);
272#endif
273                        if (*p & bitmask[n]) {
274                            hmfn=mfn; hcur+=delta1;
275                            if (nord == hcur) {
276                                found=1;
277                                by8left=0; /* break */
278                                break;
279                            }
280                        }
281                    }
282                }
283            } /* end for by8left */
284            if (!found) fatal("b6_hit/found");
285
286            if (fd) CLOSE(fd);
287
288            /* store */
289            sprintf(buffup,B7EDIT1,hcur);
290            memcpy(FIELDP(xdir_hcur),buffup,B7UPLEN);
291            sprintf(buffup,B7EDIT1,hmfn);
292            memcpy(FIELDP(xdir_hmfn),buffup,B7UPLEN);
293
294         } /* end else hcur == nord */
295
296   } /* end else nord == 0 || nord > hits */
297
298#if HITTRACE
299 printf("b6_hit - mfn: %"_LD_"\n",mfn);
300#endif
301#if SHOWCORE
302 if (b60trace) showcore("b6_hit - exit");
303#endif
304    return(mfn);
305}
Note: See TracBrowser for help on using the browser.