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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  tmpob.c  - Temporary objects manipulations 
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at Institute of System Programming of Russian Academy of Science
  8.  *  This file is written by  Vera Ponomarenko
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts:   gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: tmpob.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "xmem.h"
  29. #include "destrn.h"
  30. #include "strml.h"
  31. #include "fdcltrn.h"
  32. extern u2_t EXNSSIZE;
  33. extern struct des_nseg desnseg;
  34. struct ans_ctob
  35. crtrel (i4_t fn, i4_t fdf, struct des_field *df)
  36. {
  37.   struct ans_ctob ans;
  38.   struct des_trel *destrel;
  39.   struct des_field *dftr;
  40.   i2_t n;
  41.   struct A pg; 
  42.   if (fdf > fn)
  43.     {
  44.       ans.cpncob = NCF;
  45.       return (ans);
  46.     }
  47.   destrel = (struct des_trel *) gettob (&pg, dtrsize + fn * rfsize, &n, TREL);
  48.   putwul (&pg, 'm');
  49.   destrel->fieldn = fn;
  50.   destrel->fdftr = fdf;
  51.   destrel->keysntr = 0;
  52.   dftr = (struct des_field *) (destrel + 1);
  53.   for (; fn != 0; fn--)
  54.     *dftr++ = *df++;
  55.   ans.cpncob = OK;
  56.   ans.idob.segnum = NRSNUM;
  57.   ans.idob.obnum = n;
  58.   return (ans);
  59. }
  60. struct ans_ctob
  61. crfltr (struct id_rel *pidrel)
  62. {
  63.   struct ans_ctob ans;
  64.   struct des_fltr *desfltr;
  65.   i2_t n;
  66.   struct d_r_t *desrel;
  67.   struct A pg;
  68.   if (pidrel->urn.segnum == NRSNUM)
  69.     {
  70.       ans.cpncob = NIOB;
  71.       return (ans);
  72.     }
  73.   if ((ans.cpncob = contir (pidrel, &desrel)) != OK)
  74.     return (ans);
  75.   desfltr = (struct des_fltr *) gettob (&pg, dflsize, &n, FLTR);
  76.   putwul (&pg, 'm');
  77.   desfltr->pdrtf = desrel;
  78.   ans.cpncob = OK;
  79.   ans.idob.segnum = NRSNUM;
  80.   ans.idob.obnum = n;
  81.   return (ans);
  82. }
  83. static struct des_exns *
  84. getext ( u2_t *pn)
  85. {
  86.   struct des_exns *desext, *dd;
  87.   u2_t mn, n;
  88.   ADMT_getext (pn);
  89.   for (mn = desnseg.mexnum, desext = desnseg.dextab, n = 0;
  90.        n < mn;
  91.        n++, desext++)
  92.     if (desext->efpn == (u2_t) ~ 0)
  93.       goto m1;
  94.   dd = desnseg.dextab;
  95.   desnseg.dextab = (struct des_exns *) xrealloc ((char *) dd, (mn + DEXTD) * dexsize);
  96.   for (n = 0, desext = desnseg.dextab + mn;
  97.        n < DEXTD;
  98.        n++, desext++)
  99.     desext->efpn = (u2_t) ~ 0;
  100.   desnseg.lexnum = mn;
  101.   desnseg.mexnum += DEXTD;
  102.   desext = desnseg.dextab + mn;
  103. m1:desext->efpn = *pn;
  104.   desext->funpn = *pn + 1;
  105.   desext->ldfpn = (u2_t) ~ 0;
  106.   desext->freecntr = EXNSSIZE;
  107.   return (desext);
  108. }
  109. struct des_tob *
  110. gettob (struct A *pg, u2_t size, i2_t * n, i4_t type)
  111. {
  112.   u2_t *b, pn;
  113.   struct des_exns *desext;
  114.   struct des_tob *a;
  115.   struct listtob *l;
  116.   char *asp;
  117.   
  118.   *n = lunt (&desnseg.tobtab, &desnseg.mtobnum, TOBPTD);
  119.   a = (struct des_tob *) xmalloc (size);
  120.   *(desnseg.tobtab + *n) = (char *) a;
  121.   a->prdt.prob = type;
  122.   a->prdt.prsort = NSORT;
  123.   desext = getext (&pn);
  124.   desext->freecntr--;
  125.   a->firstpn = pn;
  126.   a->lastpn = pn;
  127.   a->osctob = 0;
  128.   asp = getnew (pg, NRSNUM, pn);
  129.   l = (struct listtob *) asp;
  130.   l->prevpn = (u2_t) ~ 0;
  131.   l->nextpn = (u2_t) ~ 0;
  132.   b = (u2_t *) (asp + sizeof (struct listtob));
  133.   if (type == FLTR)
  134.     {
  135.       *b = phfsize;
  136.       a->free_sz = BD_PAGESIZE - phfsize;
  137.     }
  138.   else
  139.     {
  140.       a->free_sz = BD_PAGESIZE - phtrsize;
  141.       *b++ = 0;
  142.       *b = 0;
  143.     }
  144.   return (a);
  145. }
  146. static
  147. struct des_exns *
  148. ludext (u2_t pn)
  149. {
  150.   struct des_exns *desext;
  151.   u2_t mext, n;
  152.   pn = pn / EXNSSIZE * EXNSSIZE;
  153.   mext = desnseg.mexnum;
  154.   desext = desnseg.dextab;
  155.   for (n = 0; n < mext; desext++, n++)
  156.     if ( desext->efpn == pn )
  157.       return (desext); 
  158.   return (NULL);
  159. }
  160. static
  161. void
  162. freeext (struct des_exns *desext)
  163. {
  164.   desext->freecntr++;
  165.   if (desext->freecntr == EXNSSIZE)
  166.     {
  167.       ADMT_putext (&desext->efpn, 1);
  168.       desext->efpn = (u2_t) ~ 0;
  169.     }
  170. }
  171. int
  172. deltob (struct id_ob *pidtob)
  173. {
  174.   struct des_tob *dt, *des_tob;
  175.   struct des_exns *desext;
  176.   char **a, *asp;
  177.   u2_t sn, pn, fpn, num_tob, n;
  178.   struct A pg;
  179.   sn = pidtob->segnum;
  180.   if (sn != NRSNUM)
  181.     return (NIOB);
  182.   a = desnseg.tobtab + pidtob->obnum;
  183.   dt = (struct des_tob *) * a;
  184.   fpn = dt->firstpn;
  185.   num_tob = desnseg.mtobnum; 
  186.   for (n = 0; n < num_tob; n++)
  187.     {
  188.       des_tob = (struct des_tob *) *(desnseg.tobtab + n);
  189.       if (des_tob != NULL && dt != des_tob)
  190. if (fpn == des_tob->firstpn) goto m1;
  191.     }
  192.   for (pn = fpn; pn != (u2_t) ~ 0;)
  193.     {
  194.       desext = ludext (pn);
  195.       if (desext == NULL)
  196. break;
  197.       asp = getwl (&pg, NRSNUM, pn);
  198.       pn = ((struct listtob *) asp)->nextpn;
  199.       putwul (&pg, 'n');
  200.       freeext (desext);
  201.     }
  202. m1:
  203.   delscd (dt->osctob, (char *) dt);
  204.   xfree ((void *) dt);
  205.   *a = NULL;
  206.   return (OK);
  207. }
  208. int
  209. instr (struct des_tob *dt, char *cort, u2_t corsize)
  210. {
  211.   u2_t pn;
  212.   char *asp;
  213.   struct A pg;
  214.   pn = dt->lastpn;
  215.   asp = getwl (&pg, NRSNUM, pn);
  216.   minstr (&pg, cort, corsize, dt);
  217.   putwul (&pg, 'm');
  218.   dt->prdt.prsort = NSORT;
  219.   return (OK);
  220. }
  221. void
  222. minstr (struct A *pg, char *cort, u2_t corsize, struct des_tob *dt)
  223. {
  224.   char *a;
  225.   a = getloc (pg, corsize, dt);
  226.   bcopy (cort, a, corsize);
  227. }
  228. char *
  229. getloc (struct A *pg, u2_t corsize, struct des_tob *dt)
  230. {
  231.   u2_t *ai, off;
  232.   struct p_h_tr *phtr;
  233.   char *asptr;
  234.   
  235.   if (dt->free_sz < corsize + size2b)
  236.     {
  237.       asptr = getptob (pg, dt);
  238.       phtr = (struct p_h_tr *) asptr;
  239.       phtr->linptr = 0;
  240.       off = BD_PAGESIZE - corsize;
  241.       dt->free_sz = BD_PAGESIZE - phtrsize;
  242.     }
  243.   else if (dt->free_sz == BD_PAGESIZE - phtrsize)
  244.     {
  245.       asptr = pg->p_shm;
  246.       phtr = (struct p_h_tr *) asptr;
  247.       phtr->linptr = 0;
  248.       off = BD_PAGESIZE - corsize;
  249.     }
  250.   else
  251.     {
  252.       asptr = pg->p_shm;
  253.       phtr = (struct p_h_tr *) asptr;
  254.       off = *((u2_t *) (asptr + phtrsize) + phtr->linptr) - corsize;
  255.       phtr->linptr += 1;
  256.     }
  257.   if (corsize != 0)
  258.     {
  259.       ai = (u2_t *) (phtr + 1) + phtr->linptr;
  260.       *ai = off;
  261.       dt->free_sz -= corsize + size2b;
  262.     }
  263.   return (off + asptr);
  264. }
  265. char *
  266. getptob (struct A *pg, struct des_tob *destob)
  267. {
  268.   char *asp;
  269.   u2_t pn, oldpn, *b;
  270.   struct des_exns *desext;
  271.   struct listtob *lsttob;
  272.   i4_t i = 0;
  273.   
  274.   oldpn = destob->lastpn;
  275.   if (destob->prdt.prsort == SORT)
  276.     {
  277.       desext = getext (&pn);
  278.     }
  279.   else
  280.     {
  281.       u2_t cpn;
  282.       desext = ludext (oldpn);
  283.       if ((pn = desext->funpn) != (u2_t) ~ 0)
  284. {
  285.   cpn = pn + 1;
  286.   if (cpn == desext->efpn + EXNSSIZE)
  287.     desext->funpn = (u2_t) ~ 0;
  288.   else
  289.     desext->funpn = cpn;
  290. }
  291.       else
  292. {
  293.   if ((pn = desext->ldfpn) != (u2_t) ~ 0)
  294.     i = 1;
  295.   else
  296.     {
  297.       desext = desnseg.dextab + desnseg.lexnum;
  298.       if ((pn = desext->funpn) != (u2_t) ~ 0)
  299. {
  300.   cpn = pn + 1;
  301.   if (cpn == desext->efpn + EXNSSIZE)
  302.     desext->funpn = (u2_t) ~ 0;
  303.   else
  304.     desext->funpn = cpn;
  305. }
  306.       else
  307. {
  308.   if ((pn = desext->ldfpn) != (u2_t) ~ 0)
  309.     i = 1;
  310.   else
  311.     desext = getext (&pn);
  312. }
  313.     }
  314. }
  315.     }
  316.   asp = pg->p_shm;
  317.   lsttob = (struct listtob *) asp;
  318.   lsttob->nextpn = pn;
  319.   putwul (pg, 'm');
  320.   asp = getnew (pg, NRSNUM, pn);
  321.   lsttob = (struct listtob *) asp;
  322.   if (i != 0)
  323.     desext->ldfpn = lsttob->prevpn;
  324.   lsttob->nextpn = (u2_t) ~ 0;
  325.   lsttob->prevpn = oldpn;
  326.   b = (u2_t *) (asp + sizeof (struct listtob));
  327.   if (destob->prdt.prob == FLTR)
  328.     {
  329.       *b = phfsize;
  330.       destob->free_sz = BD_PAGESIZE - phfsize;
  331.     }
  332.   else
  333.     {
  334.       destob->free_sz = BD_PAGESIZE - phtrsize;
  335.       *b++ = 0;
  336.       *b = 0;
  337.     }
  338.   desext->freecntr--;
  339.   destob->lastpn = pn;
  340.   return (asp);
  341. }
  342. void
  343. deltr (struct d_mesc *scpr, char *asp, u2_t * ai, struct des_tob *destob, u2_t pn)
  344. {
  345.   u2_t *afi;
  346.   
  347.   afi = (u2_t *) (asp + phtrsize);
  348.   comptr (asp, ai, calsc (afi, ai));
  349.   *ai = 0;
  350.   if (frptr (asp) == 1)
  351.     frptob (destob, asp, pn);
  352.   scpr->prcrt = 0;
  353.   destob->prdt.prsort = NSORT;
  354. }
  355. int
  356. frptr (char *asp)
  357. {
  358.   u2_t *ali, *afi;
  359.   afi = (u2_t *) (asp + phtrsize);
  360.   ali = afi + ((struct p_h_tr *) asp)->linptr;
  361.   for (; afi <= ali; afi++)
  362.     if (*afi != 0)
  363.       return (0);
  364.   return (1);
  365. }
  366. void
  367. comptr (char *asp, u2_t * ai, u2_t size)
  368. {
  369.   u2_t *ali, *afi;
  370.   char *a, *b, *c;
  371.   afi = (u2_t *) (asp + phtrsize);
  372.   ali = afi + ((struct p_h_tr *) asp)->linptr;
  373.   for (; ai <= ali; ai++)
  374.     if (*ai != 0)
  375.       *ai += size;
  376.   for (a = asp + *ai - 1, b = a - size, c = asp + *ali; a <= c;)
  377.     *a-- = *b--;
  378. }
  379. static
  380. void
  381. corltob (u2_t pn, u2_t type, u2_t newpn)
  382. {
  383.   char *asp;
  384.   struct A pg;
  385.   
  386.   asp = getwl (&pg, NRSNUM, pn);
  387.   if (type == 1)
  388.     ((struct listtob *) asp)->prevpn = newpn;
  389.   else
  390.     ((struct listtob *) asp)->nextpn = newpn;
  391.   putwul (&pg, 'm');
  392. }
  393. void
  394. frptob (struct des_tob *destob, char *asp, u2_t pn)
  395. {
  396.   struct listtob *phtob;
  397.   struct des_exns *desext;
  398.   u2_t npn, ppn;
  399.   phtob = (struct listtob *) asp;
  400.   npn = phtob->nextpn;
  401.   phtob->nextpn = (u2_t) ~ 0;
  402.   ppn = phtob->prevpn;
  403.   phtob->prevpn = (u2_t) ~ 0;
  404.   desext = ludext (pn);
  405.   if (desext != NULL)
  406.     {
  407.       *(u2_t *) asp = desext->ldfpn;
  408.       desext->ldfpn = pn;
  409.       if (pn == destob->firstpn)
  410. {
  411.   if (pn != destob->lastpn)
  412.     {
  413.       destob->firstpn = npn;
  414.       corltob (npn, 1, 0);
  415.     }
  416. }
  417.       else
  418. {
  419.   if (pn == destob->lastpn)
  420.     {
  421.       destob->lastpn = ppn;
  422.       corltob (ppn, 2, 0);
  423.     }
  424.   else
  425.     {
  426.       corltob (ppn, 2, npn);
  427.       corltob (npn, 1, ppn);
  428.     }
  429. }
  430.       freeext (desext);
  431.     }
  432. }  
  433. struct ans_ctob
  434. trsort (struct id_rel *pidrel, u2_t kn, u2_t * mfn, char *drctn, char prdbl)
  435. {
  436.   struct des_tob *dt, *dtnew;
  437.   struct des_trel *destrel;
  438.   u2_t *a, *b, fn, fdf, size;
  439.   i2_t n;
  440.   struct des_field *adf;
  441.   u2_t fpn, lpn;
  442.   struct ans_ctob ans;
  443.   if (pidrel->urn.segnum != NRSNUM)
  444.     {
  445.       ans.cpncob = NIOB;
  446.       return (ans);
  447.     }
  448.   dt = (struct des_tob *) * (desnseg.tobtab + pidrel->urn.obnum);
  449.   if (dt->prdt.prob != TREL)
  450.     {
  451.       ans.cpncob = NDR;
  452.       return (ans);
  453.     }
  454.   fpn = dt->firstpn;
  455.   destrel = (struct des_trel *) dt;
  456.   fn = destrel->fieldn;
  457.   fdf = destrel->fdftr;
  458.   adf = (struct des_field *) (destrel + 1);
  459.   srtr_trsort (&fpn, adf, fn, fdf, mfn, kn, prdbl, drctn, &lpn);
  460.   n = lunt (&desnseg.tobtab, &desnseg.mtobnum, TOBPTD);
  461.   size = dtrsize + fn * rfsize;
  462.   dtnew = (struct des_tob *) xmalloc (size + kn * size2b);
  463.   *(desnseg.tobtab + n) = (char *) dtnew;
  464.   bcopy ((char *) dt, (char *) dtnew, size);
  465.   ((struct des_trel *) dtnew)->keysntr = kn;
  466.   for (a = mfn, b = (u2_t *) ((char *)dtnew + size); kn != 0; kn--)
  467.     *b++ = *a++;
  468.   dtnew->prdt.prob = TREL;
  469.   dtnew->prdt.prsort = SORT;
  470.   dtnew->prdt.prdbl = prdbl;
  471.   dtnew->prdt.prdrctn = *drctn;
  472.   dtnew->osctob = 0;
  473.   dtnew->firstpn = fpn;
  474.   dtnew->lastpn = lpn;
  475.   
  476.   ans.cpncob = OK;
  477.   ans.idob.segnum = NRSNUM;
  478.   ans.idob.obnum = n;
  479.   return (ans);
  480. }
  481. struct ans_ctob
  482. flsort (struct id_ob *pidtob, u2_t kn, u2_t *mfn, char *drctn, char prdbl)
  483. {
  484.   struct des_tob *dt, *dtnew;
  485.   struct des_fltr *desfltr;
  486.   struct d_r_bd *drbd;
  487.   u2_t *a, *b, sn, fn, fdfn, size;
  488.   i2_t n;
  489.   u2_t fpn, lpn;
  490.   struct des_field *adf;
  491.   struct ans_ctob ans;
  492.   if (pidtob->segnum != NRSNUM)
  493.     {
  494.       ans.cpncob = NIOB;
  495.       return (ans);
  496.     }
  497.   dt = (struct des_tob *) * (desnseg.tobtab + pidtob->obnum);
  498.   if (dt->prdt.prob != FLTR)
  499.     {
  500.       ans.cpncob = NIOB;
  501.       return (ans);
  502.     }
  503.   fpn = dt->firstpn;
  504.   desfltr = (struct des_fltr *) dt;
  505.   sn = desfltr->pdrtf->segnr;
  506.   drbd = &desfltr->pdrtf->desrbd;
  507.   fn = drbd->fieldnum;
  508.   fdfn = drbd->fdfnum;
  509.   adf = (struct des_field *) ((char *) drbd + drbdsize);
  510.   srtr_flsort (sn, &fpn, adf, fn, fdfn, mfn, kn, prdbl, drctn, &lpn);
  511.   n = lunt (&desnseg.tobtab, &desnseg.mtobnum, TOBPTD);
  512.   size = dflsize + desfltr->selszfl;
  513.   dtnew = (struct des_tob *) xmalloc (size + kn * size2b);
  514.   *(desnseg.tobtab + n) = (char *) dtnew;
  515.   bcopy ((char *) dt, (char *) dtnew, size);
  516.   ((struct des_fltr *) dtnew)->keysnfl = kn;
  517.   for (a = mfn, b = (u2_t *) ((char *)dtnew + size); kn != 0; kn--)
  518.     *b++ = *a++;
  519.   dtnew->prdt.prsort = SORT;
  520.   if (prdbl == 'd')
  521.     dtnew->prdt.prdbl = NODBL;
  522.   else
  523.     dtnew->prdt.prdbl = DBL;
  524.   if (*drctn == 'g')
  525.     dtnew->prdt.prdrctn = GROW;
  526.   else
  527.     dtnew->prdt.prdrctn = DECR;
  528.   dtnew->osctob = 0;
  529.   dtnew->firstpn = fpn;
  530.   dtnew->lastpn = lpn;
  531.   ans.cpncob = OK;
  532.   ans.idob.segnum = NRSNUM;
  533.   ans.idob.obnum = n;
  534.   return (ans);
  535. }