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

SQL Server

开发平台:

Unix_Linux

  1. /*  extsrt.c - External sorting
  2.  *             Kernel of GNU SQL-server. Sorter   
  3.  *
  4.  * This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  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: extsrt.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "setup_os.h"
  29. #include "dessrt.h"
  30. #include "fdclsrt.h"
  31. extern i4_t NB, NFP, pinit;
  32. extern u2_t pnex, lastpnex, outpn;
  33. extern u2_t *arrpn;
  34. extern u2_t *cutfpn;
  35. extern char *outasp;
  36. extern struct A *outpage;
  37. extern u2_t offset;
  38. extern char *masp[];
  39. extern struct A mpage[];
  40. extern i4_t EXNSSIZE;
  41. extern i4_t need_free_pages;
  42. struct el_tree *
  43. extsort (i4_t M, char prdbl, char *drctn, u2_t *afn,
  44.          struct des_field *df, struct el_tree *tree)
  45. {
  46.   i4_t i, l, j, i1, v, nbnum, cutcnt;
  47.   u2_t P;
  48.   struct el_tree *ptr1, *ptr2, *ptr3, *q;
  49.   quicksort (M, prdbl, drctn, afn, df);
  50.   putkf ();
  51.   
  52.   need_free_pages = YES;
  53.   for (i = 0; pnex != lastpnex; i++)
  54.     {
  55.       arrpn[i] = pnex++;
  56.       if (i == NFP)
  57. {
  58.   NFP += EXNSSIZE;
  59.   arrpn = (u2_t *) realloc ((void *) arrpn, (size_t) NFP * size2b);
  60. }
  61.     }  
  62.   for (; i < NFP; i++)
  63.     arrpn[i] = (u2_t) ~ 0;
  64.   q = NULL;
  65.   for (cutcnt = 0; ; cutcnt = 0)
  66.     { /* The external sort by replacement selecting */
  67.       for (P = 0; P < NB;)
  68. {
  69.   if (NB > pinit)
  70.       if (NB - P + cutcnt < pinit)
  71. {
  72.   for (; P < NB; P++)
  73.     cutfpn[cutcnt++] = cutfpn[P];
  74.   NB= cutcnt;
  75.   P = 0;
  76. }
  77.   for (nbnum = 0; nbnum < pinit && P < NB; nbnum++, P++)
  78.     if ((masp[nbnum] = getpage (&mpage[nbnum], NRSNUM, cutfpn[P])) == NULL)
  79.       break;
  80.   if (nbnum == 0)
  81.     perror ("SRT.extsort: No segments for key file pages");
  82.   if (P == 1)
  83.     {
  84.       tree->pket = masp[0] + size4b;
  85.       return (tree);
  86.     }
  87.   if (nbnum == 1)
  88.     perror ("SRT.extsort: Serious error nbnum == 1");
  89.   
  90.   for (i = 0; i < nbnum; i++)
  91.     { /* initial tree */
  92.       ptr1 = tree + i;
  93.       ptr1->pket = masp[i] + size4b;
  94.       ptr1->fe = tree + (i + nbnum) / 2;
  95.       ptr1->fi = tree + i / 2;
  96.     }
  97.       m1:
  98.   l = nbnum / 2;
  99.   if (nbnum % 2 != 0)
  100.     l++;
  101.   for (j = nbnum - 1; j >= l; j--)
  102.     {
  103.       i = (2 * j) % nbnum; /* j - node counter, i - tree index */
  104.       i1 = i + 1;
  105.       ptr1 = tree + i;
  106.       ptr2 = tree + i1;
  107.       ptr3 = tree + j;
  108.       if ((v = cmpkey (afn, df, drctn, ptr1->pket, ptr2->pket)) <= 0)
  109. {
  110.   ptr3->lsr = ptr2;
  111.   ptr3->first = ptr1;
  112. }
  113.       else
  114. {
  115.   ptr3->lsr = ptr1;
  116.   ptr3->first = ptr2;
  117. }
  118.       if (prdbl == NODBL && v == 0)
  119. {
  120.   if ((nbnum = geteltr (nbnum, ptr2, i1)) == 1)
  121.     goto m2;
  122.   else
  123.     goto m1;
  124. }
  125.     }
  126.   for (; j > 0; j--)
  127.     {
  128.       i = 2 * j;
  129.       if ((i1 = i + 1) == nbnum)
  130. i1 = 0;
  131.       tree->first = tree;
  132.       ptr1 = (tree + i)->first;
  133.       ptr2 = (tree + i1)->first;
  134.       ptr3 = tree + j;
  135.       if ((v = cmpkey (afn, df, drctn, ptr1->pket, ptr2->pket)) <= 0)
  136. {
  137.   ptr3->lsr = ptr2;
  138.   ptr3->first = ptr1;
  139. }
  140.       else
  141. {
  142.   ptr3->lsr = ptr1;
  143.   ptr3->first = ptr2;
  144. }
  145.       if (prdbl == NODBL && v == 0)
  146. {
  147.   if ((nbnum = geteltr (nbnum, ptr2, i1)) == 1)
  148.     break;
  149.   else
  150.     goto m1;
  151. }
  152.     }
  153.       m2:
  154.   q = tree->lsr = (tree + 1)->first; /* The new champion */
  155.   if (NB <= pinit)
  156.     {
  157.       NB = nbnum;
  158.       return (q);
  159.     }
  160.   getptmp ();
  161.   outasp = getnew (outpage, NRSNUM, outpn);
  162.   offset = size4b;
  163.   cutfpn[cutcnt++] = outpn;   
  164.   push (putkr, tree, q, prdbl, drctn, afn, df, nbnum); /*Into key record file*/
  165.   t2bpack ((u2_t) ~0, outasp);
  166.   t2bpack (offset, outasp + size2b);
  167.   putpage (outpage, 'm');   
  168. }
  169.       NB = cutcnt;
  170.     }
  171. }