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

SQL Server

开发平台:

Unix_Linux

  1. /*  tidsrt.c - Functions dealing with sort a filter by tid's
  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: tidsrt.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "xmem.h"
  29. #include "dessrt.h"
  30. #include "f1f2decl.h"
  31. #include "fdclsrt.h"
  32. extern i4_t N, NB, NFP;
  33. extern i4_t pinit;
  34. extern char *nonsense;
  35. extern char *regakr;
  36. extern char *outasp;
  37. extern struct A *outpage;
  38. extern u2_t pnex, lastpnex, freesz;
  39. extern u2_t offset;
  40. extern i4_t EXNSSIZE;
  41. extern u2_t *arrpn;
  42. extern u2_t *cutfpn;
  43. extern u2_t outpn;
  44. extern char *masp[];
  45. extern struct A mpage[];
  46. extern char *akr;
  47. extern char **regpkr;
  48. extern i4_t segsize;
  49. extern i4_t need_free_pages;
  50. void
  51. quick_sort_tid (i4_t M)
  52. {
  53.   i4_t bstek[STEKSZ];
  54.   i4_t *stek, l, r, i, j, v;
  55.   char **ptp, *curpk;
  56.   ptp = (char **) regakr;
  57.   stek = bstek;
  58.   for (l = 1, r = N;;)
  59.     {
  60.       if ((r - l) < M)
  61. { /* The simple insertion sort */
  62.   for (j = l + 1; j <= r; j++)
  63.     {
  64.       curpk = ptp[j];
  65.       for (i = j - 1; i >= l;)
  66. if ((v = cmp_tid (curpk, ptp[i])) < 0)
  67.   {
  68.     ptp[i + 1] = ptp[i];
  69.     i--;
  70.   }
  71. else
  72.   break;
  73.       ptp[i + 1] = curpk;
  74.     }
  75.   if (stek == bstek)
  76.     break;
  77.   r = *stek--;
  78.   l = *stek--;
  79.   continue;
  80. }
  81.       i = l; /* quicksort */
  82.       j = r;
  83.       curpk = ptp[l];
  84.   m1:
  85.       for (v = -1; v < 0; j--)
  86. v = cmp_tid (curpk, ptp[j]);
  87.       if (i >= j)
  88. {
  89.   ptp[i] = curpk;
  90.   goto m3;
  91. }
  92.       ptp[i++] = ptp[j];
  93.       for (v = -1; v < 0; i++)
  94. v = cmp_tid (ptp[i], curpk);
  95.       if (i < j)
  96. {
  97.   ptp[j] = ptp[i];
  98.   j--;
  99.   goto m1;
  100. }
  101.       ptp[j] = curpk;
  102.       i = j;
  103.     m3:if ((i - l) <= (r - i))
  104. {
  105.   *stek++ = i + 1;
  106.   *stek++ = r;
  107.   r = i - 1;
  108. }
  109.       else
  110. {
  111.   *stek++ = l;
  112.   *stek++ = i - 1;
  113.   l = i + 1;
  114. }
  115.     }
  116. }
  117. void
  118. puts_tid (void)
  119. {
  120.   char *asp, *a;
  121.   i4_t i;
  122.   u2_t off, fpn;
  123.   struct des_tid *tid;
  124.   asp = getnew (outpage, NRSNUM, pnex);
  125.   off = size4b;
  126.   a = asp + off;
  127.   fpn = pnex;  
  128.   for (tid = (struct des_tid *) regakr, i = 0; i < N; i++, tid++)
  129.     {
  130.       if ((tidsize + off) > BD_PAGESIZE)
  131. {
  132.   ++pnex;
  133.   if (pnex == lastpnex)
  134.     addext ();
  135.   t2bpack (pnex, asp);
  136.   t2bpack (off, asp + size2b);
  137.   putpage (outpage, 'm');
  138.   asp = getnew (outpage, NRSNUM, pnex);
  139.   off = size4b;
  140.   a = asp + off;
  141. }
  142.       bcopy ((char *) tid, a, tidsize);
  143.       a += tidsize;
  144.       off += tidsize;
  145.     }
  146.   t2bpack ((u2_t) ~ 0, asp);
  147.   t2bpack (off, asp + size2b);
  148.   putpage (outpage, 'm');
  149.   cutfpn[NB] = fpn;
  150.   NB++;
  151.   pnex++;
  152.   if (pnex == lastpnex)
  153.     addext ();
  154.   akr = regakr;
  155.   freesz = segsize;  
  156. }
  157. struct el_tree *
  158. ext_sort_tid (i4_t M, struct el_tree *tree)
  159. {
  160.   i4_t i, l, j, i1, v, nbnum, cutcnt;
  161.   u2_t P;
  162.   struct el_tree *ptr1, *ptr2, *ptr3, *q;
  163.   quick_sort_tid (M);
  164.   puts_tid ();
  165.   
  166.   need_free_pages = YES;
  167.   for (i = 0; pnex != lastpnex; i++)
  168.     {
  169.       arrpn[i] = pnex++;
  170.       if (i == NFP)
  171. {
  172.   NFP += EXNSSIZE;
  173.   arrpn = (u2_t *) realloc ((void *) arrpn, (size_t) NFP * size2b);
  174. }
  175.     }
  176.   for (; i < NFP; i++)
  177.     arrpn[i] = (u2_t) ~ 0;
  178.   q = NULL;
  179.   for (cutcnt = 0; ; cutcnt = 0)
  180.     { /* The external sort by replacement selecting */
  181.       for (P = 0; P < NB;)
  182. {
  183.   if (NB > pinit)
  184.     if (NB - P + cutcnt < pinit)
  185.       {
  186. for (i = P; P < NB; i++)
  187.   cutfpn[cutcnt++] = cutfpn[i];
  188. NB= cutcnt;
  189.       }   
  190.   for (nbnum = 0; nbnum < pinit && P < NB; nbnum++, P++)
  191.     if ((masp[nbnum] = getpage (&mpage[nbnum], NRSNUM, cutfpn[P])) == NULL)
  192.       break;
  193.   if (nbnum == 0)
  194.     perror ("SRT.ext_sort_tid: No segments for key file pages");
  195.   if (P == 1)
  196.     {
  197.       tree->pket = masp[0] + size4b;
  198.       return (tree);
  199.     }
  200.   if (nbnum == 1)
  201.     perror ("SRT.extsort: Serious error nbnum == 1");     
  202.   for (i = 0; i < nbnum; i++)
  203.     { /* initial tree */
  204.       ptr1 = tree + i;
  205.       ptr1->pket = masp[i] + phfsize;
  206.       ptr1->fe = tree + (i + nbnum) / 2;
  207.       ptr1->fi = tree + i / 2;
  208.     }
  209.   l = nbnum / 2;
  210.   if (nbnum % 2 != 0)
  211.     l++;
  212.   for (j = nbnum - 1; j >= l; j--)
  213.     {
  214.       i = (2 * j) % nbnum; /* j - node counter, i - tree index */
  215.       i1 = i + 1;
  216.       ptr1 = tree + i;
  217.       ptr2 = tree + i1;
  218.       ptr3 = tree + j;
  219.       if ((v = cmp_tid (ptr1->pket, ptr2->pket)) <= 0)
  220. {
  221.   ptr3->lsr = ptr2;
  222.   ptr3->first = ptr1;
  223. }
  224.       else
  225. {
  226.   ptr3->lsr = ptr1;
  227.   ptr3->first = ptr2;
  228. }
  229.     }
  230.   for (; j > 0; j--)
  231.     {
  232.       i = 2 * j;
  233.       if ((i1 = i + 1) == nbnum)
  234. i1 = 0;
  235.       tree->first = tree;
  236.       ptr1 = (tree + i)->first;
  237.       ptr2 = (tree + i1)->first;
  238.       ptr3 = tree + j;
  239.       if ((v = cmp_tid (ptr1->pket, ptr2->pket)) <= 0)
  240. {
  241.   ptr3->lsr = ptr2;
  242.   ptr3->first = ptr1;
  243. }
  244.       else
  245. {
  246.   ptr3->lsr = ptr1;
  247.   ptr3->first = ptr2;
  248. }
  249.     }
  250.   q = tree->lsr = (tree + 1)->first; /* The new champion */
  251.   if (NB <= pinit)
  252.     {
  253.       NB = nbnum;
  254.       return (q);
  255.     }
  256.   getptmp ();
  257.   outasp = getnew (outpage, NRSNUM, outpn);   
  258.   offset = size4b;
  259.   cutfpn[cutcnt++] = outpn;   
  260.   push_tid (middle_put_tid, tree, q, nbnum);
  261.   t2bpack ((u2_t) ~0, outasp);
  262.   t2bpack (offset, outasp + size2b);
  263.   putpage (outpage, 'm');   
  264. }
  265.       NB = cutcnt;
  266.     }
  267. }
  268. void
  269. push_tid (void (*pnt_puttid) (), struct el_tree *tree, struct el_tree *q, i4_t nbnum)
  270. {
  271.   struct el_tree *ptree, *qq;
  272.   char *pkr, *asp, *a;
  273.   i4_t v;
  274.   u2_t off, size, pn;
  275.   struct A *ppage;
  276.   if (nbnum != 1)
  277.     {
  278.       for (;; )
  279. { /*To find a loser */
  280.   (*pnt_puttid) (q->pket);
  281.   nbnum = get_el_tr_tid (nbnum, q, q - tree);
  282.   for (ptree = q->fe ;; ptree = ptree->fi)
  283.     {
  284.       if ((v = cmp_tid (ptree->lsr->pket, q->pket)) < 0)
  285. {
  286.   qq = q;
  287.   q = ptree->lsr;
  288.   ptree->lsr = qq;
  289. }
  290.       if (ptree == tree + 1)
  291. break;
  292.     }
  293.           if (nbnum == 1)
  294.             break;
  295. }
  296.     }
  297.   v = q - tree;
  298.   a = masp[v];
  299.   off = t2bunpack (a + size2b);
  300.   pkr = q->pket;
  301.   pn = t2bunpack (a);
  302.   ppage = &mpage[v];
  303.   for (size = a + off - pkr; size != 0; size -= tidsize)
  304.     (*pnt_puttid) (pkr);
  305.   putpage (ppage, 'n');  
  306.   for (; pn != (u2_t) ~ 0;)
  307.     {
  308.       asp = getpage (ppage, NRSNUM, pn);
  309.       pkr = asp + size4b;
  310.       size = t2bunpack (asp + size2b) - size4b;
  311.       for (; size != 0; size -= tidsize)
  312. (*pnt_puttid) (pkr);
  313.       pn = t2bunpack (asp);      
  314.       putpage (ppage, 'n');      
  315.     }
  316. }
  317. int
  318. get_el_tr_tid (i4_t nbnum, struct el_tree *q, i4_t i)
  319. {
  320.   char *pkr;
  321.   pkr = q->pket;
  322.   pkr += tidsize;
  323.   return (next_el_tree (nbnum, q, i, pkr));
  324. }
  325. int
  326. cmp_tid (char *pnt1, char *pnt2)
  327. {
  328.   i4_t i, v;
  329.   for (i = 0; i < 2; i++)
  330.     {
  331.       if ((v = f2b (pnt1, pnt2, size2b, size2b)) != 0)
  332. return (v);
  333.       pnt1 += size2b;
  334.       pnt2 += size2b;
  335.     }
  336.   return (0);
  337. }