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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  opinpg.c  -  Low level operations inside DB pages
  3.  *               Kernel of GNU SQL-server 
  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: opinpg.c,v 1.246 1997/04/15 11:45:41 vera Exp $ */
  29. #include "xmem.h"
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. extern i4_t minidnt;
  34. static int
  35. lookidtr (char *a) /* 1 - this record may be removed, 0 - not */
  36. {
  37.   unsigned char t;
  38.   t = *a & MSKCORT;
  39.   if (t == IDTR)
  40.     {
  41.       i4_t idtran;
  42.       idtran = t4bunpack (a + 1);
  43.       if (idtran < minidnt)
  44.         return (1);
  45.     }
  46.   return (0);
  47. }
  48. int
  49. testfree (char *asp, u2_t fs, u2_t corsize)
  50. /*  1 - this page is empty    */
  51. /* -1 - no allocation         */
  52.         /*  0 - allocation is present */
  53. {
  54.   u2_t *ali, *ai;
  55.   ai = (u2_t *) (asp + phsize);
  56.   for (ali = ai + ((struct page_head *) asp)->lastin; ai <= ali; ai++)
  57.     if (*ai != 0 && CHECK_PG_ENTRY(ai) && (lookidtr (*ai + asp) == 1))
  58.       {
  59. fs += MIN_TUPLE_LENGTH + size2b;
  60. if (fs == BD_PAGESIZE - phsize)
  61.   return (1); /* this page is empty */
  62.       }
  63.   if (fs >= corsize + size2b)
  64.     return (0);
  65.   return (-1);
  66. }
  67. static void
  68. shift_cut (u2_t *ai, char *asp, i4_t idt_count, u2_t *afi, u2_t sn, u2_t pn, i4_t idm)
  69. {
  70.   i2_t shsize = 0;
  71.   u2_t fs, off, *aci;
  72.   char *af, *src, *dst;
  73.   i4_t n;
  74.   n = ai - afi;
  75.   if (n != 0)
  76.     {
  77.       shsize = idt_count * MIN_TUPLE_LENGTH;
  78.       off = *afi;
  79.       af = asp + off;
  80.       fs = *afi - *ai;
  81.       recmjform (COMBR, sn, pn, idm, off, fs, af, shsize);
  82.       for (src = af - 1, dst = src + shsize; fs != 0; fs--)
  83.         *dst-- = *src--;
  84.     }
  85.   af = (char *)(afi - idt_count);
  86.   recmjform (OLD, sn, pn, idm, af - asp, idt_count * size2b, af, 0);
  87.   for (aci = (u2_t *)af; idt_count >= 0; idt_count--)
  88.     *aci++ = 0;
  89.   for (; n != 0; n--)
  90.     *aci++ += shsize;
  91. }
  92. void
  93. rempbd (char *asp, u2_t sn, u2_t pn, i4_t idm)
  94. {/* remove records about committed transactions deletions */
  95.   i4_t what_do = 0, idt_count = 0;
  96.   u2_t *ali, *ai, *afi;
  97.   struct page_head *ph;
  98.   
  99.   afi = ai = (u2_t *) (asp + phsize);
  100.   ph = (struct page_head *) asp;
  101.   for (ali = ai + ph->lastin; ai <= ali; ai++)
  102.     {
  103.       if (*ai != 0 && CHECK_PG_ENTRY(ai))
  104.         {
  105.           if (lookidtr (*ai + asp) == 1)
  106.             {
  107.               if (what_do == 2)
  108.                 {
  109.                   shift_cut (ai - 1, asp, idt_count, afi, sn, pn, idm);
  110.                   what_do = 0;
  111.                   idt_count = 0;
  112.                 }
  113.               idt_count++;
  114.               afi = ai;
  115.               what_do = 1;
  116.             }
  117.           else if (what_do == 1)
  118.             what_do = 2;
  119.         }
  120.       else if (what_do != 0)
  121.         {
  122.           shift_cut (ai - 1, asp, idt_count, afi, sn, pn, idm);
  123.           what_do = 0;
  124.           idt_count = 0;
  125.         }
  126.     }
  127.   if (what_do != 0)
  128.     shift_cut (ai - 1, asp, idt_count, afi, sn, pn, idm);
  129.   if (*ali == 0)
  130.     {
  131.       char *b;
  132.       b = (char *) &ph->lastin;
  133.       afi = (u2_t *) (asp + phsize);
  134.       recmjform (OLD, sn, pn, idm, b - asp, size2b, b, 0);
  135.       for (ai = ali - 1; ai >= afi && *ai == 0; )
  136. ai--;
  137.       ph->lastin = ai - afi;
  138.     }
  139. }
  140. void
  141. inscort (u2_t sn, struct des_tid *tid, i4_t idm, char *asp, char *cort, u2_t corsize)
  142. {
  143.   u2_t *ali, *ai;
  144.   struct page_head *ph;
  145.   
  146.   ai = (u2_t *) (asp + phsize);
  147.   ph = (struct page_head *) asp;
  148.   ali = ai + ph->lastin;
  149.   ai += tid->tindex;
  150.   if (ai > ali)
  151.     {
  152.       char *b;
  153.       b = (char *) &ph->lastin;
  154.       recmjform (OLD, sn, tid->tpn, idm, b - asp, size2b, b, 0);
  155.       ph->lastin += 1;
  156.       *ai = *ali - corsize;
  157.       bcopy (cort, asp + *ai, corsize);
  158.     }
  159.   else
  160.     exspind (sn, tid, idm, asp, 0, corsize, cort);
  161. }
  162. void
  163. exspind (u2_t sn, struct des_tid *tid, i4_t idm, char *asp,
  164.          u2_t oldsize, u2_t newsize, char *nc)
  165. {
  166.   char *a;
  167.   u2_t *afi, *ali, *ai, *aci, pn;
  168.   i2_t delta;
  169.   afi = (u2_t *) (asp + phsize);
  170.   ai = afi + tid->tindex;
  171.   ali = afi + ((struct page_head *) asp)->lastin;
  172.   delta = newsize - oldsize;
  173.   a = (char *) ai;
  174.   pn = tid->tpn;
  175.   recmjform (OLD, sn, pn, idm, a - asp, (ali - ai + 1) * size2b, a, 0);
  176.   for (aci = ai; aci > afi && *aci == 0;)
  177.     aci--;
  178.   if (ai != ali)
  179.     {
  180.       u2_t fs;
  181.       if (aci == afi)
  182.         fs = BD_PAGESIZE - *ali;
  183.       else
  184.         fs = *aci - *ali;
  185.       recmjform (SHF, sn, pn, idm, *ali, fs, NULL, delta);
  186.       a = asp + *ali;
  187.       bcopy (a, a - delta, fs);
  188.     }
  189.   if (*ai != 0)
  190.     {
  191.       recmjform (OLD, sn, pn, idm, *ai, oldsize, *ai + asp, 0);
  192.       *ai -= delta;
  193.     }
  194.   else
  195.     {
  196.       if (aci == afi)
  197. *ai = BD_PAGESIZE - newsize;
  198.       else
  199. *ai = *aci - newsize;
  200.     }
  201.   for (afi = ai + 1; afi <= ali; afi++)
  202.     if (*afi != 0)
  203.       *afi -= delta;
  204.   bcopy (nc, asp + *ai, newsize);
  205. }
  206. void
  207. compress (u2_t sn, struct des_tid *tid, i4_t idm, char *asp,
  208.           u2_t oldsize, u2_t newsize)
  209. {
  210.   char *src, *dst, *af;
  211.   u2_t *ali, *aci, *ai, pn;
  212.   i2_t delta;
  213.   ai = (u2_t *)(asp + phsize) + tid->tindex;
  214.   pn = tid->tpn;
  215.   src = asp + *ai;
  216.   delta = oldsize - newsize;
  217.   ali = (u2_t *) (asp + phsize) + ((struct page_head *) asp)->lastin;
  218.   af = (char *) ai;
  219.   recmjform (OLD, sn, pn, idm, af - asp, (ali - ai + 1) * size2b, af, 0);
  220.   recmjform (OLD, sn, pn, idm, *ai, oldsize, src, 0);
  221.   if (ai != ali)
  222.     {
  223.       u2_t fs;
  224.       fs = *ai - *ali;
  225.       recmjform (SHF, sn, pn, idm, *ali, fs, NULL, -delta);
  226.       for (src--, dst = src + delta; fs != 0; fs--)
  227.         *dst-- = *src--;
  228.     }
  229.   for (aci = ai; aci <= ali; aci++)
  230.     if (*aci != 0)
  231.       *aci += delta;
  232. }