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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  puts.c - Put a next record into temporary object page
  3.  *           Kernel of GNU SQL-server. Sorter    
  4.  *
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: puts.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "dessrt.h"
  30. #include "pupsi.h"
  31. #include "fdclsrt.h"
  32. #include "xmem.h"
  33. extern i4_t NFP;
  34. extern u2_t *arrpn;
  35. extern u2_t inpn, outpn, offset, pnex, lastpnex, freesz;
  36. extern char *outasp;
  37. extern char *inasp;
  38. extern i4_t EXNSSIZE;
  39. extern struct A *outpage, *inpage;
  40. void
  41. putkr (char *pkr)
  42. {
  43.   u2_t size;
  44.   
  45.   size = t2bunpack(pkr);
  46.   middleput (pkr, size);
  47. }
  48. void
  49. middleput ( char *pkr, u2_t size)
  50. {
  51.   if (offset + size > BD_PAGESIZE)
  52.     {   /* get new page for output middle record file */
  53.       getptmp ();
  54.       t2bpack (outpn, outasp);
  55.       t2bpack (offset, outasp + size2b);
  56.       putpage (outpage, 'm');
  57.       outasp = getnew (outpage, NRSNUM, outpn);
  58.       offset = size4b;
  59.     }
  60.   bcopy (pkr, outasp + offset, size);
  61.   offset += size;
  62. }
  63. void
  64. putcrt (char *pkr)
  65. {
  66.   char *a, *cort;
  67.   struct p_h_tr *phtr;
  68.   u2_t pn, ind, *ai, *afi, size, corsize;
  69.   pn = t2bunpack(pkr + size2b);
  70.   ind = t2bunpack(pkr + 2*size2b);
  71.   assert( ind < BD_PAGESIZE/sizeof(*ai) );
  72.   if (pn != inpn)
  73.     {
  74.       putpage (inpage, 'n');
  75.       inasp = getpage (inpage, NRSNUM, pn);
  76.       inpn = pn;
  77.     }
  78.   afi = (u2_t *) (inasp + phtrsize);
  79.   ai = afi + ind;
  80.   corsize = calsc (afi, ai);
  81.   size = corsize + size2b;
  82.   assert( *ai <= BD_PAGESIZE );
  83.   cort = inasp + *ai;
  84.   if (freesz < size)
  85.     { /* get new page of the sort temporary relation */
  86.       
  87.       getptob ();
  88.       freesz = BD_PAGESIZE - phtrsize;
  89.       phtr = (struct p_h_tr *) outasp;
  90.       phtr->linptr = 0;
  91.       a = BD_PAGESIZE + outasp;
  92.       ai = (u2_t *) (outasp + phtrsize);
  93.       *ai = BD_PAGESIZE;
  94.     }
  95.   else
  96.     {
  97.       phtr = (struct p_h_tr *) outasp;
  98.       if (freesz == BD_PAGESIZE - phtrsize)
  99. {
  100.   phtr->linptr = 0;
  101.   a = BD_PAGESIZE + outasp;
  102.   ai = (u2_t *) (outasp + phtrsize);
  103.   *ai = BD_PAGESIZE;
  104. }
  105.       else
  106. {
  107.   ai = (u2_t *) (outasp + phtrsize) + phtr->linptr;
  108.   a = outasp + *ai;
  109.   phtr->linptr += 1;
  110.   ai++;
  111. }
  112.     }
  113.   a -= corsize;
  114.   *ai = a - outasp;
  115.   bcopy (cort, a, corsize);
  116.   freesz -= size;
  117. }
  118. void
  119. puttid (char *pkr)
  120. {
  121.   pkr += size2b;
  122.   put_tid (pkr);
  123. }
  124. void
  125. put_tid (char *pkr)
  126. {
  127.   if (offset + tidsize > BD_PAGESIZE)
  128.     { /* get new page of sort filter */
  129.       getptob ();
  130.       offset = phfsize;
  131.     }
  132.   bcopy (pkr, outasp + offset, tidsize);
  133.   offset += tidsize;
  134.   ((struct p_h_f *) outasp)->freeoff = offset;
  135. }
  136. void
  137. middle_put_tid (char *pkr)
  138. {
  139.   middleput (pkr, tidsize);
  140. }
  141. void
  142. getptob (void)
  143. {
  144.   u2_t oldpn;
  145.   oldpn = pnex++;
  146.   if (pnex == lastpnex)
  147.     { /* get new extent */
  148.       pnex = getext ();
  149.       lastpnex = pnex + EXNSSIZE;
  150.     }
  151.   ((struct listtob *) outasp)->nextpn = pnex;
  152.   putpage (outpage, 'm');
  153.   outasp = getnew (outpage, NRSNUM, pnex);
  154.   outpn = pnex;
  155.   ((struct listtob *) outasp)->prevpn = oldpn;
  156. }
  157. u2_t 
  158. calsc ( u2_t *afi, u2_t *ai)
  159. {
  160.   u2_t *aci;
  161.   assert(afi <= ai + BD_PAGESIZE/sizeof(*ai));
  162.   for (aci = ai - 1; aci >= afi && *aci == 0; aci--);
  163.   if (aci < afi)
  164.     return (BD_PAGESIZE - *ai);
  165.   else
  166.     return (*aci - *ai);
  167. }
  168. void
  169. getptmp (void)
  170. {
  171.   i4_t i;
  172.   for (i = 0; i < NFP; i++)
  173.     if (arrpn[i] != (u2_t) ~ 0)
  174.       {
  175. outpn = arrpn[i];
  176. arrpn[i] = (u2_t) ~ 0;
  177. break;
  178.       }
  179.   if (i == NFP)
  180.     {
  181.       u2_t pn;
  182.       addext ();
  183.       for (pn = pnex, i = 0; i < EXNSSIZE; i++)
  184. arrpn[i] = pn++;
  185.       outpn = pnex++;
  186.       arrpn[0] = (u2_t) ~ 0;      
  187.     }
  188. }