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

SQL Server

开发平台:

Unix_Linux

  1. /*  shtest1.c -  Check sharing on fields
  2.  *               Kernel of GNU SQL-server. Synchronizer    
  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: shtest1.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "dessnch.h"
  29. #include "sctp.h"
  30. #include "sctpsyn.h"
  31. #include "fdclsyn.h"
  32. int
  33. shtest1 (struct des_lock *anl, char *con, i4_t size, struct des_lock *bl)
  34.      /* 0- is shared, 1- not */
  35. {
  36.   i4_t at, bt, astsc, bstsc;
  37.   i4_t (*f) (char *, char *, u2_t, u2_t);
  38.   u2_t na1, na2, nb1, nb2;
  39.   i4_t i, j, ans;
  40.   char *bd, *a1, *b1, *a2, *b2;
  41.   char *ascale, *bscale;
  42.   struct des_field *field;
  43.   u2_t type;
  44.   ascale = con + size;
  45.   ascale--;
  46.   bscale = (char *) bl + bl->dls;
  47.   bscale--;
  48.   astsc = 1;
  49.   bstsc = 1;
  50.   at = ss1 (&ascale, astsc++);
  51.   bt = ss1 (&bscale, bstsc++);
  52.   field = (struct des_field *) (anl->rel + 1);
  53.   if (bl != bl->tran->pwlock)
  54.     bd = (char *) bl + locksize;
  55.   else
  56.     bd = (char *) bl + wlocksize;
  57.   ans = 0;
  58.   for (; at != ENDSC && bt != ENDSC; field++)
  59.     {
  60.       type = field->field_type;
  61.       if (at == X_X && bt != NOTLOCK)
  62. ans = 1;
  63.       if (bt == X_X && at != NOTLOCK)
  64. ans = 1;
  65.       if (at == X_D && bt != NOTLOCK)
  66. ans = 1;
  67.       if (bt == X_D && at != NOTLOCK)
  68. ans = 1;
  69.       if (at == NOTLOCK || at == X_X || at == S_S)
  70. {
  71.   if (bt == S_D || bt == X_D)
  72.     {
  73.       bt = ss1 (&bscale, bstsc++);
  74.       if (bt == SS || bt == SES || bt == SSE || bt == SESE)
  75. bd = proval (bd, type);
  76.       bd = proval (bd, type);
  77.     }
  78.   goto m1;
  79. }
  80.       if (bt == NOTLOCK || bt == X_X || bt == S_S)
  81. {
  82.   if (at == S_D || at == X_D)
  83.     {
  84.       at = ss1 (&ascale, astsc++);
  85.       if (at == SS || at == SES || at == SSE || at == SESE)
  86. con = proval (con, type);
  87.       con = proval (con, type);
  88.     }
  89.   goto m1;
  90. }
  91.       at = ss1 (&ascale, astsc++);
  92.       bt = ss1 (&bscale, bstsc++);
  93.       if (((at == SML || at == SMLEQ) && (bt == SML || bt == SMLEQ)) ||
  94.   ((at == GRT || at == GRTEQ) && (bt == GRT || bt == GRTEQ)))
  95. {
  96.   at = ss1 (&ascale, astsc++);
  97.   if (at == SS || at == SES || at == SSE || at == SESE)
  98.     con = proval (con, type);
  99.   con = proval (con, type);
  100.   bt = ss1 (&bscale, bstsc++);
  101.   if (bt == SS || bt == SES || bt == SSE || bt == SESE)
  102.     bd = proval (bd, type);
  103.   bd = proval (bd, type);
  104.   goto m1;
  105. }
  106.       if (at == NEQ && bt == NEQ)
  107. {
  108.   con = proval (con, type);
  109.   bd = proval (bd, type);
  110.   goto m1;   
  111. }
  112.       switch (type)
  113. {
  114. case T1B:
  115.   f = f1b;
  116.   con = ftint (at, con, &a1, &a2, size1b);
  117.   bd = ftint (bt, bd, &b1, &b2, size1b);
  118.   break;
  119. case T2B:
  120.   f = f2b;
  121.   con = ftint (at, con, &a1, &a2, size2b);
  122.   bd = ftint (bt, bd, &b1, &b2, size2b);
  123.   break;
  124. case T4B:
  125.   f = f4b;
  126.   con = ftint (at, con, &a1, &a2, size4b);
  127.   bd = ftint (bt, bd, &b1, &b2, size4b);
  128.   break;
  129. case TFLOAT:
  130.   f = flcmp;
  131.   con = ftint (at, con, &a1, &a2, size4b);
  132.   bd = ftint (bt, bd, &b1, &b2, size4b);
  133.   break;
  134. case TFL:
  135.   f = ffloat;
  136.   con = ftch (at, con, &a1, &a2, &na1, &na2);
  137.   bd = ftch (bt, bd, &b1, &b2, &nb1, &nb2);
  138.   break;
  139. case TCH:
  140.   f = chcmp;
  141.   con = ftch (at, con, &a1, &a2, &na1, &na2);
  142.   bd = ftch (bt, bd, &b1, &b2, &nb1, &nb2);
  143.   break;
  144. default:
  145.   f = NULL;
  146.   error ("SYN.error: Incorrect data type");
  147.   break;
  148. }
  149.       if (at == SML || at == SMLEQ)
  150. na1 = 0;
  151.       if (bt == SML || bt == SMLEQ)
  152. nb1 = 0;
  153.       if (at == GRT || at == GRTEQ)
  154. na2 = (u2_t) ~0;
  155.       if (bt == GRT || bt == GRTEQ)
  156. nb2 = (u2_t) ~0; 
  157.       
  158.       i = (*f) (a2, b1, na2, nb1);
  159.       if (at == NEQ)
  160. {
  161.   if (bt == EQ && i != 0)
  162.     goto m1;
  163.   return (0);
  164. }
  165.       if (bt == NEQ)
  166. {
  167.   if (at == EQ && i != 0)
  168.     goto m1;
  169.   return (0);
  170. }
  171.       if (i < 0)
  172. return (0);
  173.       if ((j = (*f) (b2, a1, nb2, na1)) < 0)
  174. return (0);
  175.       if (i > 0 && j > 0)
  176. goto m1;
  177.       if (i == 0 && (at == EQ || at == SMLEQ || at == SSE || at == SESE) &&
  178.   (bt == EQ || bt == GRTEQ || bt == SES || bt == SESE))
  179. goto m1;
  180.       if (j == 0 && (at == GRTEQ || at == SES || at == SESE) &&
  181.   (bt == SMLEQ || bt == SSE || bt == SESE))
  182. goto m1;
  183.       return (0);
  184.     m1:
  185.       at = ss1 (&ascale, astsc++);
  186.       bt = ss1 (&bscale, bstsc++);
  187.     }
  188.   return (ans);
  189. }