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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  opscin.c  -  Open scanning by  a DB table index
  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: opscin.c,v 1.246 1997/04/10 06:57:28 vera Exp $ */
  29. #include "destrn.h"
  30. #include "sctp.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. #include "xmem.h"
  34. struct ans_opsc
  35. opscin (struct id_ind *pidind, i4_t mode, u2_t fln, u2_t * fl, u2_t slsz,
  36.         char *sc, u2_t diasz, char *diasc, u2_t fmn, u2_t * fml)
  37. {
  38.   u2_t fn, fdf;
  39.   struct des_field *df;
  40.   struct ldesscan *disc;
  41.   struct d_sc_i *scind;
  42.   struct ldesind *di;
  43.   struct d_r_t *desrel;
  44.   char *asp;
  45.   struct id_rel *pidrel;
  46.   struct des_tid tid;
  47.   u2_t dscsz;
  48.   i2_t n;
  49.   u2_t *ai, kn;
  50.   struct ans_opsc ans;
  51.   pidrel = &pidind->irii;
  52.   if (pidrel->urn.segnum == NRSNUM)
  53.     {
  54.       ans.cpnops = NDI;
  55.       return (ans);
  56.     }
  57.   if ((ans.cpnops = cont_id (pidind, &desrel, &di)) != OK)
  58.     return (ans);
  59.   fn = desrel->desrbd.fieldnum;
  60.   fdf = desrel->desrbd.fdfnum;
  61.   df = (struct des_field *) (desrel + 1);
  62.   if ((ans.cpnops = testcond (df, fn, fdf, fln, fl, &slsz, sc, fmn, fml)) != OK)
  63.     return (ans);
  64.   ai = (u2_t *) (di + 1);
  65.   if ((ans.cpnops = testdsc (desrel, &diasz, diasc, ai, &dscsz)) != OK)
  66.     return (ans);
  67.   if ((ans.cpnops = synlsc (RSC, pidrel, sc, slsz, fn, (u2_t *) NULL)) != OK)
  68.     return (ans);
  69.   kn = di->ldi.kifn & ~UNIQ & MSK21B;
  70.   if ((ans.cpnops = synlsc (RSC, pidrel, diasc, diasz, kn, ai)) != OK)
  71.     return (ans);
  72.   scind = (struct d_sc_i *) lusc (&n, scisize, (char *) di, SCI, mode, fln, fl, sc, slsz,
  73.   fmn, fml, diasz + size2b);
  74.   disc = &scind->dessc;
  75.   disc->pdi = di;
  76.   disc->curlpn = (u2_t) ~ 0;
  77.   asp = (char *) scind + scisize + size2b * (fln + fmn) + slsz + size2b;
  78.   if (diasz == 0)
  79.     disc->dpnsc = NULL;
  80.   else
  81.     disc->dpnsc = asp;
  82.   t2bpack (diasz, asp);
  83.   disc->dpnsval = asp + size2b + dscsz;
  84.   bcopy (diasc, asp + size2b, diasz);
  85.   disc->cur_key = NULL;
  86.   if (ind_ftid (disc, &tid, SLOWSCAN) == EOI)
  87.     {
  88.       disc->ctidi.tpn = (u2_t) ~ 0;
  89.       ans.cpnops = EOSCAN;
  90.     }
  91.   else
  92.     {
  93.       disc->ctidi.tpn = tid.tpn;
  94.       disc->ctidi.tindex = tid.tindex;
  95.       ans.cpnops = OK;
  96.     }
  97.   scind->mesci.prcrt = 0;
  98.   di->oscni++;
  99.   ans.scnum = n;
  100.   return (ans);
  101. }
  102. #define DIA_COMPRESS(diaval, lastb) 
  103. {                                   
  104.   char *a, *b;                      
  105.                                     
  106.   a = diaval;                       
  107.   b = diaval + size2b;              
  108.   if (type == T1B)                  
  109.     *a = *b;                        
  110.   else if (type == T2B)             
  111.     {                               
  112.       val2b = t2bunpack (b);        
  113.       t2bpack (val2b, a);           
  114.     }                               
  115.   else                              
  116.     {                               
  117.       val4b = t4bunpack (b);        
  118.       t4bpack (val4b, a);           
  119.     }                               
  120.   diaval += n;                      
  121.   b = diaval + size2b;              
  122.   sz = lastb - b;                   
  123.   bcopy (b, diaval, sz);            
  124.   lastb -= size2b;                  
  125. }
  126. char *
  127. pred_compress(char *diaval, char *lastb, struct des_field *df, unsigned char t)
  128. {
  129.   u2_t n, type, val2b;
  130.   i4_t val4b;
  131.   i4_t sz;
  132.   if (t == ANY || t == EQUN || t == NEQUN)
  133.     return (diaval);
  134.   n = t2bunpack (diaval);
  135.   /*      t2bpack (n, diaval);*/
  136.   type = df->field_type;
  137.   if (df->field_size < n)
  138.     return (NULL);
  139.   if (type == T1B || type == T2B || type == T4B || type == TFLOAT)
  140.     {
  141.       DIA_COMPRESS (diaval, lastb);
  142.       if (t == SS || t == SES || t == SSE || t == SESE)
  143.         {
  144.           n = t2bunpack (diaval);
  145.           if (df->field_size < n)
  146.             return (NULL);
  147.           /*       t2bpack (n, diaval);*/
  148.           DIA_COMPRESS (diaval, lastb);
  149.         }
  150.     }
  151.   else
  152.     {
  153.       diaval += size2b + n;
  154.       if (t == SS || t == SES || t == SSE || t == SESE)
  155.         {
  156.           n = t2bunpack (diaval);
  157.           if (df->field_size < n)
  158.             return (NULL);
  159.           diaval += size2b + n;
  160.         }
  161.     }
  162.   return (diaval);
  163. }
  164. static
  165. int
  166. dia_cmpr (char *diasc, u2_t * diasz, u2_t dscsz, struct des_field *df, u2_t * fnm)
  167. {
  168.   u2_t fnk;
  169.   char *lastb, *diaval;
  170.   i4_t sst;
  171.   char *scpnt;
  172.   unsigned char t;
  173.   sst = 1;
  174.   lastb = diasc + *diasz;
  175.   diaval = diasc + dscsz;
  176.   scpnt = diasc;
  177.   for (fnk = *fnm++; (t = selsc1 (&scpnt, sst++)) != ENDSC; fnk = *fnm++)
  178.     {
  179.       diaval = pred_compress (diaval, lastb, df + fnk, t);
  180.       if (diaval == NULL )
  181.         return (NCF);
  182.     }
  183.   *diasz = diaval - diasc;
  184.   return (OK);
  185. }
  186. int
  187. testdsc (struct d_r_t *desrel, u2_t * diasz, char *diasc,
  188.          u2_t * mfn, u2_t * dscsz)
  189. {
  190.   if (*diasz != 0)
  191.     {
  192.       u2_t i, fn, fdf;
  193.       i4_t sst;
  194.       char *a;
  195.       struct des_field *df;
  196.       unsigned char t;
  197.       fn = desrel->desrbd.fieldnum;
  198.       fdf = desrel->desrbd.fdfnum;
  199.       df = (struct des_field *) (desrel + 1);
  200.       a = diasc;
  201.       sst = 1;
  202.       for (i = 0; (t = selsc1 (&a, sst++)) != ENDSC && i<fn; i++)
  203. {
  204.   if (i < fdf && t == EQUN)
  205.     return (NCF);
  206.   if (t < EQ || (t > ANY && t < ENDSC))
  207.     return (NCF);
  208. }
  209.       if (t != ENDSC)
  210. return (NCF);
  211.       if (dsccal (fn, diasc, dscsz) != OK)
  212. return (NCF);
  213.       if (dia_cmpr (diasc, diasz, *dscsz, df, mfn) != OK)
  214. return (NCF);
  215.     }
  216.   return (OK);
  217. }
  218. int
  219. dsccal (u2_t fn, char *diasc, u2_t * dscsz)
  220. {
  221.   u2_t i;
  222.   i4_t sst;
  223.   char *a;
  224.   unsigned char t;
  225.   sst = 1;
  226.   a = diasc;
  227.   fn++;
  228.   for (i = 0; (t = selsc1 (&a, sst++)) != ENDSC && i < fn ; i++);
  229.   if (t != ENDSC)
  230.     return (NCF);
  231.   if (sst % 2 == 0)
  232.     a++;
  233.   *dscsz = a - diasc;
  234.   return (OK);
  235. }