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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * cnttab.c  - calculation of a number of DB table rows
  3.  *             on basis  of scanning of this DB table
  4.  *             by itself, by some index, by some filter
  5.  *              Kernel of GNU SQL-server 
  6.  *
  7.  * This file is a part of GNU SQL Server
  8.  *
  9.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  10.  *  Developed at the Institute of System Programming
  11.  *  This file is written by  Vera Ponomarenko
  12.  *
  13.  *  This program is free software; you can redistribute it and/or modify
  14.  *  it under the terms of the GNU General Public License as published by
  15.  *  the Free Software Foundation; either version 2 of the License, or
  16.  *  (at your option) any later version.
  17.  *
  18.  *  This program is distributed in the hope that it will be useful,
  19.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  *  GNU General Public License for more details.
  22.  *
  23.  *  You should have received a copy of the GNU General Public License
  24.  *  along with this program; if not, write to the Free Software
  25.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26.  *
  27.  *  Contacts:   gss@ispras.ru
  28.  *
  29.  */
  30. /* $Id: cnttab.c,v 1.246 1997/04/10 06:57:28 vera Exp $ */
  31. #include "xmem.h"
  32. #include "destrn.h"
  33. #include "strml.h"
  34. #include "agrflg.h"
  35. #include "fdcltrn.h"
  36. extern struct des_nseg desnseg;
  37. void
  38. cntttab (struct ans_cnt *ans, struct id_rel *pidrel, u2_t condsz, char *cond)
  39. {
  40.   struct des_field *df;
  41.   u2_t fn, fdf, *ali, sn, pn, *ai, size;
  42.   i4_t rep, cntnum = 0;
  43.   struct d_r_t *desrel;
  44.   struct d_sc_i *scind;
  45.   struct ldesscan *disc;
  46.   i2_t num;
  47.   char *asp = NULL;
  48.   struct A pg;
  49.   if ((ans->cpncnt = contir (pidrel, &desrel)) != OK)
  50.     return;
  51.   fn = desrel->desrbd.fieldnum;
  52.   fdf = desrel->desrbd.fdfnum;
  53.   df = (struct des_field *) (desrel + 1);
  54.   if ((ans->cpncnt = testcond (df, fn, fdf, 0, NULL, &condsz, cond, 0, NULL)) != OK)
  55.     return;
  56.   if ((ans->cpncnt = synlsc (RSC, pidrel, cond, condsz, fn, NULL)) != OK)
  57.     return;
  58.   sn = desrel->segnr;
  59.   scind = rel_scan (sn, pidrel->urn.obnum, (char *) desrel,
  60.                     &num, 0, NULL, NULL, 0, 0, NULL);
  61.   disc = &scind->dessc;
  62.   rep = fgetnext (disc, &pn, &size, SLOWSCAN);
  63.   while (rep != EOI)
  64.     {
  65.       while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  66.       ai = (u2_t *) (asp + phsize);
  67.       ali = ai + ((struct page_head *) asp)->lastin;
  68.       for (; ai <= ali; ai++)
  69. if (*ai != 0 && CHECK_PG_ENTRY(ai)
  70.             && fndslc (desrel, asp, ai, cond, condsz, NULL) != 0)
  71.   cntnum += 1;
  72.       putpg (&pg, 'n');
  73.       rep = getnext (disc, &pn, &size, SLOWSCAN);
  74.     }
  75.   delscan (num);
  76.   ans->cntn = cntnum;
  77. }
  78. void
  79. cntitab (struct ans_cnt *ans, struct id_ind *pidind,
  80.          u2_t condsz, char *cond, u2_t diasz, char *diasc)
  81. {
  82.   u2_t fn, fdf, sn, *ai, kn, dscsz;
  83.   struct des_field *df;
  84.   struct ldesind *di;
  85.   struct ldesscan *disc;
  86.   struct d_sc_i *scind;
  87.   i4_t rep, cntnum = 0, index;
  88.   struct d_r_t *desrel;
  89.   struct id_rel *pidrel;
  90.   struct des_tid tid;
  91.   i2_t n;
  92.   char *asp = NULL;
  93.   struct A pg;
  94.   pidrel = &pidind->irii;
  95.   if ((ans->cpncnt = contir (pidrel, &desrel)) != OK)
  96.     return;
  97.   sn = desrel->segnr;
  98.   fn = desrel->desrbd.fieldnum;
  99.   fdf = desrel->desrbd.fdfnum;
  100.   df = (struct des_field *) (desrel + 1);
  101.   if ((ans->cpncnt = testcond (df, fn, fdf, 0, NULL, &condsz, cond, 0, NULL)) != OK)
  102.     return;
  103.   index = pidind->inii;
  104.   for (di = desrel->pid; di->ldi.unindex != index && di != NULL; di = di->listind);
  105.   if (di == NULL)
  106.     {
  107.       ans->cpncnt = NDI;
  108.       return;
  109.     }
  110.   ai = (u2_t *) (di + 1);
  111.   if ((ans->cpncnt = testdsc (desrel, &diasz, diasc, ai, &dscsz)) != OK)
  112.     return;
  113.   if ((ans->cpncnt = synlsc (RSC, pidrel, cond, condsz, fn, (u2_t *) NULL)) != OK)
  114.     return;
  115.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  116.   if ((ans->cpncnt = synlsc (RSC, pidrel, diasc, diasz, kn, ai)) != OK)
  117.     return;
  118.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di, SCI, RSC, 0, NULL,
  119.                                   cond, condsz, 0, NULL, diasz + size2b);
  120.   disc = &scind->dessc;
  121.   disc->curlpn = (u2_t) ~ 0;
  122.   asp = (char *) scind + scisize + condsz + size2b;
  123.   if (diasz == 0)
  124.     disc->dpnsc = NULL;
  125.   else
  126.     disc->dpnsc = asp;
  127.   t2bpack (diasz, asp);
  128.   disc->dpnsval = asp + size2b + dscsz;
  129.   bcopy (diasc, asp + size2b, diasz);
  130.   rep = ind_ftid (disc, &tid, SLOWSCAN);
  131.   while (rep != EOI)
  132.     {
  133.       while ((asp = getpg (&pg, sn, tid.tpn, 's')) == NULL);
  134.       ai = (u2_t *) (asp + phsize) + tid.tindex;
  135.       if (*ai != 0 &&
  136.           fndslc (desrel, asp, ai, cond, condsz, NULL) != 0)
  137. cntnum += 1;
  138.       putpg (&pg, 'n');
  139.       rep = ind_tid (disc, &tid, SLOWSCAN);
  140.     }
  141.   delscan (n);
  142.   ans->cntn = cntnum;
  143. }
  144. int
  145. cntftab (i4_t idfl, u2_t condsz, char *cond)
  146. {
  147.   i4_t cntnum = 0;
  148.   u2_t fn, flpn, oldpn, pn, *ai, *afi, off, fdf, sn;
  149.   struct des_tid *tid, *tidb;
  150.   struct des_fltr *desfl;
  151.   struct d_r_t *desrel;
  152.   struct des_field *df;
  153.   char *asp = NULL, *aspfl;
  154.   struct A inpage, inflpg;
  155.   if ((u2_t) idfl > desnseg.mtobnum)
  156.     return (NIOB);
  157.   desfl = (struct des_fltr *) * (desnseg.tobtab + idfl);
  158.   if (desfl == NULL)
  159.     return (NIOB);
  160.   if (((struct prtob *) desfl)->prob != FLTR)
  161.     return (NIOB);
  162.   desrel = desfl->pdrtf;
  163.   sn = desrel->segnr;
  164.   fn = desrel->desrbd.fieldnum;
  165.   fdf = desrel->desrbd.fdfnum;
  166.   df = (struct des_field *) (desrel + 1);
  167.   if (testcond (df, fn, fdf, 0, NULL, &condsz, cond, 0, NULL) != OK)
  168.     return (NCF);
  169.   for (flpn = desfl->tobfl.firstpn; flpn != (u2_t) ~ 0;)
  170.     {
  171.       aspfl = getwl (&inflpg, NRSNUM, flpn);
  172.       off = ((struct p_h_f *) aspfl)->freeoff;
  173.       tid = (struct des_tid *) (aspfl + phfsize);
  174.       oldpn = tid->tpn;
  175.       while ((asp = getpg (&inpage, sn, oldpn, 's')) == NULL);
  176.       afi = (u2_t *) (asp + phsize);
  177.       tidb = (struct des_tid *) (aspfl + off);
  178.       for (; tid < tidb; tid++)
  179. {
  180.   pn = tid->tpn;
  181.   if (oldpn != pn)
  182.     {
  183.       putpg (&inpage, 'n');
  184.       while ((asp = getpg (&inpage, sn, pn, 's')) == NULL);
  185.       afi = (u2_t *) (asp + phsize);
  186.       oldpn = pn;
  187.     }
  188.   ai = afi + tid->tindex;
  189.   if (*ai != 0
  190.               && fndslc (desrel, asp, ai, cond, condsz, NULL) != 0)
  191.     cntnum += 1;
  192. }
  193.       flpn = ((struct p_h_f *) aspfl)->listfl.nextpn;
  194.       putwul (&inflpg, 'n');
  195.     }
  196.   putpg (&inpage, 'n');
  197.   return (cntnum);
  198. }
  199. void
  200. sumtmpt (struct ans_next *ans, struct id_rel *pidrel)
  201. {
  202.   u2_t pn, *ai, *ali, ntob, mnf, fdf, fn;
  203.   struct des_field *df;
  204.   struct des_trel *destrel;
  205.   char *asp, flaglist, **agrl;
  206.   struct A pg;
  207.   if (pidrel->urn.segnum != NRSNUM)
  208.     {
  209.       ans->cotnxt = NIOB;
  210.       return;
  211.     }
  212.   else
  213.     ans->cotnxt = OK;            
  214.   ntob = pidrel->urn.obnum;
  215.   destrel = (struct des_trel *) * (desnseg.tobtab + ntob);
  216.   df = (struct des_field *) (destrel + 1);
  217.   fdf = destrel->fdftr;
  218.   fn = destrel->fieldn;  
  219.   mnf = 0;
  220.   flaglist = FN_SUMM;
  221.   agrl = (char **) xmalloc (sizeof (void *));
  222.   agrl_frm (agrl, df, 1, &mnf, &flaglist);  
  223.   for (pn = destrel->tobtr.firstpn; pn != (u2_t) ~ 0;)
  224.     {
  225.       asp = getwl (&pg, NRSNUM, pn);
  226.       ai = (u2_t *) (asp + phtrsize);
  227.       ali = ai + ((struct p_h_tr *) asp)->linptr;
  228.       for (; ai <= ali; ai++)
  229. if (*ai != 0)
  230.   agrcount (agrl, asp + *ai, df, fdf, fn, 1, &mnf, &flaglist);
  231.       pn = ((struct listtob *) asp)->nextpn;
  232.       putwul (&pg, 'n');
  233.     }
  234.   ans->csznxt = write_val (ans->cadnxt, agrl, df, 1, &mnf, &flaglist);
  235.   xfree (agrl[0]);
  236.   xfree ((char *) agrl);  
  237.   return ;
  238. }