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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  get_put.c  -  This file contains the functions which support
  3.  *                operations get/put pages.
  4.  *                Kernel of GNU SQL-server. Buffer  
  5.  *
  6.  * This file is a part of GNU SQL Server
  7.  *
  8.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  9.  *  Developed at the Institute of System Programming
  10.  *  This file is written by  Vera Ponomarenko
  11.  *
  12.  *  This program is free software; you can redistribute it and/or modify
  13.  *  it under the terms of the GNU General Public License as published by
  14.  *  the Free Software Foundation; either version 2 of the License, or
  15.  *  (at your option) any later version.
  16.  *
  17.  *  This program is distributed in the hope that it will be useful,
  18.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  *  GNU General Public License for more details.
  21.  *
  22.  *  You should have received a copy of the GNU General Public License
  23.  *  along with this program; if not, write to the Free Software
  24.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  25.  *
  26.  *  Contacts:   gss@ispras.ru
  27.  *
  28.  */
  29. /* $Id: get_put.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  30. #include "setup_os.h"
  31. #include "inpop.h"
  32. #include "bufdefs.h"
  33. #include "fdeclbuf.h"
  34. #include "totdecl.h"
  35. /*****************************************************************************
  36.                                GET/PUT PAGE
  37. */
  38. #define size2b sizeof(u2_t)
  39. extern i4_t cur_endmj;
  40. struct BUFF *
  41. get (u2_t sn, u2_t pn, char pr) /* get page */
  42. {/* pr - read or not */
  43.   struct BUFF *buf;
  44.   struct PAGE *page;
  45.   page = find_page (sn, pn);
  46.   if (page == NULL)
  47.     page = new_page (sn, pn);
  48.   buf = page->p_buf;
  49.   if (buf == NULL)
  50.     {
  51.       buf = get_buf ();
  52.       page->p_buf = buf;
  53.       buf->b_page = page;
  54.       set_prio (buf, USED);
  55.       if (pr == 'r')
  56. read_buf (buf);
  57.     }
  58.   else if (buf->b_status < USED)
  59.     change_prio (buf, USED);
  60.   buf->b_status++;
  61.   return (buf);
  62. }
  63. void
  64. put (u2_t sn, u2_t pn, i4_t address, char prmod)
  65. { /* prmod - to push buffer or not */
  66.   struct PAGE *page;
  67.   struct BUFF *buf;
  68.   page = find_page (sn, pn);
  69.   buf = page->p_buf;
  70.   if (address != NULL_MICRO)
  71.     {
  72.       u2_t off, pn_eomj, off_eomj;
  73.       char *a, *b;
  74.       buf->b_micro = address;
  75.       a = (char *) &address;
  76.       b = (char *) &cur_endmj;
  77.       pn = t2bunpack (a);
  78.       pn_eomj = t2bunpack (b);
  79.       off = t2bunpack (a + size2b);
  80.       off_eomj = t2bunpack (b + size2b);
  81.       if (pn > pn_eomj)
  82. cur_endmj = address;
  83.       else if (pn == pn_eomj && off > off_eomj)
  84. cur_endmj = address;
  85.     }
  86.   if (buf->b_prmod != PRMOD)
  87.     buf->b_prmod = prmod;
  88.   buf->b_status--;
  89.   if (buf->b_status == USED)
  90.     {
  91.       if (page->p_queue != NULL)
  92. change_prio (buf, LOCKED);
  93.       else
  94. change_prio (buf, FREE);
  95.     }
  96. }
  97. /******************************** the end ***********************************/