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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  fltrel.c  - Relation  Filteration
  3.  *              Kernel of GNU SQL-server 
  4.  *
  5.  * This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: fltrel.c,v 1.246 1997/04/10 06:57:28 vera Exp $ */
  29. #include "xmem.h"
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. extern struct des_nseg desnseg;
  34. extern char **scptab;
  35. static u2_t inpn;
  36. static char *outasp;
  37. static struct A inpage, inflpage;
  38. static void
  39. put_crt (struct A *outpg, char *cort, struct des_tob *dt, struct des_field *df,
  40.          u2_t fdf, u2_t fn, u2_t fln, u2_t * fl)
  41. {
  42.   char *a, *b;
  43.   u2_t size, scsz, sz;
  44.   u2_t k, kk, fnk;
  45.   char *val, *aval;
  46.   char *arrpnt[BD_PAGESIZE];
  47.   u2_t arrsz[BD_PAGESIZE];
  48.   tuple_break (cort, arrpnt, arrsz, df, fdf, fn);
  49.   aval = val = cort + scscal (cort);
  50.   for (size = 1, k = 0, kk = 0; kk < fln; kk++)
  51.     {
  52.       fnk = fl[kk];
  53.       size += arrsz[fnk];
  54.       k++;
  55.       if (k == 7)
  56. k = 0;
  57.     }
  58.   if (size == 1)
  59.     return;
  60.   scsz = k / 7;
  61.   if (k % 7 != 0)
  62.     scsz++;
  63.   size += scsz;
  64.   cort = a = getloc (outpg, size, dt);
  65.   b = a + scsz + 1;
  66.   for (k = 0, kk = 0, *a++ = CORT; kk < fln; kk++)
  67.     {
  68.       fnk = fl[kk];
  69.       if ((sz = arrsz[fnk]) != 0)
  70. {
  71.           bcopy (arrpnt[fnk], b, sz);
  72.           b += sz;
  73.   *a |= BITVL(k); /* a value is present */
  74. }
  75.       k++;
  76.       if (k == 7)
  77. {
  78.   k = 0;
  79.   *(++a) = 0;
  80. }
  81.     }
  82.   if (k == 0)
  83.     a--;
  84.   *a |= EOSC;
  85.   return;
  86. }
  87. struct ans_ctob
  88. rflrel (struct id_rel *pidrel, u2_t fln, u2_t *fl, u2_t slsz, char *sc)
  89. {
  90.   u2_t fn, fdf, *ali, sn, pn, *afi, *ai, i;
  91.   struct des_field *df, *dftr;
  92.   i2_t n;
  93.   struct des_tob *dt;
  94.   struct des_trel *destrel;
  95.   char *asp = NULL;
  96.   struct ans_ctob ans;
  97.   char *arrpnt[BD_PAGESIZE];
  98.   u2_t arrsz[BD_PAGESIZE];
  99.   struct A outpg;
  100.   sn = pidrel->urn.segnum;
  101.   if (sn == NRSNUM)
  102.     {
  103.       struct des_trel *dtrin;
  104.       char *tuple;
  105.       
  106.       n = pidrel->urn.obnum;
  107.       if ((u2_t) n > desnseg.mtobnum)
  108. {
  109.   ans.cpncob = NIOB;
  110.   return (ans);
  111. }
  112.       dtrin = (struct des_trel *) * (desnseg.tobtab + n);
  113.       if (dtrin == NULL)
  114. {
  115.   ans.cpncob = NIOB;
  116.   return (ans);
  117. }
  118.       if (((struct prtob *) dtrin)->prob != TREL)
  119. {
  120.   ans.cpncob = NIOB;
  121.   return (ans);
  122. }
  123.       fn = dtrin->fieldn;
  124.       fdf = dtrin->fdftr;
  125.       df = (struct des_field *) (dtrin + 1);
  126.       if ((ans.cpncob = testcond (df, fn, fdf, fln, fl, &slsz, sc, 0, NULL)) != OK)
  127. return (ans);
  128.       dt = gettob (&outpg, dtrsize + fln * rfsize, &n, TREL);
  129.       outasp = outpg.p_shm;
  130.       destrel = (struct des_trel *) dt;
  131.       dftr = (struct des_field *) (destrel + 1);
  132.       pn = dtrin->tobtr.firstpn;
  133.       for (; pn != (u2_t) ~ 0;)
  134. {
  135.   asp = getwl (&inpage, sn, pn);
  136.   afi = (u2_t *) (asp + phtrsize);
  137.   ali = afi + ((struct p_h_tr *) asp)->linptr;
  138.   for (ai = afi; ai <= ali; ai++)
  139.     if (*ai != 0)
  140.               {
  141.                 tuple = asp + *ai;
  142.                 if (tstcsel (df, fn, fdf, slsz, sc, tuple, arrpnt, arrsz) != 0)
  143.                   put_crt (&outpg, tuple, dt, df, fdf, fn, fln, fl);
  144.               }
  145.   pn = ((struct listtob *) asp)->nextpn;
  146.   putwul (&inpage, 'n');
  147. }
  148.       if (dtrin->tobtr.prdt.prob == SORT)
  149. {
  150.           u2_t kn, k1, k2, j, *ks, *ksort;
  151.           
  152.   ksort = (u2_t *) (df + fn);
  153.   ks = (u2_t *) (dftr + fln);
  154.           kn = dtrin->keysntr;
  155.   for (k1 = 0, k2 = 0, i = 0, j = 0; j < fln && k1 < kn; i++)
  156.     if (i == fl[j])
  157.       {
  158. if (i == ksort[k1])
  159.   ks[k2++] = ksort[k1++];
  160. j++;
  161.       }
  162.     else if (i == k1)
  163.       k1++;
  164.   if (k2 != 0)
  165.     {
  166.       dt->prdt.prsort = SORT;
  167.       destrel->keysntr = k2;
  168.     }
  169. }
  170.     }
  171.   else
  172.     {
  173.       struct d_r_t *desrel;
  174.       struct d_sc_i *scind;
  175.       struct ldesscan *disc;
  176.       i4_t rep;
  177.       i2_t num;
  178.       u2_t size;
  179.       
  180.       if ((ans.cpncob = contir (pidrel, &desrel)) != OK)
  181. return (ans);
  182.       fn = desrel->desrbd.fieldnum;
  183.       fdf = desrel->desrbd.fdfnum;
  184.       df = (struct des_field *) (desrel + 1);
  185.       if ((ans.cpncob = testcond (df, fn, fdf, fln, fl, &slsz, sc, 0, NULL)) != OK)
  186. return (ans);
  187.       if ((ans.cpncob = synlsc (RSC, pidrel, sc, slsz, fn, (u2_t *) NULL)) != 0)
  188. return (ans);
  189.       dt = gettob (&outpg, dtrsize + fln * rfsize, &n, TREL);
  190.       outasp = outpg.p_shm;
  191.       destrel = (struct des_trel *) dt;
  192.       dftr = (struct des_field *) (destrel + 1);
  193.       scind = rel_scan (sn, pidrel->urn.obnum, (char *) desrel, &num,
  194. 0, NULL, NULL, 0, 0, NULL);
  195.       disc = &scind->dessc;
  196.       rep = fgetnext (disc, &pn, &size, FASTSCAN);
  197.       for (; rep != EOI;)
  198. {
  199.   while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  200.   afi = (u2_t *) (asp + phsize);
  201.   ali = afi + ((struct page_head *) asp)->lastin;
  202.   for (ai = afi; ai <= ali; ai++)
  203.     if (*ai != 0 && CHECK_PG_ENTRY(ai) &&
  204.                 fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  205.       put_crt (&outpg, asp + *ai, dt, df, fdf, fn, fln, fl);
  206.   putpg (&inpage, 'n');
  207.   rep = getnext (disc, &pn, &size, FASTSCAN);
  208. }
  209.       destrel->keysntr = 0;
  210.       delscan (num);
  211.     }
  212.   putwul (&outpg, 'm');
  213.   destrel->fieldn = fln;
  214.   destrel->fdftr = 0;
  215.   for (i = 0; i < fln; i++)
  216.     *dftr++ = df[fl[i]];
  217.   ans.idob.segnum = NRSNUM;
  218.   ans.idob.obnum = n;
  219.   return (ans);
  220. }
  221. struct ans_ctob
  222. rflind (struct id_ind *pidind, u2_t fln, u2_t *fl, u2_t slsz, char *sc, u2_t diasz, char *diasc)
  223. {
  224.   struct d_r_t *desrel;
  225.   u2_t fn, fdf, ind, size, i, j, k1, k2;
  226.   struct des_field *df, *dftr;
  227.   struct des_tid tid;
  228.   u2_t sn, pn, *ai, *kind, *ks, kn, dscsz;
  229.   struct des_tob *dt;
  230.   struct des_trel *destrel;
  231.   struct id_rel *pidrel;
  232.   struct ldesind *di;
  233.   struct d_sc_i *scind;
  234.   struct ldesscan *disc;
  235.   char *asp = NULL, **t;
  236.   i2_t scnum, n;
  237.   struct ans_ctob ans;
  238.   i4_t rep;
  239.   struct A outpg;
  240.   pidrel = &pidind->irii;
  241.   sn = pidrel->urn.segnum;
  242.   if (sn == NRSNUM)
  243.     {
  244.       ans.cpncob = NIOB;
  245.       return (ans);
  246.     }
  247.   if ((ans.cpncob = cont_id (pidind, &desrel, &di)) != OK)
  248.     return (ans);
  249.   fn = desrel->desrbd.fieldnum;
  250.   fdf = desrel->desrbd.fdfnum;
  251.   df = (struct des_field *) (desrel + 1);
  252.   if (testcond (df, fn, fdf, fln, fl, &slsz, sc, 0, NULL) != OK)
  253.     {
  254.       ans.cpncob = NCF;
  255.       return (ans);
  256.     }
  257.   kind = (u2_t *) (di + 1);
  258.   if ((ans.cpncob = testdsc (desrel, &diasz, diasc, kind, &dscsz)) != OK)
  259.     return (ans);
  260.   if ((ans.cpncob = synlsc (RSC, pidrel, sc, slsz, fn, (u2_t *) NULL)) != 0)
  261.     return (ans);
  262.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  263.   if ((ans.cpncob = synlsc (RSC, pidrel, diasc, diasz, kn, kind)) != OK)
  264.     return (ans);
  265.   scind = (struct d_sc_i *) lusc (&scnum, scisize, (char *) di, SCI, RSC, fln, fl,
  266.   sc, slsz, 0, NULL, diasz + size2b);
  267.   disc = &scind->dessc;
  268.   disc->curlpn = (u2_t) ~ 0;
  269.   asp = (char *) scind + scisize + slsz + size2b;
  270.   disc->dpnsc = asp;
  271.   t2bpack (diasz, asp);
  272.   disc->dpnsval = asp + size2b + dscsz;
  273.   bcopy (diasc, asp + size2b, diasz);
  274.   di->oscni++;
  275.   size = dtrsize + fln * rfsize;
  276.   dt = gettob (&outpg, size, &n, TREL);
  277.   outasp = outpg.p_shm;
  278.   destrel = (struct des_trel *) dt;
  279.   destrel->fieldn = fln;
  280.   destrel->fdftr = 0;
  281.   dftr = (struct des_field *) (destrel + 1);
  282.   for (i = 0; i < fln; i++)
  283.     *dftr++ = df[fl[i]];
  284.   if ((rep=ind_ftid (disc, &tid,FASTSCAN)) != EOI)
  285.     {
  286.       inpn = tid.tpn;
  287.       while ((asp = getpg (&inpage, sn, inpn, 's')) == NULL);
  288.     }  
  289.   for( ; rep != EOI; rep = ind_tid (disc, &tid, FASTSCAN) )
  290.     {
  291.       pn = tid.tpn;
  292.       ind = tid.tindex;
  293.       if (pn != inpn)
  294. {
  295.   putpg (&inpage, 'n');
  296.           while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  297.         }
  298.       ai = (u2_t *) (asp + phsize) + ind;;
  299.       if (*ai != 0 &&
  300.           fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  301. put_crt (&outpg, asp + *ai, dt, df, fdf, fn, fln, fl);
  302.     }
  303.   t = scptab + scnum;
  304.   xfree ((void *) *t);
  305.   *t = NULL;
  306.   ks = (u2_t *) (dftr + fln);
  307.   for (k1 = 0, k2 = 0, i = 0, j = 0; j < fln && k1 < kn; i++)
  308.     if (i == fl[j])
  309.       {
  310. if (i == kind[k1])
  311.   ks[k2++] = kind[k1++];
  312. j++;
  313.       }
  314.     else if (i == k1)
  315.       k1++;
  316.   if (k2)
  317.     {
  318.       dt->prdt.prsort = SORT;
  319.       destrel->keysntr = k2;
  320.     }
  321.   putwul (&outpg, 'm');
  322.   delscan (scnum);
  323.   ans.idob.segnum = NRSNUM;
  324.   ans.idob.obnum = n;
  325.   return (ans);
  326. }
  327. struct ans_ctob
  328. rflflt (u2_t idfl, u2_t fln, u2_t * fl, u2_t slsz, char *sc)
  329. {
  330.   struct d_r_t *desrel;
  331.   struct des_tid *tid, *tidb;
  332.   u2_t fn, fdf;
  333.   struct des_field *df, *dftr;
  334.   struct des_fltr *desfl;
  335.   struct des_trel *destrel;
  336.   u2_t sn, fpn, pn, *afi, *ai, off, oldpn, flpn, k;
  337.   i2_t n;
  338.   struct des_tob *dt;
  339.   char *asp = NULL, *aspfl;
  340.   struct ans_ctob ans;
  341.   struct A outpg;
  342.   if ((u2_t) idfl > desnseg.mtobnum)
  343.     {
  344.       ans.cpncob = NIOB;
  345.       return (ans);
  346.     }
  347.   desfl = (struct des_fltr *) * (desnseg.tobtab + idfl);
  348.   if (desfl == NULL)
  349.     {
  350.       ans.cpncob = NIOB;
  351.       return (ans);
  352.     }    
  353.   if (((struct prtob *) desfl)->prob != FLTR)
  354.     {
  355.       ans.cpncob = NIOB;
  356.       return (ans);
  357.     }
  358.   desrel = desfl->pdrtf;
  359.   sn = desrel->segnr;
  360.   fn = desrel->desrbd.fieldnum;
  361.   fdf = desrel->desrbd.fdfnum;
  362.   df = (struct des_field *) (desrel + 1);
  363.   if (testcond (df, fn, fdf, fln, fl, &slsz, sc, 0, NULL) != OK)
  364.     {
  365.       ans.cpncob = NCF;
  366.       return (ans);
  367.     }
  368.   dt = gettob (&outpg, dtrsize + fln * rfsize, &n, TREL);
  369.   outasp = outpg.p_shm;
  370.   destrel = (struct des_trel *) dt;
  371.   destrel->fieldn = fln;
  372.   destrel->fdftr = 0;
  373.   dftr = (struct des_field *) (destrel + 1);
  374.   for (k = 0; k < fln; k++)
  375.     *dftr++ = df[fl[k]];
  376.   fpn = desfl->tobfl.firstpn;
  377.   for (flpn = fpn; flpn != (u2_t) ~ 0;)
  378.     {
  379.       aspfl = getwl (&inflpage, NRSNUM, flpn);
  380.       off = ((struct p_h_f *) aspfl)->freeoff;
  381.       tid = (struct des_tid *) (aspfl + phfsize);
  382.       oldpn = tid->tpn;
  383.       if (sn != NRSNUM)
  384. while ((asp = getpg (&inpage, sn, oldpn, 's')) == NULL);
  385.       else
  386. asp = getwl (&inpage, sn, oldpn);
  387.       afi = (u2_t *) (asp + phsize);
  388.       tidb = (struct des_tid *) (aspfl + off);
  389.       for (; tid < tidb; tid++)
  390. {
  391.   pn = tid->tpn;
  392.   if (oldpn != pn)
  393.     {
  394.       if (sn != NRSNUM)
  395. {
  396.   putpg (&inpage, 'n');
  397.   while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  398. }
  399.       else
  400. {
  401.   putwul (&inpage, 'n');
  402.   asp = getwl (&inpage, sn, pn);
  403. }
  404.       oldpn = pn;
  405.       afi = (u2_t *) (asp + phsize);
  406.     }
  407.   ai = afi + tid->tindex;
  408.   if (*ai != 0)
  409.     put_crt (&outpg, asp + *ai, dt, df, fdf, fn, fln, fl);
  410. }
  411.       flpn = ((struct listtob *) aspfl)->nextpn;
  412.       putwul (&inflpage, 'n');
  413.     }
  414.   putwul (&outpg, 'm');
  415.   if (desfl->tobfl.prdt.prsort == SORT && destrel->keysntr == 0)
  416.     dt->prdt.prsort = SORT;
  417.   ans.cpncob = OK;
  418.   ans.idob.segnum = NRSNUM;
  419.   ans.idob.obnum = n;
  420.   return (ans);
  421. }