⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snlock.c

📁 免费的Sql数据库系统
💻 C
字号:
/* *  snlock.c  - Synchrolocks (transaction) *              Kernel of GNU SQL-server   * *  This file is a part of GNU SQL Server * *  Copyright (c) 1996, 1997, Free Software Foundation, Inc *  Developed at the Institute of System Programming *  This file is written by  Vera Ponomarenko * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *  Contacts:   gss@ispras.ru * *//* $Id: snlock.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */#include "xmem.h"#include "destrn.h"#include "sctp.h"#include "../synch/sctpsyn.h"#include "strml.h"#include "fdcltrn.h"extern struct ADBL adlj;CPNMsynrd (u2_t sn, char *aval, u2_t size){  char *a;  i4_t ast, n;  struct id_rel idr;  i4_t k, scsz;  char lc[SZSNBF];  char mch[BD_PAGESIZE], *asca;  CPNM cpn;  a = lc + size2b;  bcopy (aval, a, size);  a += size;  ast = 1;  asca = mch;  for (n = 0; n < 7; n++)    {      sct (&asca, ast++, X_D);      sct (&asca, ast++, EQ);    }  sct (&asca, ast, ENDSC);  if (ast % 2 == 0)    asca--;  scsz = asca + 1 - mch;  k = (size + scsz) % sizeof (i4_t);  if (k != 0)    k = sizeof (i4_t) - k;  a += k;  for (; asca >= mch;)    *a++ = *asca--;  size = a - lc;  t2bpack (size, lc);  idr.urn.segnum = sn;  idr.urn.obnum = RDRNUM;  if (size > SZSNBF)    error ("TR.synrd: SYN's buffer is too small");  cpn = sn_lock (&idr, 't', lc, size);  if (cpn != 0)    rllbck (cpn, adlj);  return (cpn);}CPNMsynlock (struct id_rel *idr, struct d_r_bd *drbd, char *cort){  i4_t scsz;  char lc[SZSNBF];  char mch[BD_PAGESIZE], *asca;  char *a, *b, *d;  i4_t ast;  u2_t size, k, kk;  u2_t scsize;  struct des_field *df;  CPNM cpn;  scsize = scscal (cort);  a = lc + size2b;  ast = 1;  asca = mch;  b = cort + scsize;  d = b;  df = (struct des_field *) (drbd + 1);  kk = drbd->fdfnum;  for (k = 0; k < kk; k++, df++)    {				/* for always defined fields */      b = remval (b, &a, df->field_type);      sct (&asca, ast++, X_D);      sct (&asca, ast++, EQ);    }  for (k = 0, cort++; cort < d; cort++, k = 0)    for (; k < 7; k++, df++)      if ((*cort & BITVL(k)) != 0)	{	  b = remval (b, &a, df->field_type);	  sct (&asca, ast++, X_D);	  sct (&asca, ast++, EQ);	}      else	sct (&asca, ast++, NOTLOCK);  sct (&asca, ast, ENDSC);  if (ast % 2 == 0)    asca--;  scsz = asca + 1 - mch;  size = a - lc - size2b;  k = (size + scsz) % sizeof (i4_t);  if (k != 0)    k = sizeof (i4_t) - k;  a += k;  while( asca >= mch)    *a++ = *asca--;  size = a - lc;  t2bpack (size, lc);  if (size > SZSNBF)    error ("TR.synlock: SYN's buffer is too small");  cpn = sn_lock (idr, 't', lc, size);  if (cpn != 0)    rllbck (cpn, adlj);  return (cpn);}CPNMsynlsc (i4_t type, struct id_rel *idr, char *selcon, u2_t selsize,        u2_t fn, u2_t * mfn){  i4_t k, scsz;  char lc[SZSNBF];  char mch[BD_PAGESIZE], *asca;  char *a;  CPNM cpn;    i4_t ast;  u2_t size;    ast = 1;  asca = mch;  if (selsize == 0)    {      u2_t i;      if (mfn == NULL)	{	  if (type == RSC)	    {	      for (i = 0; i < fn; i++)		sct (&asca, ast++, S_S);	    }	  else	    {	      for (i = 0; i < fn; i++)		sct (&asca, ast++, X_X);	    }	}      else	{          u2_t fnk;	  for (i = 0, fnk = mfn[0]; i < fn; i++)	    if (i == fnk)	      {		if (type == RSC)		  sct (&asca, ast++, S_S);		else		  sct (&asca, ast++, X_X);		break;	      }	    else	      sct (&asca, ast++, S_S);	}    }  else    {      unsigned char t;      i4_t sst;      a = selcon;      sst = 1;      for (; (t = selsc1 (&a, sst++)) != ENDSC;)	if (t == ANY)	  {	    if (type == RSC)	      sct (&asca, ast++, S_S);	    else	      sct (&asca, ast++, X_X);	  }	else	  {	    if (type == RSC)	      sct (&asca, ast++, S_D);	    else	      sct (&asca, ast++, X_D);	    sct (&asca, ast++, t);	  }    }  a = lc + size2b;  scsz = asca + 1 - mch;  if (selsize != 0)    {      u2_t scalesize;      dsccal (fn, selcon, &scalesize);      bcopy (selcon + scalesize, a, selsize - scalesize);    }  sct (&asca, ast, ENDSC);  if (ast % 2 == 0)    asca--;  size = a - lc - size2b;  k = (size + scsz) % sizeof (i4_t);  if (k != 0)    k = sizeof (i4_t) - k;  for (a += k; asca >= mch;)    *a++ = *asca--;  size = a - lc;  t2bpack (size, lc);  if (size > SZSNBF)    error ("TR.synlsc: SYN's buffer is too small");  cpn = sn_lock (idr, 'w', lc, size);  if (cpn != 0)    rllbck (cpn, adlj);  return (cpn);}CPNMsynind (u2_t sn, i4_t rn){  char *a;  i4_t ast, n;  struct id_rel idr;  i4_t scsz;  char lc[SZSNBF];  char mch[BD_PAGESIZE], *asca;  u2_t size;  CPNM cpn;  a = lc + size2b;  ast = 1;  asca = mch;  sct (&asca, ast++, S_D);  sct (&asca, ast++, EQ);  for (n = 0; n < 3; n++)    sct (&asca, ast++, NOTLOCK);  sct (&asca, ast++, X_D);  sct (&asca, ast++, EQ);  sct (&asca, ast++, NOTLOCK);  sct (&asca, ast++, X_D);  sct (&asca, ast++, EQ);  sct (&asca, ast, ENDSC);  t4bpack (rn, a);  a +=size4b;  if (ast % 2 == 0)    asca--;  scsz = asca + 1 - mch;  n = (size4b + scsz) % sizeof (i4_t);  if (n != 0)    n = sizeof (i4_t) - n;  a += n;  for (; asca >= mch;)    *a++ = *asca--;  size = a - lc;  t2bpack (size, lc);  idr.urn.segnum = sn;  idr.urn.obnum = RDRNUM;  if (size > SZSNBF)    error ("TR.synind: SYN's buffer is too small");  cpn = sn_lock (&idr, 't', lc, size);  if (cpn != 0)    rllbck (cpn, adlj);  return (cpn);}CPNMsyndmod (struct id_rel *idr, struct des_field *df, char *cort){  i4_t scsz;  char lc[SZSNBF];  char mch[BD_PAGESIZE], *asca;  char *a, *b, *d;  i4_t ast;  u2_t size, k;  CPNM cpn;  a = lc + size2b;  ast = 1;  asca = mch;  b = cort + scscal (cort);  d = b;  for (k = 0; cort < d; cort++, k = 0)    for (; k < 7; k++, df++)      if ((*cort & BITVL(k)) != 0)	{	  b = remval (b, &a, df->field_type);	  sct (&asca, ast++, X_D);	  sct (&asca, ast++, EQ);	}     else	sct (&asca, ast++, NOTLOCK);  sct (&asca, ast, ENDSC);  if (ast % 2 == 0)    asca--;  scsz = asca + 1 - mch;  size = a - lc - size2b;  k = (size + scsz) % sizeof (i4_t);  if (k != 0)    k = sizeof (i4_t) - k;  a += k;  for (; asca >= mch;)    *a++ = *asca--;  size = a - lc;  t2bpack (size, lc);  if (size > SZSNBF)    error ("TR.syndmod: SYN's buffer is too small");  cpn = sn_lock (idr, 'w', lc, size);  if (cpn != 0)    rllbck (cpn, adlj);  return (cpn);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -