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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  microj.c  - Microjournal
  3.  *              Kernel of GNU SQL-server. Microjournal
  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: microj.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "setup_os.h"
  30. #if HAVE_UNSTD_H
  31. #include <unistd.h>
  32. #endif
  33. #if HAVE_FCNTL_H
  34. #include <fcntl.h>
  35. #endif
  36. #include <assert.h>
  37. #include "rnmtp.h"
  38. #include "pupsi.h"
  39. #include "pupans.h"
  40. #include "strml.h"
  41. #include "fdeclmj.h"
  42. #include "xmem.h"
  43. #define size2b sizeof(i2_t)
  44. #define size4b sizeof(i4_t)
  45. char *p[2]; /*char pointers*/
  46. char pl1[RPAGE], pl2[RPAGE];
  47. u2_t pushpn[2]; /*contains the page number*/
  48. i4_t PROB[2]; /*state of MJ-pushs (i=0,1) :
  49.                                PROB[i]=-1 - initial state;
  50.                                PROB[i]= 2 - filling of a push is continuing (PUTBL);
  51.                                PROB[i]= 1 - write operation of a push on disk has began,
  52.                                       a push has loaded;
  53.                                PROB[i]= 0 - write operation of a push on disk has finished,
  54.                                       a push has loaded again */
  55. i4_t ilast; /* the karman number contained  the last page of a microjournal*/
  56. i4_t RFILE; /* size of MJ-file (in pages) */
  57. i4_t REDLINE, RET_RLINE;
  58. i4_t MPAGE;
  59. i4_t fdmj = 0;
  60. struct ADBL ABLOCK; /* block address */
  61. i4_t NB; /* MJ-version number */
  62. int
  63. INI (char *pnt) /* MJ- initialisation */
  64. {
  65.   p[0] = pl1;
  66.   p[1] = pl2;
  67.   if ((fdmj = open (pnt, O_RDWR, 0644)) < 0)
  68.     {
  69.       perror ("MJ: open error");
  70.       exit (1);
  71.     }
  72.   getrfile (fdmj);
  73.   get_last_page (fdmj);
  74.   RET_RLINE = REDLINE;
  75.   if (NB == 0)
  76.     {
  77.       PICTURE (2);
  78.       NB = 1;
  79.       t4bpack (NB, p[ilast]);
  80.       if (write (fdmj, (char *) &NB, size4b) != size4b)
  81. {
  82.   perror ("MJ: write error");
  83.   exit (1);
  84. }
  85.     }
  86.   else
  87.     {
  88.       return (MJ_PPS);
  89.     }
  90.   return (OK);
  91. }
  92. void
  93. putbl (u2_t razm, char * block) 
  94. {    /*this function puts block ADBL in the last page MJ */
  95.   register off;
  96.   register char *a, *lastb;
  97.   assert (razm < RPAGE);
  98.   if (PROB[ilast] == 1)
  99.     WAIT (ilast);
  100.   PROB[ilast] = 2;
  101.   a = p[ilast] + size4b;
  102.   off = t2bunpack (a);
  103.   a = p[ilast] + off;
  104.   lastb = p[ilast] + RPAGE;
  105.   if (a + razm > lastb)
  106.     { /* block-record places in two page */
  107.       u2_t n, n1;
  108.       n1 = lastb - a;
  109.       bcopy (block, a, n1);
  110.       do_cont ();
  111.       a = p[ilast] + RTPAGE;
  112.       n = razm - n1;
  113.       bcopy (block + n1, a, n);
  114.       a += n;
  115.     }
  116.   else
  117.     {
  118.       bcopy (block, a, razm);
  119.       a += razm;
  120.     }
  121.   a = write_topblock (razm, a - p[ilast], a);
  122.   off = a - p[ilast];
  123.   t2bpack (off, p[ilast] + size4b);
  124.   ABLOCK.cm = off;
  125.   ABLOCK.npage = pushpn[ilast];
  126. }
  127. void
  128. dofix (char *pnt) /*this function puts a new first page into MJ*/
  129.       /*NEWTOP- contains a new top for the microjournal */
  130. {
  131.   register char *a;
  132.    READPG (1, 0, fdmj);
  133.   pushpn[1] = 0;
  134.   a = p[0];
  135.   NB += 1;
  136.   if (NB == 0)
  137.     NB = 1;
  138.   t4bpack (NB, a);
  139.   a += size4b;
  140.   t2bpack (RTPAGE + RTJOUR, a);
  141.   a += size2b;
  142.   *a++ = 1;
  143.   t2bpack (t2bunpack (pnt), a);
  144.   a += size2b;
  145.   t2bpack (t2bunpack (pnt + size2b), a);
  146.   a += size2b;
  147.   *a = *(pnt + 2 * size2b);
  148.   WRITEPG (0, 1, fdmj);
  149.   REDLINE = RET_RLINE;
  150.   ilast = 0;
  151.   PRINTF (("MJ.dofix: NB = %dn", (i4_t)NB));
  152. }
  153. void
  154. outdisk (u2_t n) /* Test, all blocks are */
  155. /* in the disk (beginning with "ADR"-block);*/
  156. { /* if they aren't, output needed page*/
  157.   if (n == pushpn[ilast])
  158.     out_push (ilast, 1); /*with wait*/
  159. }
  160. void
  161. write_disk (i4_t i, i4_t c) /* Write push number "i" to disk */
  162.                                 /* c= 1 - wait, 0 - no wait;*/
  163. {
  164.   i4_t N;
  165.   N = pushpn[i];
  166.   if (N > RFILE)
  167.     MOREFILE (MPAGE);
  168.   if (N == REDLINE)
  169.     {
  170.       LJ_ovflmj ();
  171.       REDLINE = 0;
  172.     }
  173.   WRITEPG (i, c, fdmj);
  174. }