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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  inscon.c  - mass insertion 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: inscon.c,v 1.246 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. extern struct ldesind **TAB_IFAM;
  41. #define CMP_REL 
  42.   if (sn_out != NRSNUM)
  43.     {
  44.       if ((cpn = cont_fir (pidrl_out, &dr_out)) != OK)
  45. return (cpn);
  46.       if ((cpn = synlsc (WSC, pidrl_out, sc, slsz, fn, (u2_t *) NULL)) != OK)
  47.         return (cpn);
  48.       fn2 = dr_out->desrbd.fieldnum;
  49.       fdf2 = dr_out->desrbd.fdfnum;
  50.       df2 = (struct des_field *) (dr_out + 1);
  51.     }
  52.   else
  53.     { /* The insertion in the temporary relation */
  54.       dtr_out = (struct des_trel *) * (desnseg.tobtab + pidrl_out->urn.obnum);
  55.       if (dtr_out->tobtr.prdt.prob != TREL)
  56. return (NDR);
  57.       fn2 = dtr_out->fieldn;
  58.       fdf2 = dtr_out->fdftr;
  59.       df2 = (struct des_field *) (dtr_out + 1);
  60.       dt = (struct des_tob *) dtr_out;
  61.     }
  62.   if ((cpn = cmprel (fn, fdf, df, fn2, fdf2, df2)) != OK)
  63.     return (cpn);
  64. #define INSERTION_BY_TID(pn,ind) 
  65.   if (oldpn != pn)
  66.     {
  67.       putpg (&inpage, 'n');
  68.       while ((asp = getpg (&inpage, sn_in, pn, 's')) == NULL);
  69.       afi = (u2_t *) (asp + phsize);
  70.       oldpn = pn;
  71.      }
  72.   ai = afi + ind;
  73. #define MASS_INSERTION 
  74.   if (*ai != 0 && CHECK_PG_ENTRY(ai))
  75.     {
  76.        if (sn_out != NRSNUM)
  77.          {
  78.            if ((corsize = fndslc (dr_in, asp, ai, sc,
  79.                           slsz, cort)) != 0)
  80.              mins (cort, corsize, outpage, &freesz, dr_out);
  81.          }
  82.        else
  83.          if ((corsize = fndslc (dr_in, asp, ai, sc,
  84.                           slsz, NULL)) != 0)
  85.            minstr (outpage, asp + *ai, corsize, dt);
  86.     }
  87. #define END_MASS_INS 
  88. if (sn_out != NRSNUM)
  89.     eop_mass_ins (pidrl_out->urn.obnum, outpage, freesz);
  90.   else
  91.     {
  92.       dtr_out->tobtr.prdt.prsort = NSORT;
  93.       putwul (outpage, 'm');
  94.     }
  95. static int
  96. cmprel (u2_t fn1, u2_t fdf1, struct des_field *df1, u2_t fn2,
  97.         u2_t fdf2, struct des_field *df2)
  98. {
  99.   struct des_field *ldf;
  100.   u2_t type;
  101.   
  102.   if (fn1 != fn2 || fdf1 != fdf2)
  103.     return (N_EQV);
  104.   for (ldf = df1 + fn1; df1 < ldf; df1++, df2++)
  105.     {
  106.       if ((type = df1->field_type) != df2->field_type)
  107. return (N_EQV);
  108.       if (type == TCH || type == TFL)
  109. if (df1->field_size > df2->field_size)
  110.   return (N_EQV);
  111.     }
  112.   return (OK);
  113. }
  114. static void
  115. eop_mass_ins (i4_t rn, struct A *outpage, u2_t freesz)
  116. {
  117.   if (outpage->p_shm != NULL)
  118.     {
  119.       u2_t sn;
  120.       sn = outpage->p_sn;
  121.       tab_difam (sn);
  122.       insrec (TAB_IFAM[sn], rn, outpage->p_pn, freesz);
  123.       putwul (outpage, 'm');
  124.     }
  125. }
  126. static void
  127. mins (char *cort, u2_t corsize, struct A *outpage, u2_t *freesz,
  128.       struct d_r_t *desrel)
  129. {
  130.   char *tuple, *outasp;
  131.   struct page_head *ph;
  132.   i4_t n, ni, rn;
  133.   u2_t size, delta, sn;
  134.   struct des_tid tid;
  135.   struct id_rel idr;
  136.   struct ADBL last_adlj;
  137.   modmes ();
  138.   *cort = CORT;
  139.   delta = corsize + size2b;
  140.   last_adlj = adlj;
  141.   tuple = cort;
  142.   sn = desrel ->segnr;
  143.   rn = desrel->desrbd.relnum;
  144.   if (delta > * freesz)
  145.     {
  146.       u2_t newpn;
  147.       eop_mass_ins (rn, outpage, *freesz);
  148.       newpn = getempt (sn);
  149.       outasp = getnew (outpage, sn, newpn);
  150.       tid.tpn = newpn;
  151.       tid.tindex = 0;
  152.       size = BD_PAGESIZE - corsize;
  153.       ph = (struct page_head *) outasp;
  154.       ph->lastin = 0;
  155.       t2bpack (size, outasp + phsize);
  156.       *freesz = BD_PAGESIZE - phsize - delta;
  157.     }
  158.   else
  159.     {
  160.       u2_t *ai;
  161.       outasp = outpage->p_shm;
  162.       ph = (struct page_head *) outasp;
  163.       ai = (u2_t *) (outasp + phsize) + ph->lastin;
  164.       size = *ai - corsize;
  165.       ph->lastin++;
  166.       tid.tpn = outpage->p_pn;
  167.       tid.tindex = ph->lastin;
  168.       *(ai + 1) = size;
  169.       *freesz -= delta;
  170.     }
  171.   idr.urn.segnum = sn;
  172.   idr.urn.obnum = rn;
  173.   idr.pagenum = desrel->pn_r;
  174.   idr.index = desrel->ind_r;
  175.   wmlj (INSLJ, ljmsize + corsize, &adlj, &idr, &tid, 0);
  176.   bcopy (cort, outasp + size, corsize);
  177.   n = desrel->desrbd.indnum;
  178.   ni = proind (ordindi, desrel, n, tuple, &tid);
  179.   if (ni < n)
  180.     {
  181.       struct des_tid ref_tid;
  182.       wmlj (RLBLJ, ljrsize, &last_adlj, &idr, &tid, 0);
  183.       proind (ordindd, desrel, ni, tuple, &tid);
  184.       ref_tid.tpn = (u2_t) ~ 0;
  185.       orddel (sn, rn, &tid, &ref_tid, corsize);
  186.     }
  187. }
  188. CPNM
  189. inscrl (struct id_rel *pidrl_in, struct id_rel *pidrl_out, u2_t fln,
  190.         u2_t * fl, u2_t slsz, char *sc)
  191. {
  192.   u2_t fn, fdf, fn2, fdf2, *ali, sn_in, sn_out, *ai;
  193.   char *cort, *asp = NULL;
  194.   struct des_field *df, *df2;
  195.   u2_t pn, corsize, freesz = 0;
  196.   struct d_r_t *dr_out;
  197.   struct des_trel *dtr_out = NULL;
  198.   struct des_tob *dt = NULL;
  199.   CPNM cpn;
  200.   char *outasp = NULL;
  201.   struct A inpage, *outpage, outpg;
  202.   char *arrpnt[BD_PAGESIZE];
  203.   u2_t arrsz[BD_PAGESIZE];
  204.   sn_in = pidrl_in->urn.segnum;
  205.   sn_out = pidrl_out->urn.segnum;
  206.   if (sn_in == sn_out && pidrl_in->urn.obnum == pidrl_out->urn.obnum)
  207.     return (NDR);
  208.   cort = pbuflj + ljmsize;
  209.   outpage = &outpg;
  210.   outpage->p_shm = NULL;
  211.   if (sn_in != NRSNUM)
  212.     {
  213.       struct d_r_t *dr_in;
  214.       struct d_sc_i *scind;
  215.       struct ldesscan *disc;
  216.       u2_t size;
  217.       i4_t rep;
  218.       i2_t num;
  219.       
  220.       if ((cpn = contir (pidrl_in, &dr_in)) != OK)
  221. return (cpn);
  222.       fn = dr_in->desrbd.fieldnum;
  223.       fdf = dr_in->desrbd.fdfnum;
  224.       df = (struct des_field *) (dr_in + 1);
  225.       if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  226. return (NCF);
  227.       if ((cpn = synlsc (RSC, pidrl_in, sc, slsz, fn, (u2_t *) NULL)) != OK)
  228. return (cpn);      
  229.       CMP_REL;
  230.       if (sn_out == NRSNUM)
  231. outasp = getwl (outpage, NRSNUM, dtr_out->tobtr.lastpn);
  232.       scind = rel_scan (sn_in, pidrl_in->urn.obnum, (char *) dr_in,
  233.                         &num, 0, NULL, NULL, 0, 0, NULL);
  234.       disc = &scind->dessc;
  235.       rep = fgetnext (disc, &pn, &size, FASTSCAN);
  236.       for (; rep != EOI;)
  237. {
  238.   while ((asp = getpg (&inpage, sn_in, pn, 's')) == NULL);
  239.   ai = (u2_t *) (asp + phsize);
  240.   ali = ai + ((struct page_head *) asp)->lastin;
  241.   for (; ai <= ali; ai++)
  242.             MASS_INSERTION;
  243.   putpg (&inpage, 'n');
  244.   rep = getnext (disc, &pn, &size, FASTSCAN);
  245. }
  246.       delscan (num);
  247.     }
  248.   else       /* sn_in == NRSNUM */
  249.     {
  250.       struct des_trel *dtr_in;
  251.       
  252.       dtr_in = (struct des_trel *) * (desnseg.tobtab + pidrl_in->urn.obnum);
  253.       if (dtr_in->tobtr.prdt.prob != TREL)
  254. return (NDR);
  255.       fn = dtr_in->fieldn;
  256.       fdf = dtr_in->fdftr;
  257.       df = (struct des_field *) (dtr_in + 1);
  258.       if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  259. return (NCF);
  260.       CMP_REL;
  261.       if (sn_out == NRSNUM)
  262. outasp = getwl (outpage, NRSNUM, dtr_out->tobtr.lastpn);
  263.       for (pn = dtr_in->tobtr.firstpn; pn != (u2_t) ~ 0;)
  264. {
  265.   asp = getwl (&inpage, NRSNUM, pn);
  266.   ai = (u2_t *) (asp + phtrsize);
  267.   ali = ai + ((struct p_h_tr *) asp)->linptr;
  268.   for (; ai <= ali; ai++)
  269.     if (*ai != 0 &&
  270.                 (corsize = tstcsel (df, fn, fdf, slsz,
  271.                                        sc, asp + *ai, arrpnt, arrsz)) != 0 )
  272.               {
  273. if (sn_out != NRSNUM)
  274.                   mins (asp + *ai, corsize, outpage, &freesz, dr_out);
  275. else
  276.                   minstr (outpage, asp + *ai, corsize, dt);
  277.       }       
  278.   pn = ((struct listtob *) asp)->nextpn;
  279.   putwul (&inpage, 'n');
  280. }
  281.     }
  282.   END_MASS_INS;
  283.   return (OK);
  284. }
  285. int
  286. inscin (struct id_ind *pidind, struct id_rel *pidrl_out, u2_t fln,
  287.         u2_t * fl, u2_t slsz, char *sc, u2_t diasz, char *diasc)
  288. {
  289.   u2_t fn, fdf, fn2, fdf2, sn_in, sn_out, oldpn;
  290.   char *asp = NULL, *cort;
  291.   struct des_field *df, *df2;
  292.   struct ldesscan *disc;
  293.   struct d_sc_i *scind;
  294.   struct ldesind *di;
  295.   u2_t *afi, *ai, corsize, kn, dscsz, freesz = 0;
  296.   struct d_r_t *dr_in, *dr_out;
  297.   struct id_rel *pidrl_in;
  298.   struct des_tid tid;
  299.   struct des_trel *dtr_out = NULL;
  300.   char *outasp = NULL;
  301.   i2_t n;
  302.   i4_t cpn;
  303.   struct des_tob *dt = NULL;  
  304.   struct A inpage, *outpage, outpg;
  305.   i4_t rep;
  306.   pidrl_in = &pidind->irii;
  307.   sn_in = pidrl_in->urn.segnum;
  308.   sn_out = pidrl_out->urn.segnum;
  309.   if (sn_in == sn_out && pidrl_in->urn.obnum == pidrl_out->urn.obnum)
  310.     return (NDR);
  311.   if ((cpn = cont_id (pidind, &dr_in, &di)) != OK)
  312.     return (cpn);
  313.   fn = dr_in->desrbd.fieldnum;
  314.   fdf = dr_in->desrbd.fdfnum;
  315.   df = (struct des_field *) (dr_in + 1);
  316.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  317.     return (NCF);
  318.   ai = (u2_t *) (di + 1);
  319.   if ((cpn = testdsc (dr_in, &diasz, diasc, ai, &dscsz)) != OK)
  320.     return (cpn);
  321.   if ((cpn = synlsc (RSC, pidrl_in, sc, slsz, fn, (u2_t *) NULL)) != OK)
  322.     return (cpn);
  323.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  324.   if ((cpn = synlsc (RSC, pidrl_in, diasc, diasz, kn, ai)) != OK)
  325.     return (cpn);
  326.   CMP_REL;
  327.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di, SCI, WSC,
  328.                                   0, NULL, sc, slsz,
  329.   0, NULL, diasz + size2b);
  330.   disc = &scind->dessc;
  331.   disc->curlpn = (u2_t) ~ 0;
  332.   asp = (char *) scind + scisize + slsz + size2b;
  333.   disc->dpnsc = asp;
  334.   t2bpack (diasz, asp);
  335.   disc->dpnsval = asp + size2b + dscsz;
  336.   bcopy (diasc, asp + size2b, diasz);
  337.   cort = pbuflj + ljmsize;
  338.   outpage = &outpg;
  339.   outpage->p_shm = NULL;
  340.   if ((rep = ind_ftid (disc, &tid, FASTSCAN)) != EOI)
  341.     {
  342.       oldpn = tid.tpn;
  343.       while ((asp = getpg (&inpage, sn_in, oldpn, 's')) == NULL);
  344.       afi = (u2_t *) (asp + phsize);
  345.     }
  346.   else
  347.     goto m1;
  348.   if (sn_out == NRSNUM)
  349.     outasp = getwl (outpage, NRSNUM, dtr_out->tobtr.lastpn);
  350.   for (; rep != EOI; rep = ind_tid (disc, &tid, FASTSCAN))
  351.     {
  352.       INSERTION_BY_TID(tid.tpn,tid.tindex);
  353.       MASS_INSERTION;
  354.     }
  355.   END_MASS_INS;
  356. m1:
  357.   delscan (n);
  358.   return (OK);
  359. }
  360. int
  361. inscfl (i4_t idfl, struct id_rel *pidrl_out, u2_t fln, u2_t * fl,
  362.         u2_t slsz, char *sc)
  363. {
  364.   u2_t fn, fdf, fn2, fdf2, sn_out, flpn, off;
  365.   struct des_tid *tid, *tidb;
  366.   char *aspfl, *cort, *asp = NULL;
  367.   u2_t oldpn, *afi, *ai, corsize, sn_in, freesz = 0;
  368.   struct d_r_t *dr_in, *dr_out;
  369.   struct des_field *df, *df2;
  370.   struct des_trel *dtr_out = NULL;
  371.   struct des_fltr *desfl;
  372.   char *outasp = NULL;
  373.   struct des_tob *dt = NULL;  
  374.   CPNM cpn;
  375.   struct A inpage, *outpage, inflpg, outpg;
  376.   if ((u2_t) idfl > desnseg.mtobnum)
  377.     return (NIOB);
  378.   desfl = (struct des_fltr *) * (desnseg.tobtab + idfl);
  379.   if (desfl == NULL)
  380.     return (NIOB);    
  381.   if (((struct prtob *) desfl)->prob != FLTR)
  382.     return (NIOB);
  383.   dr_in = desfl->pdrtf;
  384.   fn = dr_in->desrbd.fieldnum;
  385.   fdf = dr_in->desrbd.fdfnum;
  386.   df = (struct des_field *) (dr_in + 1);
  387.   if (testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL) != OK)
  388.     return (NCF);
  389.   sn_in = dr_in->segnr;
  390.   sn_out = pidrl_out->urn.segnum;
  391.   cort = pbuflj + ljmsize;
  392.   outpage = &outpg;
  393.   outpage->p_shm = NULL;
  394.   CMP_REL; 
  395.   if (sn_out == NRSNUM)
  396.     outasp = getwl (outpage, sn_out, dtr_out->tobtr.lastpn);  
  397.   for (flpn = desfl->tobfl.firstpn; flpn != (u2_t) ~ 0;)
  398.     {
  399.       aspfl = getwl (&inflpg, NRSNUM, flpn);
  400.       off = ((struct p_h_f *) aspfl)->freeoff;
  401.       tid = (struct des_tid *) (aspfl + phfsize);
  402.       oldpn = tid->tpn;
  403.       while ((asp = getpg (&inpage, sn_in, oldpn, 's')) == NULL);
  404.       afi = (u2_t *) (asp + phsize);
  405.       tidb = (struct des_tid *) (aspfl + off);
  406.       for (; tid < tidb; tid++)
  407.         {
  408.           INSERTION_BY_TID(tid->tpn,tid->tindex);
  409.           MASS_INSERTION;
  410.         }
  411.       flpn = ((struct p_h_f *) aspfl)->listfl.nextpn;
  412.       putwul (&inflpg, 'n');
  413.     }
  414.   END_MASS_INS;  
  415.   return (OK);
  416. }