blfltr.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:8k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * blfltr.c  - building of a filter by a DB table,
  3.  *              by a DB table index, by a filter
  4.  *              Kernel of GNU SQL-server 
  5.  *
  6.  * This file is a part of GNU SQL Server
  7.  *
  8.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  9.  *  Developed at the Institute of System Programming
  10.  *  This file is written by  Vera Ponomarenko
  11.  *
  12.  *  This program is free software; you can redistribute it and/or modify
  13.  *  it under the terms of the GNU General Public License as published by
  14.  *  the Free Software Foundation; either version 2 of the License, or
  15.  *  (at your option) any later version.
  16.  *
  17.  *  This program is distributed in the hope that it will be useful,
  18.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  *  GNU General Public License for more details.
  21.  *
  22.  *  You should have received a copy of the GNU General Public License
  23.  *  along with this program; if not, write to the Free Software
  24.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  25.  *
  26.  *  Contacts:   gss@ispras.ru
  27.  *
  28.  */
  29. /* $Id: blfltr.c,v 1.247 1997/04/17 11:03:20 vera Exp $ */
  30. #include "xmem.h"
  31. #include "destrn.h"
  32. #include "strml.h"
  33. #include "fdcltrn.h"
  34. extern char **scptab;
  35. extern struct des_nseg desnseg;
  36. struct ans_ctob
  37. blflrl (struct id_rel *pidrel, u2_t slsz, char *sc, u2_t kn, u2_t *fsrt)
  38. {
  39.   u2_t fn, fdf, *ali, sn, ind, pn, *ai, sz;
  40.   struct des_fltr *desfltr;
  41.   struct des_field *df;
  42.   char *asp = NULL;
  43.   i2_t n, nsc;
  44.   struct ans_ctob ans;
  45.   struct d_r_t *desrel;
  46.   struct des_tid tid;
  47.   struct prtob *pr;
  48.   struct A inpage;
  49.   i4_t rep;
  50.   struct d_sc_i *scind;
  51.   struct ldesscan *disc;
  52.   CPNM cpn;
  53.   struct A outpg;
  54.   sn = pidrel->urn.segnum;
  55.   if (sn == NRSNUM)
  56.     {
  57.       ans.cpncob = NIOB;
  58.       return (ans);
  59.     }
  60.   if ((ans.cpncob = contir (pidrel, &desrel)) != OK)
  61.     return (ans);
  62.   fn = desrel->desrbd.fieldnum;
  63.   fdf = desrel->desrbd.fdfnum;
  64.   df = (struct des_field *) (desrel + 1);
  65.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  66.     {
  67.       ans.cpncob = NCF;
  68.       return (ans);
  69.     }
  70.   if ((cpn = synlsc (RSC, pidrel, sc, slsz, fn, NULL)) != 0)
  71.     {
  72.       ans.cpncob = cpn;
  73.       return (ans);
  74.     }
  75.   desfltr = (struct des_fltr *) gettob (&outpg, dflsize + slsz, &n, FLTR);
  76.   desfltr->pdrtf = desrel;
  77.   desfltr->selszfl = slsz;
  78.   bcopy (sc, (char *) (desfltr + 1), slsz);
  79.   scind = rel_scan (sn, pidrel->urn.obnum, (char *) desrel, &nsc,
  80.     0, NULL, NULL, 0, 0, NULL);
  81.   disc = &scind->dessc;
  82.   rep = fgetnext (disc, &pn, &sz, FASTSCAN);
  83.   while (rep != EOI)
  84.     {
  85.       while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  86.       ai = (u2_t *) (asp + phsize);
  87.       ali = ai + ((struct page_head *) asp)->lastin;
  88.       for (ind = 0; ai <= ali; ai++, ind++)
  89. if (*ai != 0 && CHECK_PG_ENTRY(ai)
  90.             && fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  91.   {
  92.     tid.tpn = pn;
  93.     tid.tindex = ind;
  94.     minsfltr (&outpg, (struct des_tob *) desfltr, &tid);
  95.   }
  96.       putpg (&inpage, 'n');
  97.       rep = getnext (disc, &pn, &sz, FASTSCAN);
  98.     }
  99.   putwul (&outpg, 'm');
  100.   delscan (nsc);
  101.   srtr_tid ((struct des_tob *)desfltr);
  102.   desfltr->selszfl = slsz;
  103.   pr = &desfltr->tobfl.prdt;
  104.   pr->prsort = SORT;
  105.   pr->prdbl = NODBL;
  106.   pr->prdrctn = GROW;
  107.   ans.idob.segnum = NRSNUM;
  108.   ans.idob.obnum = n;
  109.   return (ans);
  110. }
  111. struct ans_ctob
  112. blflin (struct id_ind *pidind, u2_t slsz, char *sc,
  113.         u2_t diasz, char *diasc, u2_t kn, u2_t *fsrt)
  114. {
  115.   u2_t fn, fdf, sn, pn, oldpn, *afi, *ai, dscsz, kind;
  116.   struct des_fltr *desfltr;
  117.   i4_t rep, index;
  118.   char *asp = NULL;
  119.   struct des_field *df;
  120.   struct des_tid tid;
  121.   struct id_rel *pidrel;
  122.   struct ldesind *di;
  123.   struct d_sc_i *scind;
  124.   struct ldesscan *disc;
  125.   i2_t n, nf;
  126.   struct ans_ctob ans;
  127.   struct d_r_t *desrel;
  128.   struct prtob *pr;
  129.   struct A inpage, outpg;
  130.   CPNM cpn;
  131.   pidrel = &pidind->irii;
  132.   index = pidind->inii;
  133.   sn = pidrel->urn.segnum;
  134.   if (sn == NRSNUM)
  135.     {
  136.       ans.cpncob = NIOB;
  137.       return (ans);
  138.     }
  139.   if ((ans.cpncob = cont_id (pidind, &desrel, &di)) != OK)
  140.     return (ans);
  141.   fn = desrel->desrbd.fieldnum;
  142.   fdf = desrel->desrbd.fdfnum;
  143.   df = (struct des_field *) (desrel + 1);
  144.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  145.     {
  146.       ans.cpncob = NCF;
  147.       return (ans);
  148.     }
  149.   ai = (u2_t *) (di + 1);
  150.   if ((ans.cpncob = testdsc (desrel, &diasz, diasc, ai, &dscsz)) != OK)
  151.     return (ans);
  152.   if ((cpn = synlsc (RSC, pidrel, sc, slsz, fn, NULL)) != 0)
  153.     {
  154.       ans.cpncob = cpn;
  155.       return (ans);
  156.     }
  157.   kind = di->ldi.kifn & ~UNIQ & MSK21B;
  158.   if ((ans.cpncob = synlsc (RSC, pidrel, diasc, diasz, kind, ai)) != OK)
  159.     return (ans);
  160.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di, SCI, RSC, 0,
  161.                                   NULL, sc, slsz, 0, NULL, diasz + size2b);
  162.   disc = &scind->dessc;
  163.   disc->curlpn = (u2_t) ~ 0;
  164.   asp = (char *) scind + scisize + slsz + size2b;
  165.   if (diasz == 0)
  166.     disc->dpnsc = NULL;
  167.   else
  168.     disc->dpnsc = asp;
  169.   t2bpack (diasz, asp);
  170.   disc->dpnsval = asp + size2b + dscsz;
  171.   bcopy (diasc, asp + size2b, diasz);
  172.   desfltr = (struct des_fltr *) gettob (&outpg, dflsize + slsz, &nf, FLTR);
  173.   desfltr->pdrtf = desrel;
  174.   bcopy (sc, (char *) (desfltr + 1), slsz);
  175.   if ((rep = ind_ftid (disc, &tid, FASTSCAN)) != EOI)
  176.     {
  177.       oldpn = tid.tpn;
  178.       while ((asp = getpg (&inpage, sn, oldpn, 's')) == NULL);
  179.       afi = (u2_t *) (asp + phsize);      
  180.     }
  181.   else
  182.     {
  183.       ans.cpncob = EMFL;
  184.       putpg (&inpage, 'n');
  185.       goto m1;
  186.     }
  187.   for (; rep != EOI; rep = ind_tid (disc, &tid, FASTSCAN))
  188.     {
  189.       pn = tid.tpn;
  190.       if (oldpn != pn)
  191. {
  192.   putpg (&inpage, 'n');
  193.   while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  194.           afi = (u2_t *) (asp + phsize);
  195.   oldpn = pn;
  196. }
  197.       ai = afi + tid.tindex;
  198.       if (*ai != 0 &&
  199.           fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  200. minsfltr (&outpg, (struct des_tob *) desfltr, &tid);
  201.     }
  202.   putpg (&inpage, 'n');
  203. m1:
  204.   putwul (&outpg, 'm');
  205.   delscan (n);
  206.   srtr_tid ((struct des_tob *)desfltr);
  207.   desfltr->selszfl = slsz;
  208.   pr = &desfltr->tobfl.prdt;
  209.   pr->prsort = SORT;
  210.   pr->prdbl = NODBL;
  211.   pr->prdrctn = GROW;
  212.   ans.idob.segnum = NRSNUM;
  213.   ans.idob.obnum = nf;
  214.   return (ans);
  215. }
  216. struct ans_ctob
  217. blflfl (i4_t idfl, u2_t slsz, char *sc, u2_t kn, u2_t *fsrt)
  218. {
  219.   u2_t fn, fdf, sn, pn, oldpn, flpn, off, *afi, *ai;
  220.   struct des_fltr *desfltr, *desfl;
  221.   char *aspfl, *asp = NULL;
  222.   struct des_field *df;
  223.   struct des_tid *tid, *last_tid;
  224.   i2_t n;
  225.   struct ans_ctob ans;
  226.   struct d_r_t *desrel;
  227.   struct prtob *pr;
  228.   struct A inpage, inflpg, outpg;
  229.   if ((u2_t) idfl > desnseg.mtobnum)
  230.     {
  231.       ans.cpncob = NIOB;
  232.       return (ans);
  233.     }
  234.   desfl = (struct des_fltr *) * (desnseg.tobtab + idfl);
  235.   if (desfl == NULL)
  236.     {
  237.       ans.cpncob = NIOB;
  238.       return (ans);
  239.     }    
  240.   if (((struct prtob *) desfl)->prob != FLTR)
  241.     {
  242.       ans.cpncob = NIOB;
  243.       return (ans);
  244.     }
  245.   desrel = desfl->pdrtf;
  246.   sn = desrel->segnr;
  247.   if (sn == NRSNUM)
  248.     {
  249.       ans.cpncob = NIOB;
  250.       return (ans);
  251.     }
  252.   fn = desrel->desrbd.fieldnum;
  253.   fdf = desrel->desrbd.fdfnum;
  254.   df = (struct des_field *) (desrel + 1);
  255.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  256.     {
  257.       ans.cpncob = NCF;
  258.       return (ans);
  259.     }
  260.   desfltr = (struct des_fltr *) gettob (&outpg, dflsize + slsz, &n, FLTR);
  261.   desfltr->pdrtf = desrel;
  262.   
  263.   bcopy (sc, (char *) (desfltr + 1), slsz);
  264.   for (flpn = desfl->tobfl.firstpn; flpn != (u2_t) ~ 0;)
  265.     {
  266.       aspfl = getwl (&inflpg, NRSNUM, flpn);
  267.       off = ((struct p_h_f *) aspfl)->freeoff;
  268.       tid = (struct des_tid *) (aspfl + phfsize);
  269.       oldpn = tid->tpn;
  270.       while ((asp = getpg (&inpage, sn, oldpn, 's')) == NULL);
  271.       afi = (u2_t *) (asp + phsize);
  272.       last_tid = (struct des_tid *) (aspfl + off);
  273.       for (; tid < last_tid; tid++)
  274. {
  275.   pn = tid->tpn;
  276.   if (oldpn != pn)
  277.     {
  278.       putpg (&inpage, 'n');
  279.       while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  280.       afi = (u2_t *) (asp + phsize);
  281.       oldpn = pn;
  282.     }
  283.   ai = afi + tid->tindex;
  284.   if (*ai != 0 &&
  285.               fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  286.     minsfltr (&outpg, (struct des_tob *) desfltr, tid);
  287. }
  288.       flpn = ((struct p_h_f *) aspfl)->listfl.nextpn;
  289.       putwul (&inflpg, 'n');
  290.     }
  291.   putpg (&inpage, 'n');
  292.   putwul (&outpg, 'm');
  293.   srtr_tid ((struct des_tob *)desfltr);
  294.   desfltr->selszfl = slsz;
  295.   pr = &desfltr->tobfl.prdt;
  296.   pr->prsort = SORT;
  297.   pr->prdbl = NODBL;
  298.   pr->prdrctn = GROW;
  299.   ans.idob.segnum = NRSNUM;
  300.   ans.idob.obnum = n;
  301.   return (ans);
  302. }