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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  opscrl.c  -  Open scanning of a DB table by itself
  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: opscrl.c,v 1.246 1997/04/17 11:03:20 vera Exp $ */
  29. #include "destrn.h"
  30. #include "sctp.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. extern struct des_nseg desnseg;
  34. struct ans_opsc
  35. opscrel (struct id_rel *pidrel, i4_t mode, u2_t fnum, u2_t * fl,
  36.          u2_t slsz, char *sc, u2_t fmnum, u2_t * fml)
  37. {
  38.   struct des_field *df;
  39.   u2_t fn, fdf;
  40.   i2_t num;
  41.   struct ans_opsc ans;
  42.   u2_t sn, pn;
  43.   sn = pidrel->urn.segnum;
  44.   if (sn == NRSNUM)
  45.     {
  46.       struct d_sc_r *screl;
  47.       struct des_trel *destrel;
  48.       u2_t ntob;
  49.       ntob = pidrel->urn.obnum;
  50.       if (ntob > desnseg.mtobnum)
  51. {
  52.   ans.cpnops = NIOB;
  53.   return (ans);
  54. }
  55.       destrel = (struct des_trel *) * (desnseg.tobtab + ntob);
  56.       if (destrel == NULL)
  57. {
  58.   ans.cpnops = NIOB;
  59.   return (ans);
  60. }
  61.       if (((struct prtob *) destrel)->prob != TREL)
  62. {
  63.   ans.cpnops = NIOB;
  64.   return (ans);
  65. }
  66.       fn = destrel->fieldn;
  67.       fdf = destrel->fdftr;
  68.       df = (struct des_field *) (destrel + 1);
  69.       if ((ans.cpnops = testcond (df, fn, fdf, fnum, fl, &slsz, sc, fmnum, fml)) != OK)
  70. return (ans);
  71.       screl = (struct d_sc_r *) lusc (&num, scrsize, (char *) destrel, SCTR, mode,
  72.       fnum, fl, sc, slsz, fmnum, fml, 0);
  73.       pn = destrel->tobtr.firstpn;
  74.       if (pn == (u2_t) ~ 0)
  75. {
  76.   ans.cpnops = EOSCAN;
  77. }
  78.       else
  79. {
  80.   destrel->tobtr.osctob++;
  81.   ans.cpnops = OK;
  82. }
  83.       screl->curtid.tpn = pn;
  84.       screl->curtid.tindex = 0;
  85.       screl->mescr.prcrt = 0;
  86.       screl->memtid.tpn = (u2_t) ~ 0;
  87.     }
  88.   else
  89.     {
  90.       struct d_sc_i *scind;
  91.       struct ldesscan *disc;
  92.       i4_t rep;
  93.       struct d_r_t *desrel;
  94.       u2_t size;
  95.       if ((ans.cpnops = cont_fir (pidrel, &desrel)) != OK)
  96. return (ans);
  97.       fn = desrel->desrbd.fieldnum;
  98.       fdf = desrel->desrbd.fdfnum;
  99.       df = (struct des_field *) (desrel + 1);
  100.       if ((ans.cpnops = testcond (df, fn, fdf, fnum, fl, &slsz, sc, fmnum, fml)) != OK)
  101. return (ans);
  102.       if ((ans.cpnops = synlsc (RSC, pidrel, sc, slsz, fn, NULL)) != OK)
  103. return (ans);
  104.       scind = rel_scan (sn, pidrel->urn.obnum, (char *) desrel, &num,
  105. fnum, fl, sc, slsz, fmnum, fml);
  106.       disc = &scind->dessc;
  107.       rep = fgetnext (disc, &pn, &size, SLOWSCAN);
  108.       if (rep == EOI)
  109. {
  110.   pn = (u2_t) ~ 0;
  111.   ans.cpnops = EOSCAN;
  112. }
  113.       else
  114. {
  115.   desrel->oscnum++;
  116.   ans.cpnops = OK;
  117. }
  118.       disc->ctidi.tpn = pn;
  119.       disc->ctidi.tindex = 0;
  120.       scind->mesci.prcrt = 0;
  121.       disc->mtidi.tpn = (u2_t) ~ 0;
  122.     }
  123.   ans.scnum = num;
  124.   return (ans);
  125. }
  126. static
  127. int
  128. sel_cmpr (char *diasc, u2_t * diasz, u2_t dscsz, struct des_field *df)
  129. {
  130.   u2_t fnk;
  131.   char *lastb, *diaval;
  132.   i4_t sst;
  133.   unsigned char t;
  134.   char *scpnt;
  135.   sst = 1;
  136.   lastb = diasc + *diasz;
  137.   diaval = diasc + dscsz;
  138.   scpnt = diasc;
  139.   for (fnk = 0; (t = selsc1 (&scpnt, sst++)) != ENDSC; fnk++)
  140.     {
  141.       diaval = pred_compress (diaval, lastb, df + fnk, t);
  142.       if (diaval == NULL)
  143.         return (NCF);
  144.     }
  145.   *diasz = diaval - diasc;
  146.   return (OK);
  147. }
  148. int
  149. testcond (struct des_field *df, u2_t fn, u2_t fdf, u2_t fnum, u2_t * fl,
  150.           u2_t * slsz, char *selcon, u2_t fmnum, u2_t * fml)
  151. {
  152.   for (; fnum != 0; fnum--, fl++)
  153.     if (*fl > fn)
  154.       return (NCF);
  155.   for (; fmnum != 0; fmnum--, fml++)
  156.     if (*fml > fn)
  157.       return (NCF);
  158.   if (*slsz != 0)
  159.     {
  160.       u2_t i, scsz;
  161.       i4_t sst, ans = OK;
  162.       unsigned char t;
  163.       char *a;
  164.       a = selcon;
  165.       sst = 1;
  166.       for (i = 0; (t = selsc1 (&a, sst++)) != ENDSC && i < fn ; i++)
  167. {
  168.   if (i< fdf && t == EQUN)
  169.     return (NCF);
  170.   if (t < EQ || (t > ANY && t < ENDSC))
  171.     return (NCF);
  172. }
  173.       if (t != ENDSC)
  174. return (NCF);
  175.       if (sst % 2 == 0)
  176. a++;
  177.       scsz = a - selcon;
  178.       if (*slsz != 0)
  179. ans = sel_cmpr (selcon, slsz, scsz, df);
  180.       if (ans < 0)
  181. return (NCF);
  182.     }
  183.   return (OK);
  184. }