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

SQL Server

开发平台:

Unix_Linux

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