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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  sort.c - Sort a temporary table, a filter by keys values and a filter by tids
  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: sort.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "setup_os.h"
  30. #include "dessrt.h"
  31. #include "pupsi.h"
  32. #include "sctp.h"
  33. #include "fdclsrt.h"
  34.  
  35. /*------------Global sort variables -----------------------*/
  36. i4_t N;
  37. i4_t NFP;
  38. i4_t NE;
  39. i4_t NB;
  40. u2_t kn;
  41. u2_t fdfn;
  42. u2_t trn;
  43. i4_t EXNSSIZE;
  44. u2_t pnex,lastpnex;
  45. u2_t inpn,outpn;
  46. u2_t freesz;
  47. u2_t offset;
  48. char *adrseg;
  49. char *regakr;
  50. char *akr;
  51. char **regpkr;
  52. struct A *outpage,*inpage;
  53. u2_t *arrpn;
  54. u2_t *arrfpn;
  55. u2_t *cutfpn;
  56. struct A mpage[PINIT];
  57. char *masp[PINIT];
  58. char *outasp;
  59. char *inasp;
  60. char *nonsense;
  61. COST cost;
  62. i4_t pinit;
  63. i4_t need_free_pages;
  64. /*---------------------------------------------------------*/
  65. extern i4_t segsize;
  66.  
  67. #define PRINT(x) PRINTF(x) 
  68. int
  69. trsort(u2_t *fpn, struct des_field *adf,
  70.        u2_t *mfn, char prdbl, char *drctn)
  71. {
  72.   char *asp;
  73.   u2_t pn, ind, *ai, *ali;
  74.   struct A page[2];
  75.   struct el_tree *q = NULL;
  76.   inpage = page;
  77.   outpage = page + 1;
  78.   
  79.   PRINT (("SRT: trsort:    trn = %d,    kn = %d,     fdfn = %dn",
  80.           trn, kn, fdfn));
  81.   
  82.   bgnng ();
  83.   for (pn = *fpn; pn != (u2_t) ~ 0;)
  84.     {
  85.       asp = getpage (inpage, NRSNUM, pn);
  86.       ai = (u2_t *) (asp + phtrsize);
  87.       ali = ai + ((struct p_h_tr *) asp)->linptr;
  88.       if (ai == ali && pn == *fpn)
  89. {
  90.   outpn = pn;
  91.   goto end;
  92. }
  93.       for (ind = 0; ai <= ali; ai++, ind++)
  94.         if (*ai != 0)
  95.           rkfrm (asp + *ai, pn, ind, prdbl, drctn, MINIT, adf, mfn);
  96.       pn = ((struct listtob *) asp)->nextpn;
  97.       putpage (inpage, 'n');
  98.     }
  99.   PRINT (("SRT: trsort:  2 N = %d, kn = %d, fdfn = %dn", N, kn, fdfn));  
  100.   
  101.   if (NB == 0)
  102.     {
  103.       char *pkr;
  104.       i4_t i;
  105.       NE = 0;
  106.       quicksort (MINIT, prdbl, drctn, mfn, adf);      
  107.       *fpn = outpn = pnex;
  108.       outasp = getnew (outpage, NRSNUM, pnex);
  109.       ((struct listtob *) outasp)->prevpn = (u2_t) ~ 0;
  110.       freesz = BD_PAGESIZE - phtrsize;
  111.       for ( i = 0; i < N; i++)
  112. if (regpkr[i] != nonsense)
  113.   break;
  114.       inpn = t2bunpack (regpkr[i] + size2b);
  115.       inasp = getpage (inpage, NRSNUM, inpn);
  116.       for ( ; i < N; i++)
  117. {
  118.   pkr = regpkr[i];
  119.   if (pkr != nonsense)
  120.     putcrt (pkr);
  121. }
  122.     }
  123.   else
  124.     {
  125.       char *a;
  126.       struct el_tree tree[PINIT];
  127.       q = extsort (MINIT, prdbl, drctn, mfn, adf, tree);
  128.       a = q->pket + size2b;
  129.       inpn = t2bunpack (a);
  130.       inasp = getpage (inpage, NRSNUM, inpn);
  131.       outpn = getfpn ();
  132.       *fpn = outpn;
  133.       freesz = BD_PAGESIZE - phtrsize;
  134.       need_free_pages = NO;
  135.       push (putcrt, tree, q, prdbl, drctn, mfn, adf, NB);
  136.     }
  137.   ((struct listtob *) outasp)->nextpn = (u2_t) ~ 0;
  138.   putpage (outpage, 'm');  
  139.   
  140. end:
  141.   putpage (inpage, 'n');
  142.   ADMT_putext (arrfpn, NE);
  143.   return (outpn);
  144. }
  145. int
  146. flsort(u2_t segn, u2_t *fpn, struct des_field *adf,
  147.        u2_t *mfn, char prdbl, char *drctn)
  148. {
  149.   char *asp, *aspfl, *lastb;
  150.   u2_t pn, ind, flpn, *ai, *afi, oldpn;
  151.   struct el_tree *q = NULL;
  152.   struct des_tid *tid;
  153.   struct A page[3], *inflpage;
  154.   
  155.   inpage = page;
  156.   outpage = page + 1;
  157.   inflpage = page + 2;
  158.   
  159.   PRINT (("SRT: flsort:    trn = %d,    kn = %d,     fdfn = %dn",
  160.           trn, kn, fdfn));
  161.   
  162.   bgnng ();
  163.   for (flpn = *fpn; flpn != (u2_t) ~ 0;)
  164.     {
  165.       aspfl = getpage (inflpage, NRSNUM, flpn);
  166.       lastb = aspfl + ((struct p_h_f *) aspfl)->freeoff;
  167.       tid = (struct des_tid *) (aspfl + phfsize);
  168.       oldpn = tid->tpn;
  169.       asp = getpage (inpage, segn, oldpn);
  170.       afi = (u2_t *) (asp + phsize);
  171.       for (; tid < (struct des_tid *) lastb; tid++)
  172. {
  173.   pn = tid->tpn;
  174.   if (oldpn != pn)
  175.     {
  176.       putpage (inpage, 'n');
  177.       asp = getpage (inpage, segn, pn);
  178.       oldpn = pn;
  179.       afi = (u2_t *) (asp + phsize);
  180.     }
  181.   ind = tid->tindex;
  182.   ai = afi + ind;
  183.   if (*ai != 0)
  184.     rkfrm (asp + *ai, pn, ind, prdbl, drctn, MINIT, adf, mfn);
  185. }
  186.       flpn = ((struct listtob *) aspfl)->nextpn;
  187.       putpage (inflpage, 'n');      
  188.     }
  189.   if (NB == 0)
  190.     {
  191.       char *pkr;
  192.       i4_t i;
  193.       NE = 0;
  194.       quicksort (MINIT, prdbl, drctn, mfn, adf);      
  195.       *fpn = outpn = pnex;
  196.       outasp = getnew (outpage, NRSNUM, pnex);
  197.       ((struct listtob *) outasp)->prevpn = (u2_t) ~ 0;
  198.       offset = phfsize;
  199.       for ( i = 0; i < N; i++)
  200. if (regpkr[i] != nonsense)
  201.   break;
  202.       inpn = t2bunpack (regpkr[i] + size2b);
  203.       inasp = getpage (inpage, NRSNUM, inpn);
  204.       for ( ; i < N; i++)
  205. {
  206.   pkr = regpkr[i];
  207.   if (pkr != nonsense)
  208.     puttid (pkr);
  209. }
  210.     }
  211.   else
  212.     {
  213.       struct el_tree tree[PINIT];
  214.       q = extsort (MINIT, prdbl, drctn, mfn, adf, tree);
  215.       inpn = t2bunpack (q->pket + size2b);
  216.       inasp = getpage (inpage, NRSNUM, inpn);
  217.       outpn = getfpn ();
  218.       *fpn = outpn;
  219.       offset = phfsize;
  220.       need_free_pages = NO;      
  221.       push (puttid, tree, q, prdbl, drctn, mfn, adf, NB);
  222.     }
  223.   ((struct listtob *) outasp)->nextpn = (u2_t) ~ 0;
  224.   putpage (outpage, 'm');   
  225.   putpage (inpage, 'n');
  226.   ADMT_putext (arrfpn, NE);
  227.   return (outpn);
  228. }
  229. int
  230. tidsort (u2_t * fpn)
  231. {
  232.   char *aspfl, *lastb;
  233.   i4_t recsz;
  234.   u2_t flpn;
  235.   struct el_tree *q = NULL;
  236.   struct des_tid *tid;
  237.   struct A page[2];
  238.   inpage = page;
  239.   outpage = page + 1;
  240.   
  241.   PRINT (("SRT: tidsort:    trn = %dn", trn));
  242.   
  243.   bgnng ();
  244.   fdfn = 2;
  245.   kn = 2;
  246.   recsz = 2 * size2b;
  247.   for (flpn = *fpn; flpn != (u2_t) ~ 0;)
  248.     {
  249.       aspfl = getpage (inpage, NRSNUM, flpn);
  250.       lastb = aspfl + ((struct p_h_f *) aspfl)->freeoff;
  251.       tid = (struct des_tid *) (aspfl + phfsize);
  252.       for (; tid < (struct des_tid *) lastb; tid++)
  253. {
  254.   if (freesz < recsz)
  255.     { /* initial cut form */
  256.       quick_sort_tid (MINIT);
  257.       puts_tid ();
  258.       N = 0;
  259.       if ((NB % pinit) == 0)
  260. cutfpn = (u2_t *) realloc ((void *) cutfpn,
  261.                                             (size_t) (pinit + NB) * size2b);
  262.     }
  263.           bcopy ((char *) tid, akr, recsz);
  264.           akr += recsz;
  265.   freesz -= recsz;
  266. }
  267.       flpn = ((struct listtob *) aspfl)->nextpn;
  268.       putpage (inpage, 'n');      
  269.     }
  270.   if (NB == 0)
  271.     {
  272.       i4_t i;
  273.       NE = 0;
  274.       quick_sort_tid (MINIT);      
  275.       *fpn = outpn = pnex;
  276.       outasp = getnew (outpage, NRSNUM, pnex);
  277.       ((struct listtob *) outasp)->prevpn = (u2_t) ~ 0;
  278.       offset = phfsize;
  279.       for (i = 0; i < N; i++, regakr += tidsize)
  280. put_tid (regakr);
  281.     }
  282.   else
  283.     {
  284.       struct el_tree tree[PINIT];
  285.       q = ext_sort_tid (MINIT, tree);
  286.       outpn = getfpn ();
  287.       *fpn = outpn;
  288.       offset = phfsize;
  289.       freesz = BD_PAGESIZE - offset;
  290.       need_free_pages = NO;      
  291.       push_tid (put_tid, tree, q, N);
  292.     }
  293.   ((struct listtob *) outasp)->nextpn = (u2_t) ~ 0;
  294.   putpage (outpage, 'm');    
  295.   ADMT_putext (arrfpn, NE);
  296.   return (outpn);
  297. }
  298. void
  299. bgnng (void)
  300. {
  301.   cost = (COST) 0;
  302.   N = 0;
  303.   NB = 0;
  304.   NE = 0;
  305.   addext ();
  306.   regakr = adrseg;
  307.   regpkr = (char **) (adrseg + segsize);
  308.   freesz = segsize;
  309.   akr = regakr;
  310. }
  311. u2_t 
  312. getfpn (void)
  313. {
  314.   pnex = getext ();
  315.   lastpnex = pnex + EXNSSIZE;
  316.   outasp = getnew (outpage, NRSNUM, pnex);
  317.   ((struct listtob *) outasp)->prevpn = (u2_t) ~ 0;
  318.   return (pnex);
  319. }
  320. void
  321. addext (void)
  322. {
  323.   pnex = getext ();
  324.   arrfpn[NE++] = pnex;
  325.   lastpnex = pnex + EXNSSIZE;
  326.   if ((NE % pinit) == 0)
  327.     arrfpn = (u2_t *) realloc ((void *) arrfpn, (size_t) (NE + pinit) * size2b);
  328. }