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

📄 helpfu.c

📁 免费的Sql数据库系统
💻 C
字号:
/* *  helpfu.c  - Common finctions of Logical Journal and Microjournal *              Kernel of GNU SQL-server. Journals  * * 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: helpfu.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */#include "setup_os.h"#include <sys/types.h>#if HAVE_SYS_FILE_H #include <sys/file.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#include <sys/stat.h>#include <assert.h>#include "rnmtp.h"#include "pupsi.h"#include "strml.h"#include "fdeclmj.h"#include "xmem.h"extern char pl1[RPAGE], pl2[RPAGE];extern char *p[2];extern u2_t pushpn[2];		/* contains the page number*/extern i4_t PROB[2];		/* state of JOURN-pushs (i=0,1) */extern i4_t RFILE;extern i4_t NB;			/* J-version number*/extern i4_t ilast;		/* the number of page, contained the last page of jounal*/#define size2b sizeof(u2_t)#define size4b sizeof(i4_t)voidgetrfile (i4_t fd){  struct stat buf;  if (fstat (fd, &buf) < 0)    ADM_ERRFU (MERR);  RFILE = buf.st_size / (RPAGE);}voidget_last_page (i4_t fd)		/* Search the last page of a journal;*/{        			/* ilast(global) is equal the number of the push */				/* contained the last page */  i4_t PCP, i;  u2_t N;  PROB[0] = -1;  PROB[1] = -1;  pushpn[0] = (u2_t) ~ 0;  pushpn[1] = 0;  READPG (1, 0, fd);  NB = t4bunpack (p[0]);  for (N = 1, i = 0;; N++)    {      ilast = i;      if (N == RFILE)	break;      PCP = *(p[i] + size4b + size2b);      if (PCP == SIGN_NOCONT)	break;      i = (i == 0) ? 1 : 0;      READPG (N, i, fd);      if (NB != t4bunpack (p[i]))	{	  i = (i == 0) ? 1 : 0;	  break;	}    }  ilast = i;}intget_page (i4_t j, u2_t N, i4_t fd) /* Prepare page number N into one push*/                                  /* j - is the number of the current push */{  register i4_t k;  k = (j == 0) ? 1 : 0;  if (pushpn[k] == N)    {      if ((PROB[0] == 1) || (PROB[1] == 1))	WAIT ((PROB[0] == 1) ? 0 : 1);    }  else    {      k = (j == ilast) ? k : j;      READPG (N, k, fd);    }  return (k);}voidget_rec (char *pnt, struct ADBL adj, i4_t fd){  register char *end_of_record;  register i4_t k;  register u2_t n, N, n1, razm;  N = adj.npage;  n = adj.cm;  k = (N == pushpn[0]) ? 0 : ((N == pushpn[1]) ? 1 : (-1));  if (k == (-1))    {      k = (ilast == 0) ? 1 : 0;      READPG (N, k, fd);    }  n -= RTPAGE;  if (n < RTBLK)    {			/* the top-block places in two pages*/      char buff[size2b];      n1 = RTBLK - n;      bcopy (p[k] + RTPAGE, buff + n1, n);      k = get_page (k, pushpn[k] - 1, fd);      end_of_record = p[k] + RPAGE - n1;      bcopy (end_of_record, buff, n1);      razm = t2bunpack (buff);      n = RPAGE - RTPAGE - n1;    }  else    {			/* the top-block places in (N)-page */      end_of_record = p[k] + n + RTPAGE - RTBLK;      razm = t2bunpack (end_of_record);      n -= RTBLK;      if (n == 0)        {          k = get_page (k, pushpn[k] - 1, fd);          end_of_record = p[k] + RPAGE;          n = RPAGE - RTPAGE;        }    }  t2bpack (razm, pnt);  pnt += size2b;  assert (razm <= RPAGE);  if (n < razm)    {			/* block-record places in two pages */      n1 = razm - n;      bcopy (p[k] + RTPAGE, pnt + n1, n);      k = get_page (k, pushpn[k] - 1, fd);      bcopy (p[k] + RPAGE - n1, pnt, n1);    }  else			/*block-record places in (N)-page all*/    bcopy (end_of_record - razm, pnt, razm);}voidMOREFILE (i4_t n)	/* Add n page to base-file and pictures them */{  RFILE = RFILE + n;  PICTURE (RFILE - n + 1);}voidPICTURE (i4_t n)	/* Put standard top-journal and  top-pages into disk, */{        	/* beginning with the page number "n" */  register i4_t i, j;  if (n > 1)    j = (ilast == 0) ? 1 : 0;  else    j = 0;  for (i = n; i <= RFILE; i++)    {      t4bpack (0, p[j]);      PROB[j] = 2;      pushpn[j] = i;      out_push (j, 1);		/*with wait*/    }}voidout_push (i4_t i, i4_t c)		/* Write push number "i" into disk;*/{               		/*(if is it needed). c=1 -wait; c=0 -no wait; */    if (PROB[i] == 1)    {      WAIT (i);    }  else if (PROB[i] == 2)    {      i4_t j;      j = ((i == 0) ? 1 : 0);      if (PROB[j] == 1)	WAIT (j);      write_disk (i, c);    }}voidWAIT (i4_t i)			/* i- push number */{  PROB[i] = 0;}voidREADPG (u2_t N, i4_t i, i4_t fd) /* Read "N"-page from JRN-basefile into i-push */{  if ((PROB[0] == 1) || (PROB[1] == 1))    WAIT ((PROB[0] == 1) ? 0 : 1);  if (lseek (fd, (i4_t) (RPAGE * (N - 1)), SEEK_SET) < 0)    {      perror ("JRN.lseek: READPG");      exit (1);    }  if (read (fd, (i == 0) ? pl1 : pl2, RPAGE) != RPAGE)    {      perror ("JRN.read: READPG");      exit (1);    }  pushpn[i] = N;}voidWRITEPG (i4_t i,i4_t c,i4_t fd)		/* Write push number "i" into page with number N */{                        		/* of the JRN-basefile; c=1 -wait; c=0 -no wait; */  i4_t N;  N = pushpn[i];  switch (c)    {    case 1:      if (lseek (fd, (i4_t) (RPAGE * (N - 1)), SEEK_SET) < 0)	ADM_ERRFU (MERR);      if (write (fd, (i == 0) ? pl1 : pl2, RPAGE) != RPAGE)	ADM_ERRFU (MERR);      PROB[i] = 0;      break;    case 0:      if (lseek (fd, (i4_t) (RPAGE * (N - 1)), SEEK_SET) < 0)	ADM_ERRFU (MERR);#if 0      printf ("helpfu.WRITEPG: no wait fd = %d, N = %d\n", fd, N);      for (j = 0, a = (i == 0) ? pl1 : pl2 ; j < 16; j++)        printf (" %X", a[j]);      printf ("\n");#endif      if (write (fd, (i == 0) ? pl1 : pl2, RPAGE) != RPAGE)	ADM_ERRFU (MERR);      PROB[i] = 1;      break;    default:      printf ("err in wait-code\n");      break;    }}char *write_topblock (u2_t size, u2_t off, char *a){  if (off + RTBLK > RPAGE)    {				/* the top-block places in two pages*/      u2_t n, n1;      char buff[size2b];      n = RPAGE - off;      t2bpack (size, buff);      bcopy (buff, a, n);      do_cont ();      a = p[ilast] + RTPAGE;      n1 = RTBLK - n;      bcopy (buff + n, a, n1);      a += n1;    }  else    {				/* the top-block places in (N)-page */      t2bpack (size, a);      a += size2b;    }  return (a);}voiddo_cont (void){  register char *a;  *(p[ilast] + size4b + size2b) = SIGN_CONT;  out_push (ilast, 0);  pushpn[(ilast == 0) ? 1 : 0] = pushpn[ilast] + 1;  ilast = (ilast == 0) ? 1 : 0;  a = p[ilast];  t4bpack (NB, a);  a += size4b;  t2bpack (RTPAGE, a);  a += size2b;  *a = SIGN_NOCONT;}

⌨️ 快捷键说明

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