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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  next.c  - Find a row
  3.  *            Kernel of GNU SQL-server  
  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: next.c,v 1.246 1997/04/28 12:15:01 vera Exp $ */
  29. #include <assert.h>
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. #include "xmem.h"
  34. extern char **scptab;
  35. extern i2_t maxscan;
  36. static struct des_field *df;
  37. static u2_t fn_tab, fdf, slsz;
  38. static char *arrpnt[BD_PAGESIZE];
  39. static u2_t arrsz[BD_PAGESIZE];
  40. static char *selc;
  41. #define PUT_VALUE(fn, adf)                                            
  42. {                                                                
  43.     if ((pnt = arrpnt[fn]) != NULL) /* a value is present */ 
  44.       {                                                          
  45.         *sc++ = 1;                                               
  46.         if ((type = adf->field_type) != TCH && type != TFL)
  47.           {                                                      
  48.             size += size2b;                                      
  49.             t2bpack (adf->field_size, values);             
  50.             values += size2b;                                    
  51.           }                                                      
  52.         sz = arrsz[fn];                                          
  53.         size += sz;                                              
  54.         bcopy (pnt, values, sz);                                 
  55.         values += sz;                                            
  56.       }                                                          
  57.     else                                                         
  58.       *sc++ = 0;                                                 
  59. }
  60. static int
  61. ansfrm (char *sc)
  62. {
  63.   char *pnt, *values;
  64.   u2_t sz, size, type, fn;
  65.   struct des_field * adf;
  66.   values = sc + fn_tab;
  67.   size = fn_tab;
  68.   for (fn = 0; fn < fn_tab; fn++)
  69.     {
  70.       adf = df + fn;
  71.       PUT_VALUE(fn, adf);
  72.     }
  73.   return (size);
  74. }
  75. static int
  76. selfld (char *sc, u2_t fln, u2_t *fl)
  77. {
  78.   char *pnt, *values;
  79.   u2_t fnk, fn, type;
  80.   u2_t size, sz;
  81.   struct des_field * adf;
  82.   
  83.   values = sc + fln;
  84.   size = fln;
  85.   for (fn = 0; fn < fln; fn++)
  86.     {
  87.       fnk = fl[fn];
  88.       adf = df + fnk;   
  89.       PUT_VALUE(fnk, adf);
  90.     }
  91.   return (size);
  92. }
  93. static void
  94. ans_frm (struct ans_next *ans, u2_t fln, u2_t *fl)
  95. {
  96.   char *sc;
  97.   i4_t size;
  98.   
  99.   sc = ans->cadnxt;
  100.   if (fln == 0)
  101.     size = ansfrm (sc);
  102.   else
  103.     size = selfld (sc, fln, fl);
  104.   ans->csznxt = size;
  105.   ans->cotnxt = OK;
  106. }
  107. static int
  108. fndcort (struct A *pg, char *tuple)
  109. {
  110.   i4_t ans = OK;
  111.   unsigned char t;
  112.   struct A inpage;
  113.   t = *tuple & MSKCORT;
  114.   if (t == CREM || t == IDTR)
  115.     return (NCR);
  116.   if (t == IND)
  117.     {
  118.       u2_t pn2, ind2, *ai2;
  119.       char *asp2;
  120.       
  121.       ind2 = t2bunpack (tuple + 1);
  122.       pn2 = t2bunpack (tuple + 1 + size2b); 
  123.       while ((asp2 = getpg (&inpage, pg->p_sn, pn2, 's')) == NULL);
  124.       ai2 = (u2_t *) (asp2 + phsize) + ind2;
  125.       assert (*ai2 != 0);
  126.       tuple = asp2 + *ai2;
  127.     }
  128.   if (slsz != 0)
  129.     ans = tstcsel (df, fn_tab, fdf, slsz, selc, tuple, arrpnt, arrsz);
  130.   else
  131.     tuple_break (tuple, arrpnt, arrsz, df, fdf, fn_tab);    
  132.   if (ans == OK)
  133.     {
  134.       if (t == IND)
  135. {
  136.   putpg (pg, 'n');
  137.   *pg = inpage;
  138. }
  139.       return (OK);
  140.     }
  141.   else
  142.     {
  143.       if (t == IND)
  144. putpg (&inpage, 'n');
  145.       return (NCR);
  146.     }
  147. }
  148. void
  149. next (struct ans_next *ans, i4_t scnum)
  150. {
  151.   struct d_mesc *scpr;
  152.   i4_t sctype;
  153.   struct d_r_t *desrel;
  154.   u2_t pn, ind, *ai, *afi, *ali, sn, cpn;
  155.   struct des_tid tid;
  156.   char *asp = NULL;
  157.   u2_t *fl, fln, fmn;
  158.   struct A pg;
  159.   if ( scnum > maxscan)
  160.     {
  161.       ans->cotnxt = NDSC;
  162.       return;
  163.     }
  164.   scpr = (struct d_mesc *) * (scptab + scnum);
  165.   if (scpr == NULL)
  166.     {
  167.       ans->cotnxt = NDSC;
  168.       return;
  169.     }    
  170.   fln = scpr->fnsc;
  171.   if ((sctype = scpr->obsc) == SCR)
  172.     { /* relation scan */
  173.       struct d_sc_i *scind;
  174.       struct ldesscan *desscan;
  175.       u2_t size;
  176.       
  177.       scind = (struct d_sc_i *) scpr;
  178.       desscan = &scind->dessc;
  179.       desrel = (struct d_r_t *) scpr->pobsc;
  180.       sn = desrel->segnr;
  181.       df = (struct des_field *) (desrel + 1);
  182.       fdf = desrel->desrbd.fdfnum;
  183.       fn_tab = desrel->desrbd.fieldnum;      
  184.       fl = (u2_t *) (scind + 1);
  185.       fmn = scpr->fmnsc;
  186.       slsz = t2bunpack ((char *) (fl + fln + fmn));
  187.       selc = (char *) (fl + fln + fmn + 1);
  188.       pn = desscan->ctidi.tpn;
  189.       if (pn == (u2_t) ~ 0)
  190. {
  191.   ans->cotnxt = EOSCAN;
  192.   return;
  193. }    
  194.       ind = desscan->ctidi.tindex;
  195.       if (scpr->prcrt != 0)
  196. ind += 1;
  197.       do
  198. {
  199.   while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  200.   afi = (u2_t *) (asp + phsize);
  201.   ali = afi + ((struct page_head *) asp)->lastin;
  202.   for (ai = afi + ind; ai <= ali; ai++, ind++)
  203.             if (*ai != 0 && CHECK_PG_ENTRY(ai) &&
  204.                 fndcort (&pg, asp + *ai) == OK)
  205.               {
  206.                 ans_frm (ans, fln, fl);
  207.                 putpg (&pg, 'n');
  208.                 desscan->ctidi.tpn = pn;
  209.                 desscan->ctidi.tindex = ind;
  210.                 scpr->prcrt = 1;
  211.                 return;
  212.               }
  213.   putpg (&pg, 'n');
  214.   ind = 0;
  215. }
  216.       while (getnext (desscan, &pn, &size, SLOWSCAN) != EOI);
  217.       desscan->ctidi.tpn = (u2_t) ~ 0;
  218.     }
  219.   else if (sctype == SCTR)
  220.     {
  221.       struct d_sc_r *screl;
  222.       struct des_trel *destrel;
  223.       
  224.       screl = (struct d_sc_r *) scpr;
  225.       destrel = (struct des_trel *) scpr->pobsc;
  226.       df = (struct des_field *) (destrel + 1);
  227.       fdf = destrel->fdftr;
  228.       fn_tab = destrel->fieldn;      
  229.       fl = (u2_t *) (screl + 1);
  230.       fmn = scpr->fmnsc;
  231.       slsz = t2bunpack ((char *) (fl + fln + fmn));
  232.       selc = (char *) (fl + fln + fmn + 1);
  233.       pn = screl->curtid.tpn;
  234.       if (pn == (u2_t) ~ 0)
  235. {
  236.   ans->cotnxt = EOSCAN;
  237.   return;
  238. }    
  239.       ind = screl->curtid.tindex;
  240.       if (scpr->prcrt != 0)
  241. ind += 1;
  242.       for (; pn != (u2_t) ~ 0; ind = 0)
  243. {
  244.   asp = getwl (&pg, NRSNUM, pn);
  245.   afi = (u2_t *) (asp + phtrsize);
  246.   ali = afi + ((struct p_h_tr *) asp)->linptr;
  247.   for (ai = afi + ind; ai <= ali; ai++, ind++)
  248.             if (*ai != 0 && tstcsel (df, fn_tab, fdf, slsz, selc, asp + *ai, arrpnt, arrsz) != 0)
  249.               {
  250.                 ans_frm (ans, fln, fl);
  251.                 putwul (&pg, 'n');
  252.                 screl->curtid.tpn = pn;
  253.                 screl->curtid.tindex = ind;
  254.                 scpr->prcrt = 1;
  255.                 return;
  256.               }
  257.   pn = ((struct listtob *) asp)->nextpn;
  258.   putwul (&pg, 'n');
  259. }
  260.       screl->curtid.tpn = (u2_t) ~ 0;
  261.     }
  262.   else if (sctype == SCI)
  263.     { /* index scan */
  264.       struct d_sc_i *scind;
  265.       struct ldesscan *desscan;
  266.       
  267.       scind = (struct d_sc_i *) scpr;
  268.       desscan = &scind->dessc;
  269.       desrel = desscan->pdi->dri;
  270.       sn = desrel->segnr;
  271.       fl = (u2_t *) (scind + 1);
  272.       fmn = scpr->fmnsc;
  273.       slsz = t2bunpack ((char *) (fl + fln + fmn));
  274.       selc = (char *) (fl + fln + fmn + 1);
  275.       df = (struct des_field *) (desrel + 1);
  276.       fdf = desrel->desrbd.fdfnum;
  277.       fn_tab = desrel->desrbd.fieldnum;      
  278.       tid = desscan->ctidi;
  279.       if (tid.tpn == (u2_t) ~ 0)
  280. {
  281.   ans->cotnxt = EOSCAN;
  282.   return;
  283. }  
  284.       if ((scpr->prcrt == 0) || ind_tid (desscan, &tid, SLOWSCAN) == OK)
  285. {
  286.   cpn = tid.tpn;
  287.   while ((asp = getpg (&pg, sn, cpn, 's')) == NULL);
  288.   ai = (u2_t *) (asp + phsize) + tid.tindex;
  289.   if (*ai != 0 && fndcort (&pg, asp + *ai) == OK)
  290.     {
  291.               ans_frm (ans, fln, fl);
  292.       putpg (&pg, 'n');
  293.       desscan->ctidi = tid;
  294.       scpr->prcrt = 1;
  295.       return;
  296.     }
  297.   for (; ind_tid (desscan, &tid, SLOWSCAN) != EOI;)
  298.     {
  299.       if ((pn = tid.tpn) != cpn)
  300. {
  301.   putpg (&pg, 'n');
  302.   while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  303.   cpn = pn;
  304. }
  305.       ai = (u2_t *) (asp + phsize) + tid.tindex;
  306.       if (*ai != 0 && fndcort (&pg, asp + *ai) == OK)
  307. {
  308.                   ans_frm (ans, fln, fl);
  309.   putpg (&pg, 'n');
  310.   desscan->ctidi = tid;
  311.   scpr->prcrt = 1;
  312.   return;
  313. }
  314.     }
  315.           putpg (&pg, 'n');
  316. } /* if */
  317.       desscan->ctidi.tpn = (u2_t) ~ 0;
  318.     }
  319.   else
  320.     { /* filter scan */
  321.       struct d_sc_f *scfltr;
  322.       char *aspf;
  323.       u2_t nxtpn, off, fpn;
  324.       struct A fpage;
  325.       
  326.       scfltr = (struct d_sc_f *) scpr;
  327.       desrel = ((struct des_fltr *) scpr->pobsc)->pdrtf;
  328.       sn = desrel->segnr;
  329.       fl = (u2_t *) (scfltr + 1);
  330.       fmn = scpr->fmnsc;
  331.       slsz = t2bunpack ((char *) (fl + fln + fmn));
  332.       selc = (char *) (fl + fln + fmn + 1);
  333.       df = (struct des_field *) (desrel + 1);
  334.       fdf = desrel->desrbd.fdfnum;
  335.       fn_tab = desrel->desrbd.fieldnum;      
  336.       pn = (u2_t) ~ 0;
  337.       for (fpn = scfltr->pnf, nxtpn = fpn; fpn != (u2_t) ~ 0; fpn = nxtpn)
  338. {
  339.   aspf = getwl (&fpage, NRSNUM, fpn);
  340.   for (off = scfltr->offf; off < BD_PAGESIZE; off += size2b)
  341.     {
  342.       tid = *(struct des_tid *) (aspf + scfltr->offf);
  343.       nxtpn = ((struct listtob *) aspf)->nextpn;
  344.       if ((cpn = tid.tpn) != pn)
  345. {
  346.                   if (pn != (u2_t) ~ 0)
  347.                     putpg (&pg, 'n');
  348.   while ((asp = getpg (&pg, sn, cpn, 's')) == NULL);
  349. }
  350.       ai = (u2_t *) (asp + phsize) + tid.tindex;
  351.       if (*ai != 0 && fndcort (&pg, asp + *ai) == OK)
  352. {
  353.                   ans_frm (ans, fln, fl);
  354.   putpg (&pg, 'n');
  355.   scfltr->pnf = pn;
  356.   scfltr->offf = off;
  357.   scpr->prcrt = 1;
  358.   return;
  359. }
  360.     }
  361.   putwul (&fpage, 'n');
  362. }
  363.       scfltr->pnf = (u2_t) ~ 0;
  364.     }
  365.   scpr->prcrt = 0;
  366.   ans->cotnxt = EOSCAN;
  367.   return;
  368. }
  369. void
  370. readrow (struct ans_next *ans, i4_t scnum, i4_t fln, u2_t * fl)
  371. {
  372.   struct d_mesc *scpr;
  373.   struct d_r_t *desrel;
  374.   u2_t *ai;
  375.   i4_t sctype;
  376.   struct des_tid tid;
  377.   char *asp = NULL;
  378.   struct A pg;
  379.   scpr = (struct d_mesc *) * (scptab + scnum);
  380.   if (scnum >= maxscan || scpr == NULL)
  381.     {
  382.       ans->cotnxt = NCF;
  383.       return;
  384.     }
  385.   if (scpr->prcrt == 0)
  386.     {
  387.       ans->cotnxt = NCR;
  388.       return;
  389.     }
  390.   if ((sctype = scpr->obsc) == SCTR)
  391.     {
  392.       struct d_sc_r *screl;
  393.       struct des_trel *destrel;
  394.       
  395.       screl = (struct d_sc_r *) scpr;
  396.       destrel = (struct des_trel *) scpr->pobsc;
  397.       df = (struct des_field *) (destrel + 1);
  398.       fdf = destrel->fdftr;
  399.       fn_tab = destrel->fieldn;      
  400.       tid = screl->curtid;
  401.       asp = getwl (&pg, NRSNUM, tid.tpn);
  402.       ai = (u2_t *) (asp + phtrsize) + tid.tindex;
  403.       tuple_break (asp + *ai, arrpnt, arrsz, df, fdf, fn_tab);
  404.       ans_frm (ans, fln, fl);
  405.       putwul (&pg, 'n');
  406.       return;
  407.     }
  408.   else if (sctype == SCR)
  409.     { /* relation scan */
  410.       struct d_sc_i *scind;
  411.       struct ldesscan *desscan;
  412.       
  413.       scind = (struct d_sc_i *) scpr;
  414.       desscan = &scind->dessc;
  415.       desrel = (struct d_r_t *) scpr->pobsc;
  416.       tid = desscan->ctidi;
  417.     }
  418.   else if (sctype == SCI)
  419.     { /* index scan */
  420.       struct d_sc_i *scind;
  421.       struct ldesscan *desscan;
  422.       
  423.       scind = (struct d_sc_i *) scpr;
  424.       desscan = &scind->dessc;
  425.       desrel = desscan->pdi->dri;
  426.       tid = desscan->ctidi;
  427.     }
  428.   else
  429.     { /* filter scan */
  430.       struct d_sc_f *scfltr;
  431.       
  432.       scfltr = (struct d_sc_f *) scpr;
  433.       desrel = ((struct des_fltr *) scpr->pobsc)->pdrtf;
  434.       asp = getwl (&pg, NRSNUM, scfltr->pnf);
  435.       tid = *(struct des_tid *) (asp + scfltr->offf);
  436.       putwul (&pg, 'n');
  437.     }
  438.   df = (struct des_field *) (desrel + 1);
  439.   fdf = desrel->desrbd.fdfnum;
  440.   fn_tab = desrel->desrbd.fieldnum;
  441.   while ((asp = getpg (&pg, desrel->segnr, tid.tpn, 's')) == NULL);
  442.   ai = (u2_t *) (asp + phsize) + tid.tindex;
  443.   slsz = 0;
  444.   selc = NULL;
  445.   if (fndcort (&pg, asp + *ai) != OK)
  446.     {
  447.       ans->cotnxt = NCR;
  448.       return;
  449.     }
  450.   ans_frm (ans, fln, fl);
  451.   putpg (&pg, 'n');
  452.   return;
  453. }