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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  push.c - Push  a sorted segment of records
  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: push.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "setup_os.h"
  30. #include "dessrt.h"
  31. #include "fdclsrt.h"
  32. extern i4_t NFP, pinit;
  33. extern char *masp[];
  34. extern u2_t *arrpn;
  35. extern struct A mpage[];
  36. extern char *nonsense;
  37. extern char *outasp;
  38. extern struct A *outpage;
  39. extern i4_t need_free_pages;
  40. void
  41. push (void (*putr1) (), struct el_tree *tree, struct el_tree *q,
  42.       char prdbl, char *drctn, u2_t *afn, struct des_field *df, i4_t nbnum)
  43. {
  44.   struct el_tree *ptree, *qq;
  45.   char *pkr, *asp, *last_pnt;
  46.   i4_t v;
  47.   u2_t pn, off;
  48.   struct A *ppage;
  49.   if (nbnum != 1)
  50.     {
  51.       for (;;)
  52. {
  53.   (*putr1) (q->pket);
  54.         m1:
  55.   nbnum = geteltr (nbnum, q, q - tree);
  56.   for (ptree = q->fe ;; ptree = ptree->fi)
  57.     {
  58.       if ((v = cmpkey (afn, df, drctn, ptree->lsr->pket, q->pket)) < 0)
  59. {
  60.   qq = q;
  61.   q = ptree->lsr;
  62.   ptree->lsr = qq;
  63. }
  64.       if (prdbl == NODBL && v == 0)
  65. goto m1;
  66.       if (ptree == tree + 1)
  67. break;
  68.     }
  69.           if (nbnum == 1)
  70.             break;
  71. }
  72.     }
  73.   v = q - tree;
  74.   assert( v < PINIT );
  75.   assert( v >= 0    );
  76.   asp = masp[v];
  77.   pkr = q->pket;
  78.   assert( pkr >= asp );
  79.   pn = t2bunpack (asp);
  80.   off = t2bunpack (asp + size2b);
  81.   ppage = &mpage[v];
  82.   last_pnt = asp + off;
  83.   for (; pkr < last_pnt; pkr += t2bunpack (pkr))
  84.     (*putr1) (pkr);
  85.   putpage (ppage, 'n');
  86.   for (; pn != (u2_t) ~ 0;)
  87.     {
  88.       asp = getpage (ppage, NRSNUM, pn);
  89.       pkr = asp + size4b;
  90.       off = t2bunpack (asp + size2b);
  91.       last_pnt = asp + off;
  92.       for (; pkr < last_pnt; pkr += t2bunpack (pkr)) 
  93.         (*putr1) (pkr);
  94.       pn = t2bunpack (asp);
  95.       putpage (ppage, 'n');
  96.     }
  97. }
  98. int
  99. geteltr (i4_t nbnum, struct el_tree *q, i4_t i)
  100. {
  101.   char *pkr;
  102.   u2_t size;
  103.   
  104.   assert( i < PINIT );
  105.   assert( i >= 0    );
  106.   pkr = q->pket;
  107.   size = t2bunpack (pkr);
  108.   pkr += size;
  109.   return (next_el_tree (nbnum, q, i, pkr));
  110. }
  111. int
  112. next_el_tree (i4_t nbnum, struct el_tree *q, i4_t i, char *pkr)
  113. {
  114.   char *a;
  115.   u2_t off;
  116.   
  117.   assert( i < PINIT );
  118.   assert( i >= 0    );
  119.   a = masp[i];
  120.   off = t2bunpack (a + size2b);
  121.   if (pkr == (a + off))
  122.     {
  123.       u2_t pn;
  124.       pn = t2bunpack (a);
  125.       putpage (&mpage[i], 'n');
  126.       if (pn == (u2_t) ~ 0)
  127. {
  128.   q->pket = nonsense;
  129.   nbnum--;
  130. }
  131.       else
  132. {
  133.   if (need_free_pages == YES)
  134.     {
  135.               i4_t n;
  136.       for (n = 0; n < NFP; n++)
  137. if (arrpn[n] == (u2_t) ~ 0)
  138.   {
  139.     arrpn[n] = mpage[i].p_pn;
  140.     break;
  141.   }
  142.       if (n == NFP)
  143. {
  144.   NFP += pinit;
  145.   arrpn = (u2_t *) realloc ((void *) arrpn, (size_t) NFP * size2b);
  146.                   n = NFP - pinit;
  147.                   arrpn[n] = mpage[i].p_pn;
  148.   for (n++; n < NFP; n++)
  149.     arrpn[n] = (u2_t) ~ 0;
  150. }
  151.     }
  152.   masp[i] = getpage (&mpage[i], NRSNUM, pn);
  153.   q->pket = masp[i] + size4b;
  154. }
  155.     }
  156.   else
  157.     q->pket = pkr;
  158.   return (nbnum);
  159. }