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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  delcon.c  - mass deletion of rows satisfyed specific condition
  3.  *               on basis scanning of specific table
  4.  *               by itself, by specific index, by specific 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: delcon.c,v 1.247 1997/04/28 12:15:01 vera Exp $ */
  31. #include "destrn.h"
  32. #include "strml.h"
  33. #include "fdcltrn.h"
  34. #include "xmem.h"
  35. extern struct des_nseg desnseg;
  36. extern char *pbuflj;
  37. extern struct ADBL adlj;
  38. extern i4_t ljmsize;
  39. static void
  40. mdel (struct d_r_t *dr, char *cort, u2_t corsize,
  41.       struct des_tid *tid, struct des_tid *ref_tid)
  42. {
  43.   u2_t sn;
  44.   struct id_rel idr;
  45.   i4_t rn;
  46.   modmes ();
  47.   idr.urn.segnum = sn = dr->segnr;
  48.   idr.urn.obnum = rn = dr->desrbd.relnum;
  49.   idr.pagenum = dr->pn_r;
  50.   idr.index = dr->ind_r;
  51.   wmlj (DELLJ, ljmsize + corsize, &adlj, &idr, tid, 0);
  52.   orddel (sn, rn, tid, ref_tid, corsize);
  53.   proind (ordindd, dr, dr->desrbd.indnum, cort, tid);
  54. }
  55. CPNM
  56. delcrl (struct id_rel *pidrl, u2_t slsz, char *sc)
  57. {
  58.   u2_t fn, fdf, *ali, *ai, corsize;
  59.   char *asp = NULL;
  60.   struct des_field *df;
  61.   u2_t sn, pn;
  62.   struct A pg;
  63.   char *arrpnt[BD_PAGESIZE];
  64.   u2_t arrsz[BD_PAGESIZE];
  65.   sn = pidrl->urn.segnum;
  66.   if (sn != NRSNUM)
  67.     {
  68.       struct d_r_t *dr;
  69.       struct d_sc_i *scind;
  70.       struct ldesscan *disc;
  71.       char *cort;
  72.       struct des_tid tid, ref_tid;
  73.       u2_t ind, sz, pnr, indr;
  74.       i4_t rn, ans;
  75.       i2_t n;
  76.       CPNM cpn;
  77.   
  78.       if ((cpn = cont_fir (pidrl, &dr)) != OK)
  79. return (cpn);
  80.       pnr = pidrl->pagenum;
  81.       indr = pidrl->index;
  82.       fn = dr->desrbd.fieldnum;
  83.       fdf = dr->desrbd.fdfnum;
  84.       df = (struct des_field *) (dr + 1);
  85.       if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  86. return (NCF);
  87.       if ((cpn = synlsc (WSC, pidrl, sc, slsz, fn, (u2_t *) NULL)) != OK)
  88. return (cpn);
  89.       rn = pidrl->urn.obnum;
  90.       cort = pbuflj + ljmsize;
  91.       scind = rel_scan (sn, rn, (char *) dr, &n, 0, NULL, NULL, 0, 0, NULL);
  92.       disc = &scind->dessc;
  93.       ans = fgetnext (disc, &pn, &sz, SLOWSCAN);
  94.       while (ans != EOI)
  95. {
  96.   ind = 0;
  97. m1:
  98.   while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  99.   ai = (u2_t *) (asp + phsize);
  100.   ali = ai + ((struct page_head *) asp)->lastin;
  101.   for (ai += ind; ai <= ali; ai++, ind++)
  102.     {
  103.       if (*ai != 0 && CHECK_PG_ENTRY(ai) &&
  104.   (corsize = fnd_slc (dr, asp, ai, sc, slsz, cort, &ref_tid)) != 0)
  105. {
  106.   tid.tpn = pn;
  107.   tid.tindex = ind;
  108.                   putpg (&pg, 'n');
  109.                   mdel (dr, cort, corsize, &tid, &ref_tid);
  110.   BUF_endop ();
  111.   ind++;
  112.   goto m1;
  113. }
  114.     }
  115.   putpg (&pg, 'n');
  116.   ans = getnext (disc, &pn, &sz, SLOWSCAN);
  117. }
  118.       delscan (n);
  119.     }
  120.   else
  121.     {
  122.       struct des_trel *dtr;
  123.       
  124.       dtr = (struct des_trel *) * (desnseg.tobtab + pidrl->urn.obnum);
  125.       if (dtr->tobtr.prdt.prob != TREL)
  126. return (NDR);
  127.       fn = dtr->fieldn;
  128.       fdf = dtr->fdftr;
  129.       df = (struct des_field *) (dtr + 1);
  130.       if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  131. return (NCF);
  132.       for (pn = dtr->tobtr.firstpn; pn != (u2_t) ~ 0;)
  133. {
  134.   asp = getwl (&pg, NRSNUM, pn);
  135.   ai = (u2_t *) (asp + phtrsize);
  136.   ali = ai + ((struct p_h_tr *) asp)->linptr;
  137.   pn = ((struct listtob *) asp)->nextpn;
  138.   for (; ai <= ali; ai++)
  139.     if (*ai != 0 && (corsize = tstcsel (df, fn, fdf, slsz, sc,
  140.                                      asp + *ai, arrpnt, arrsz)) != 0)
  141.       {
  142. comptr (asp, ai, corsize);
  143. *ai = 0;
  144.       }
  145.   if (frptr (asp) == 1)
  146.     frptob ((struct des_tob *) dtr, asp, pn);
  147.   else
  148.     putwul (&pg, 'n');
  149. }
  150.     }
  151.   return (OK);
  152. }
  153. int
  154. delcin (struct id_ind *pidind, u2_t slsz, char *sc, u2_t diasz, char *diasc)
  155. {
  156.   u2_t fn, fdf, *ai, sn, pn, oldpn;
  157.   char *asp = NULL, *cort;
  158.   struct des_field *df;
  159.   struct ldesscan *disc;
  160.   struct d_sc_i *scind;
  161.   struct ldesind *di;
  162.   i4_t pr, rep;
  163.   struct d_r_t *dr;
  164.   struct id_rel *pidrl;
  165.   u2_t corsize, kn, dscsz, pnr, indr;
  166.   i4_t rn;
  167.   i2_t n;
  168.   i4_t ans;
  169.   struct des_tid tid, ref_tid;
  170.   struct A pg;
  171.   pidrl = &pidind->irii;
  172.   sn = pidrl->urn.segnum;
  173.   if ((ans = cont_id (pidind, &dr, &di)) != OK)
  174.     return (ans);
  175.   fn = dr->desrbd.fieldnum;
  176.   fdf = dr->desrbd.fdfnum;
  177.   df = (struct des_field *) (dr + 1);
  178.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  179.     return (NCF);
  180.   ai = (u2_t *) (di + 1);
  181.   if ((ans = testdsc (dr, &diasz, diasc, ai, &dscsz)) != OK)
  182.     return (ans);
  183.   if ((ans = synlsc (RSC, pidrl, sc, slsz, fn, (u2_t *) NULL)) != OK)
  184.     return (ans);
  185.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  186.   if ((ans = synlsc (RSC, pidrl, diasc, diasz, kn, ai)) != OK)
  187.     return (ans);
  188.   rn = pidrl->urn.obnum;
  189.   pnr = pidrl->pagenum;
  190.   indr = pidrl->index;
  191.   cort = pbuflj + ljmsize;
  192.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di,
  193.                                   SCI, DSC, 0, NULL, sc, slsz,
  194.   0, NULL, diasz + size2b);
  195.   disc = &scind->dessc;
  196.   disc->curlpn = (u2_t) ~ 0;
  197.   asp = (char *) scind + scisize + slsz + size2b;
  198.   if (diasz == 0)
  199.     disc->dpnsc = NULL;
  200.   else
  201.     disc->dpnsc = asp;
  202.   t2bpack (diasz, asp);
  203.   disc->dpnsval = asp + size2b + dscsz;
  204.   asp += size2b;
  205.   bcopy (diasc, asp, diasz);
  206.   oldpn = (u2_t) ~0;
  207.   if ((rep = ind_ftid (disc, &tid, SLOWSCAN)) != EOI)
  208.     {
  209.       oldpn = tid.tpn;
  210.       while ((asp = getpg (&pg, sn, oldpn, 's')) == NULL);
  211.     }
  212.   pr = 0;
  213.   for (; rep != EOI; rep = ind_tid (disc, &tid, SLOWSCAN))
  214.     {
  215.       pn = tid.tpn;
  216.       if (pr == 1)
  217. {
  218.   while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  219.   oldpn = pn;
  220.   pr = 0;
  221. }
  222.       else if (oldpn != pn)
  223. {
  224.   putpg (&pg, 'n');
  225.   while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  226.   oldpn = pn;
  227. }
  228.       ai = (u2_t *) (asp + phsize) + tid.tindex;
  229.       if (*ai != 0 &&
  230.   (corsize = fnd_slc (dr, asp, ai, sc, slsz, cort, &ref_tid)) != 0)
  231. {
  232.           putpg (&pg, 'n');
  233.   mdel (dr, cort, corsize, &tid, &ref_tid);
  234.   pr = 1;
  235. }
  236.     }
  237.   delscan (n);
  238.   return (OK);
  239. }
  240. CPNM
  241. delcfl (i4_t idfl, u2_t slsz, char *sc)
  242. {
  243.   u2_t fn, fdf, *afi, *ai, sn, pn, off, oldpn, flpn;
  244.   char *asp = NULL, *cort, *aspfl;
  245.   struct d_r_t *dr;
  246.   struct des_field *df;
  247.   struct des_tid *tid, *tidb, ref_tid;
  248.   struct des_fltr *desfl;
  249.   struct id_rel idrl;
  250.   u2_t corsize, pnr, indr;
  251.   i4_t rn;
  252.   CPNM cpn;
  253.   struct A pg, inflpg;
  254.   if ((u2_t) idfl > desnseg.mtobnum)
  255.     return (NIOB);
  256.   desfl = (struct des_fltr *) * (desnseg.tobtab + idfl);
  257.   if (desfl == NULL)
  258.     return (NIOB);    
  259.   if (((struct prtob *) desfl)->prob != FLTR)
  260.     return (NIOB);
  261.   dr = desfl->pdrtf;
  262.   fn = dr->desrbd.fieldnum;
  263.   fdf = dr->desrbd.fdfnum;
  264.   df = (struct des_field *) (dr + 1);
  265.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  266.     return (NCF);
  267.   sn = dr->segnr;
  268.   rn = dr->desrbd.relnum;
  269.   pnr = dr->pn_r;
  270.   indr = dr->ind_r;
  271.   idrl.urn.segnum = sn;
  272.   idrl.urn.obnum = rn;
  273.   idrl.pagenum = pnr;
  274.   idrl.index = indr;
  275.   if ((cpn = synlsc (WSC, &idrl, sc, slsz, fn, (u2_t *) NULL)) != OK)
  276.     return (cpn);
  277.   cort = pbuflj + ljmsize;
  278.   for (flpn = desfl->tobfl.firstpn; flpn != (u2_t) ~ 0;)
  279.     {
  280.       aspfl = getwl (&inflpg, NRSNUM, flpn);
  281.       off = ((struct p_h_f *) aspfl)->freeoff;
  282.       tid = (struct des_tid *) (aspfl + phfsize);
  283.       oldpn = tid->tpn;
  284.       while ((asp = getpg (&pg, sn, oldpn, 's')) == NULL);
  285.       afi = (u2_t *) (asp + phsize);
  286.       tidb = (struct des_tid *) (aspfl + off);
  287.       for (; tid < tidb; tid++)
  288. {
  289.   pn = tid->tpn;
  290.   if (oldpn != pn)
  291.     {
  292.       putpg (&pg, 'n');
  293.       while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  294.       afi = (u2_t *) (asp + phsize);
  295.       oldpn = pn;
  296.     }
  297.   ai = afi + tid->tindex;
  298.   if (*ai != 0 &&
  299.       (corsize = fnd_slc (dr, asp, ai, sc, slsz, cort, &ref_tid)) != 0)
  300.             {
  301.               putpg (&pg, 'n');
  302.               mdel (dr, cort, corsize, tid, &ref_tid);
  303.             }
  304. }
  305.       flpn = ((struct p_h_f *) aspfl)->listfl.nextpn;
  306.       putwul (&inflpg, 'n');
  307.     }
  308.   putpg (&pg, 'n');
  309.   return (OK);
  310. }
  311. int
  312. fnd_slc (struct d_r_t *dr, char *asp, u2_t * ai, char *selcon,
  313.          u2_t slsz, char *cort, struct des_tid *ref_tid)
  314. {
  315.   char *tuple;
  316.   unsigned char t;
  317.   struct des_field *df;
  318.   struct A inpage;
  319.   u2_t fn, fdf;
  320.   char *arrpnt[BD_PAGESIZE];
  321.   u2_t arrsz[BD_PAGESIZE];
  322.   int tuple_size;
  323.   tuple = asp + *ai;
  324.   t = *tuple & MSKCORT;
  325.   if (t == CREM || t == IDTR)
  326.     return (NCR);
  327.   if (t == IND)
  328.     {
  329.       u2_t pn2, ind2;
  330.       ref_tid->tindex = ind2 = t2bunpack (tuple + 1);
  331.       ref_tid->tpn = pn2 = t2bunpack (tuple + 1 + size2b);
  332.       while ((asp = getpg (&inpage, dr->segnr, pn2, 's')) == NULL);
  333.       ai = (u2_t *) (asp + phsize) + ind2;
  334.       tuple = asp + *ai;
  335.     }
  336.   else
  337.     ref_tid->tpn = (u2_t) ~ 0;
  338.   fn = dr->desrbd.fieldnum;
  339.   fdf = dr->desrbd.fdfnum;
  340.   df = (struct des_field *) (dr + 1);
  341.   tuple_size = tstcsel (df, fn, fdf, slsz, selcon, tuple, arrpnt, arrsz);
  342.   if (tuple_size != 0 && cort != NULL)
  343.     bcopy (tuple, cort, tuple_size);
  344.   if (t == IND)
  345.     putpg (&inpage, 'n');
  346.   return (tuple_size);
  347. }