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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  snlock.c  - Synchrolocks (transaction)
  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: snlock.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "xmem.h"
  30. #include "destrn.h"
  31. #include "sctp.h"
  32. #include "../synch/sctpsyn.h"
  33. #include "strml.h"
  34. #include "fdcltrn.h"
  35. extern struct ADBL adlj;
  36. CPNM
  37. synrd (u2_t sn, char *aval, u2_t size)
  38. {
  39.   char *a;
  40.   i4_t ast, n;
  41.   struct id_rel idr;
  42.   i4_t k, scsz;
  43.   char lc[SZSNBF];
  44.   char mch[BD_PAGESIZE], *asca;
  45.   CPNM cpn;
  46.   a = lc + size2b;
  47.   bcopy (aval, a, size);
  48.   a += size;
  49.   ast = 1;
  50.   asca = mch;
  51.   for (n = 0; n < 7; n++)
  52.     {
  53.       sct (&asca, ast++, X_D);
  54.       sct (&asca, ast++, EQ);
  55.     }
  56.   sct (&asca, ast, ENDSC);
  57.   if (ast % 2 == 0)
  58.     asca--;
  59.   scsz = asca + 1 - mch;
  60.   k = (size + scsz) % sizeof (i4_t);
  61.   if (k != 0)
  62.     k = sizeof (i4_t) - k;
  63.   a += k;
  64.   for (; asca >= mch;)
  65.     *a++ = *asca--;
  66.   size = a - lc;
  67.   t2bpack (size, lc);
  68.   idr.urn.segnum = sn;
  69.   idr.urn.obnum = RDRNUM;
  70.   if (size > SZSNBF)
  71.     error ("TR.synrd: SYN's buffer is too small");
  72.   cpn = sn_lock (&idr, 't', lc, size);
  73.   if (cpn != 0)
  74.     rllbck (cpn, adlj);
  75.   return (cpn);
  76. }
  77. CPNM
  78. synlock (struct id_rel *idr, struct d_r_bd *drbd, char *cort)
  79. {
  80.   i4_t scsz;
  81.   char lc[SZSNBF];
  82.   char mch[BD_PAGESIZE], *asca;
  83.   char *a, *b, *d;
  84.   i4_t ast;
  85.   u2_t size, k, kk;
  86.   u2_t scsize;
  87.   struct des_field *df;
  88.   CPNM cpn;
  89.   scsize = scscal (cort);
  90.   a = lc + size2b;
  91.   ast = 1;
  92.   asca = mch;
  93.   b = cort + scsize;
  94.   d = b;
  95.   df = (struct des_field *) (drbd + 1);
  96.   kk = drbd->fdfnum;
  97.   for (k = 0; k < kk; k++, df++)
  98.     { /* for always defined fields */
  99.       b = remval (b, &a, df->field_type);
  100.       sct (&asca, ast++, X_D);
  101.       sct (&asca, ast++, EQ);
  102.     }
  103.   for (k = 0, cort++; cort < d; cort++, k = 0)
  104.     for (; k < 7; k++, df++)
  105.       if ((*cort & BITVL(k)) != 0)
  106. {
  107.   b = remval (b, &a, df->field_type);
  108.   sct (&asca, ast++, X_D);
  109.   sct (&asca, ast++, EQ);
  110. }
  111.       else
  112. sct (&asca, ast++, NOTLOCK);
  113.   sct (&asca, ast, ENDSC);
  114.   if (ast % 2 == 0)
  115.     asca--;
  116.   scsz = asca + 1 - mch;
  117.   size = a - lc - size2b;
  118.   k = (size + scsz) % sizeof (i4_t);
  119.   if (k != 0)
  120.     k = sizeof (i4_t) - k;
  121.   a += k;
  122.   while( asca >= mch)
  123.     *a++ = *asca--;
  124.   size = a - lc;
  125.   t2bpack (size, lc);
  126.   if (size > SZSNBF)
  127.     error ("TR.synlock: SYN's buffer is too small");
  128.   cpn = sn_lock (idr, 't', lc, size);
  129.   if (cpn != 0)
  130.     rllbck (cpn, adlj);
  131.   return (cpn);
  132. }
  133. CPNM
  134. synlsc (i4_t type, struct id_rel *idr, char *selcon, u2_t selsize,
  135.         u2_t fn, u2_t * mfn)
  136. {
  137.   i4_t k, scsz;
  138.   char lc[SZSNBF];
  139.   char mch[BD_PAGESIZE], *asca;
  140.   char *a;
  141.   CPNM cpn;
  142.   
  143.   i4_t ast;
  144.   u2_t size;
  145.   
  146.   ast = 1;
  147.   asca = mch;
  148.   if (selsize == 0)
  149.     {
  150.       u2_t i;
  151.       if (mfn == NULL)
  152. {
  153.   if (type == RSC)
  154.     {
  155.       for (i = 0; i < fn; i++)
  156. sct (&asca, ast++, S_S);
  157.     }
  158.   else
  159.     {
  160.       for (i = 0; i < fn; i++)
  161. sct (&asca, ast++, X_X);
  162.     }
  163. }
  164.       else
  165. {
  166.           u2_t fnk;
  167.   for (i = 0, fnk = mfn[0]; i < fn; i++)
  168.     if (i == fnk)
  169.       {
  170. if (type == RSC)
  171.   sct (&asca, ast++, S_S);
  172. else
  173.   sct (&asca, ast++, X_X);
  174. break;
  175.       }
  176.     else
  177.       sct (&asca, ast++, S_S);
  178. }
  179.     }
  180.   else
  181.     {
  182.       unsigned char t;
  183.       i4_t sst;
  184.       a = selcon;
  185.       sst = 1;
  186.       for (; (t = selsc1 (&a, sst++)) != ENDSC;)
  187. if (t == ANY)
  188.   {
  189.     if (type == RSC)
  190.       sct (&asca, ast++, S_S);
  191.     else
  192.       sct (&asca, ast++, X_X);
  193.   }
  194. else
  195.   {
  196.     if (type == RSC)
  197.       sct (&asca, ast++, S_D);
  198.     else
  199.       sct (&asca, ast++, X_D);
  200.     sct (&asca, ast++, t);
  201.   }
  202.     }
  203.   a = lc + size2b;
  204.   scsz = asca + 1 - mch;
  205.   if (selsize != 0)
  206.     {
  207.       u2_t scalesize;
  208.       dsccal (fn, selcon, &scalesize);
  209.       bcopy (selcon + scalesize, a, selsize - scalesize);
  210.     }
  211.   sct (&asca, ast, ENDSC);
  212.   if (ast % 2 == 0)
  213.     asca--;
  214.   size = a - lc - size2b;
  215.   k = (size + scsz) % sizeof (i4_t);
  216.   if (k != 0)
  217.     k = sizeof (i4_t) - k;
  218.   for (a += k; asca >= mch;)
  219.     *a++ = *asca--;
  220.   size = a - lc;
  221.   t2bpack (size, lc);
  222.   if (size > SZSNBF)
  223.     error ("TR.synlsc: SYN's buffer is too small");
  224.   cpn = sn_lock (idr, 'w', lc, size);
  225.   if (cpn != 0)
  226.     rllbck (cpn, adlj);
  227.   return (cpn);
  228. }
  229. CPNM
  230. synind (u2_t sn, i4_t rn)
  231. {
  232.   char *a;
  233.   i4_t ast, n;
  234.   struct id_rel idr;
  235.   i4_t scsz;
  236.   char lc[SZSNBF];
  237.   char mch[BD_PAGESIZE], *asca;
  238.   u2_t size;
  239.   CPNM cpn;
  240.   a = lc + size2b;
  241.   ast = 1;
  242.   asca = mch;
  243.   sct (&asca, ast++, S_D);
  244.   sct (&asca, ast++, EQ);
  245.   for (n = 0; n < 3; n++)
  246.     sct (&asca, ast++, NOTLOCK);
  247.   sct (&asca, ast++, X_D);
  248.   sct (&asca, ast++, EQ);
  249.   sct (&asca, ast++, NOTLOCK);
  250.   sct (&asca, ast++, X_D);
  251.   sct (&asca, ast++, EQ);
  252.   sct (&asca, ast, ENDSC);
  253.   t4bpack (rn, a);
  254.   a +=size4b;
  255.   if (ast % 2 == 0)
  256.     asca--;
  257.   scsz = asca + 1 - mch;
  258.   n = (size4b + scsz) % sizeof (i4_t);
  259.   if (n != 0)
  260.     n = sizeof (i4_t) - n;
  261.   a += n;
  262.   for (; asca >= mch;)
  263.     *a++ = *asca--;
  264.   size = a - lc;
  265.   t2bpack (size, lc);
  266.   idr.urn.segnum = sn;
  267.   idr.urn.obnum = RDRNUM;
  268.   if (size > SZSNBF)
  269.     error ("TR.synind: SYN's buffer is too small");
  270.   cpn = sn_lock (&idr, 't', lc, size);
  271.   if (cpn != 0)
  272.     rllbck (cpn, adlj);
  273.   return (cpn);
  274. }
  275. CPNM
  276. syndmod (struct id_rel *idr, struct des_field *df, char *cort)
  277. {
  278.   i4_t scsz;
  279.   char lc[SZSNBF];
  280.   char mch[BD_PAGESIZE], *asca;
  281.   char *a, *b, *d;
  282.   i4_t ast;
  283.   u2_t size, k;
  284.   CPNM cpn;
  285.   a = lc + size2b;
  286.   ast = 1;
  287.   asca = mch;
  288.   b = cort + scscal (cort);
  289.   d = b;
  290.   for (k = 0; cort < d; cort++, k = 0)
  291.     for (; k < 7; k++, df++)
  292.       if ((*cort & BITVL(k)) != 0)
  293. {
  294.   b = remval (b, &a, df->field_type);
  295.   sct (&asca, ast++, X_D);
  296.   sct (&asca, ast++, EQ);
  297. }
  298.      else
  299. sct (&asca, ast++, NOTLOCK);
  300.   sct (&asca, ast, ENDSC);
  301.   if (ast % 2 == 0)
  302.     asca--;
  303.   scsz = asca + 1 - mch;
  304.   size = a - lc - size2b;
  305.   k = (size + scsz) % sizeof (i4_t);
  306.   if (k != 0)
  307.     k = sizeof (i4_t) - k;
  308.   a += k;
  309.   for (; asca >= mch;)
  310.     *a++ = *asca--;
  311.   size = a - lc;
  312.   t2bpack (size, lc);
  313.   if (size > SZSNBF)
  314.     error ("TR.syndmod: SYN's buffer is too small");
  315.   cpn = sn_lock (idr, 'w', lc, size);
  316.   if (cpn != 0)
  317.     rllbck (cpn, adlj);
  318.   return (cpn);
  319. }