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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  logj.c  -   Logical Journal
  3.  *              Kernel of GNU SQL-server. Logical Journal 
  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: logj.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "setup_os.h"
  30. #include <assert.h>
  31. #include "rnmtp.h"
  32. #include "pupsi.h"
  33. #include "strml.h"
  34. #include "fdecllj.h"
  35. #include "xmem.h"
  36. char *p[2]; /* push-pointers*/
  37. char pl1[RPAGE], pl2[RPAGE];
  38. i4_t fdlj; /* file descriptor "LJOURN" */
  39. u2_t pushpn[2]; /* contains the page number*/
  40. i4_t PROB[2]; /* state of LJ-pushs (i=0,1) :
  41.                          PROB[i]=-1 - initial state;
  42.                          PROB[i]= 2 - filling of a push is continuing(PUTREC,PUTHREC,PUTOUT)
  43.                          PROB[i]= 1 - write operation of a push on disk has began,
  44.                                       a push has loaded;
  45.                          PROB[i]= 0 - write operation of a push on disk has finished,
  46.                                       a push has loaded again */
  47. i4_t ilast; /* the number of page, contained the last page of journal*/
  48. i4_t NOP; /* operation counter */
  49. i4_t RFILE; /*                          */
  50. i4_t REDLINE; /*                          */
  51. i4_t MPAGE;
  52. i4_t NB; /* LJ-version number*/
  53. struct ADREC RREC; /* razmer-record */
  54. struct ADBL ABLOCK; /* blocks address */
  55. #define size2b sizeof(u2_t)
  56. #define size4b sizeof(i4_t)
  57. void
  58. INI ()
  59. {
  60.   struct ADBL adlj;
  61.   p[0] = pl1;
  62.   p[1] = pl2;
  63.   getrfile (fdlj);
  64.   get_last_page (fdlj);
  65.   if (NB == 0)
  66.     {
  67.       NB = 1;
  68.       t4bpack (NB, p[ilast]);
  69.     }
  70.   adlj.npage = pushpn[ilast];
  71.   adlj.cm = t2bunpack (p[ilast] + size4b);
  72.   NOP = 0;
  73.   /*  rep = BUF_INIFIXB (adlj, NOP);*/
  74. }
  75. int
  76. renew ()
  77. {
  78.   i4_t rep;
  79.   struct ADBL adlj;
  80.   READPG (1, 0, fdlj);
  81.   NB = t4bunpack (p[0]);
  82.   NB += 1;
  83.   PRINTF (("LOGJ.renew: NB = %d, REDLINE = %dn", (i4_t)NB, REDLINE));  
  84.   t4bpack (NB, p[0]);
  85.   t2bpack (RTPAGE, p[0] + size4b);
  86.   *(p[0] + size4b + size2b) = SIGN_NOCONT; /*PCP=free*/
  87.   WRITEPG (0, 1, fdlj);
  88.   adlj.npage = 1;
  89.   adlj.cm = RTPAGE;
  90.   rep = BUF_INIFIXB (adlj, NOP);
  91.   NOP = 0;
  92.   ilast = 0;
  93.   return (rep);
  94. }
  95. void
  96. begfix (void) /*This function writes all push-buffers into disk and sends SPB*/
  97. {
  98.   struct ADBL adlj;
  99.   i4_t rep;
  100.   out_push (ilast, 1);
  101.   adlj.npage = pushpn[ilast];
  102.   adlj.cm = t2bunpack (p[ilast] + size4b);
  103.   rep = BUF_INIFIXB (adlj, NOP);
  104.   NOP = 0;
  105.   ans_adm (rep);
  106. }
  107. void
  108. PUTRC (u2_t razm, char * block)
  109. {
  110.   register off;
  111.   register char *a, *lastb;
  112.   assert (razm < RPAGE);
  113.   if (PROB[ilast] == 1)
  114.     WAIT (ilast);
  115.   PROB[ilast] = 2;
  116.   a = p[ilast] + size4b;
  117.   off = t2bunpack (a);
  118.   a = p[ilast] + off;
  119.   a = write_topblock (razm, off, a);
  120.   lastb = p[ilast] + RPAGE;
  121.   if (a + razm > lastb)
  122.     { /* block-record places in two page*/
  123.       u2_t n, n1;
  124.       n1 = lastb - a;
  125.       bcopy (block, a, n1);
  126.       do_cont ();
  127.       a = p[ilast] + RTPAGE;
  128.       n = razm - n1;
  129.       bcopy (block + n1, a, n);
  130.       a += n;
  131.     }
  132.   else
  133.     {
  134.       bcopy (block, a, razm);
  135.       a += razm;
  136.     }
  137.   a = write_topblock (razm, a - p[ilast], a);
  138.   off = a - p[ilast];
  139.   t2bpack (off, p[ilast] + size4b);
  140.   ABLOCK.cm = off;
  141.   ABLOCK.npage = pushpn[ilast];
  142. }
  143. void
  144. putrec (u2_t razm, char * block) /*This function puts block with record into LJ*/
  145. {
  146.   PUTRC (razm, block);
  147.   NOP++;
  148. }
  149. void
  150. putout (u2_t razm, char * block) /* This function puts block with record and */
  151.                     /* writes all push-buffers into disk */
  152. {
  153.   PUTRC (razm, block);
  154.   PRINTF (("LJ.putout: NOP = %d, REDLINE = %d, npage = %d, off = %dn",
  155.            NOP, REDLINE, ABLOCK.npage, ABLOCK.cm));
  156.   push_microj ();
  157.   out_push (ilast, 1); /*with wait*/
  158. }
  159. void
  160. write_disk (i, c) /* this function writes push number "i" into disk; */
  161.      i4_t i, c; /* c= 1 - wait, 0 - no wait;*/
  162. {
  163.   i4_t N;
  164.   N = pushpn[i];
  165.   if (N > RFILE)
  166.     MOREFILE (MPAGE);
  167.   if (N == REDLINE)
  168.     {
  169.       PRINTF (("LOGJ.write_disk: reguest copy NB = %d, pagenum = %dn",
  170.                (i4_t)NB, N));
  171.       ADML_COPY ();
  172.       REDLINE = 0;
  173.     }
  174.   
  175.   WRITEPG (i, c, fdlj);
  176. }
  177. void
  178. overflow_mj ()
  179. {
  180.   if (NOP != 0)
  181.     {
  182.       struct ADBL adlj;
  183.       i4_t rep;
  184.       out_push (ilast, 1);
  185.       adlj.npage = pushpn[ilast];
  186.       adlj.cm = t2bunpack (p[ilast] + size4b);
  187.       rep = BUF_INIFIXB (adlj, NOP);
  188.       NOP = 0;
  189.     }
  190. }