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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  rllbck.c  - Rollback
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by  Vera Ponomarenko
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts:   gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: rllbck.c,v 1.247 1997/04/15 11:45:41 vera Exp $ */
  28. #include "xmem.h"
  29. #include "destrn.h"
  30. #include "strml.h"
  31. #include "fdcltrn.h"
  32. extern char **scptab;
  33. extern struct d_r_t *firstrel;
  34. extern u2_t maxscan;
  35. extern struct ADREC bllj;
  36. extern struct ADBL adlj;
  37. extern i4_t idtr;
  38. extern CPNM curcpn;
  39. extern i4_t ljrsize;
  40. extern i4_t ljmsize;
  41. extern char *pbuflj;
  42. extern i4_t IAMM;
  43. int
  44. roll_back (i4_t cpn)
  45. {
  46.   if (cpn < 0 || IAMM == 0)
  47.     return (OK);
  48.   if (cpn <= curcpn)
  49.     {
  50.       rllbck ((CPNM) cpn, adlj);
  51.       return (OK);
  52.     }
  53.   else
  54.     return (NCF);
  55. }
  56. void
  57. rllbck (CPNM cpn, struct ADBL cadlj)
  58. {
  59.   u2_t sctype, n, corsize, pnr, indr, sn;
  60.   struct d_r_t *desrel, *prdr;
  61.   struct ldesind *di, *prdi;
  62.   struct d_mesc *scpr;
  63.   struct d_r_bd drbd;
  64.   CPNM cpnlj;
  65.   struct des_tid tid;
  66.   char *b, type, **t, *a;
  67.   i4_t rn, ordrn, cidtr;
  68.   char mch[2*BD_PAGESIZE];
  69.   for (; cadlj.cm != 0;)
  70.     {
  71.       LJ_GETREC (&cadlj);
  72.       a = pbuflj;
  73.       type = *a++;
  74.       cidtr = t4bunpack (a);
  75.       a += size4b;
  76.       if (cidtr != idtr)
  77. error ("TR.rllbck: The TR's record in LJ is false");
  78.       cadlj.npage = t2bunpack (a);
  79.       a += size2b;
  80.       cadlj.cm = t2bunpack (a);
  81.       a += size2b;
  82.       if (type == RLBLJ || type == RLBLJ_AS_OP)
  83. continue;
  84.       if (type == CPRLJ)
  85. {
  86.           bcopy (a, (char *) &cpnlj, cpnsize);
  87.   if (cpnlj == cpn)
  88.     break;
  89. }
  90.       else
  91. {
  92.           struct id_rel idr;
  93.   idr.urn.segnum = sn = t2bunpack (a);
  94.   a += size2b;
  95.   idr.urn.obnum = rn = t4bunpack (a);
  96.   a += size4b;
  97.   idr.pagenum = pnr = t2bunpack (a);
  98.   a += size2b;
  99.   idr.index = indr = t2bunpack (a);
  100.   a += size2b;
  101.   tid.tpn = t2bunpack (a);
  102.   a += size2b;
  103.   tid.tindex = t2bunpack (a);
  104.   a += size2b;
  105.   if (rn != RDRNUM)
  106.     {
  107.       for (desrel = firstrel; desrel != NULL; desrel = desrel->drlist)
  108. if (desrel->desrbd.relnum == rn)
  109.   break;
  110.       if (desrel == NULL)
  111. error ("TR.rllbck: The correspondent desrel is absentn");
  112.     }
  113.   else
  114.     desrel = NULL;
  115.   n = bllj.razm - ljmsize;
  116.           bcopy (a, mch, n);
  117.   a = mch;
  118.   wmlj (RLBLJ_AS_OP, ljrsize, &cadlj, &idr, &tid, 0);
  119.   if (type == DELLJ)
  120.     {
  121.       redo_insrtn (sn, desrel, rn, &tid, n, a);
  122.     }
  123.   else if (type == INSLJ)
  124.     {
  125.       redo_dltn (sn, desrel, rn, &tid, n, a);
  126.     }
  127.   else if (type == DLILJ)
  128.     { /* nead to create this index */
  129.       redo_cind (a, n, sn, pnr, indr, &tid);
  130.     }
  131.   else
  132.     {
  133.               struct des_tid ref_tid;
  134.       corsize = get_placement (sn, &tid, &ref_tid);
  135.       n -= corsize;
  136.       ordmod (sn, rn, &tid, &ref_tid, corsize, a, n);
  137.       if (rn != RDRNUM)
  138. {
  139.   b = a + n;
  140.   mproind (desrel, desrel->desrbd.indnum, b, a, &tid);
  141. }
  142.       else
  143. {
  144.   ordrn = t4bunpack (a + scscal (a));
  145.   desrel = firstrel;
  146.   for (; desrel->desrbd.relnum != ordrn; desrel = desrel->drlist);
  147.   if (desrel == NULL)
  148.     error ("TR.rllbck: The correspondent desrel is absentn");
  149.   if (type == CRILJ)
  150.     { /* nead to delete this index */
  151.       redo_dind (desrel, a + n);
  152.     }
  153.   else if (type == ADFLJ)
  154.     { /*nead to delete this fields */
  155.       drbdunpack (&drbd, a + scscal (a));
  156.       desrel->desrbd.fieldnum = drbd.fieldnum;
  157.     }
  158. }
  159.     }
  160.           BUF_endop ();
  161. }
  162.     }
  163.   sn_unltsp (cpn);
  164.   for (n = 0; n < maxscan; n++)
  165.     {
  166.       t = scptab + n;
  167.       scpr = (struct d_mesc *) * t;
  168.       if (scpr == NULL || scpr->cpnsc > cpn)
  169. continue;
  170.       if ((sctype = scpr->obsc) == SCR)
  171. { /* relation scan */
  172.   desrel = (struct d_r_t *) scpr->pobsc;
  173.   desrel->oscnum--;
  174. }
  175.       else if (sctype == SCI)
  176. { /* index scan */
  177.   di = (struct ldesind *) scpr->pobsc;
  178.   di->oscni--;
  179. }
  180.       xfree ((void *) *t);
  181.       *t = NULL;
  182.     }
  183.   desrel = firstrel;
  184.   for (prdr = NULL; desrel != NULL; prdr = desrel, desrel = desrel->drlist)
  185.     if (desrel->cpndr <= cpn)
  186.       {
  187. for (di = desrel->pid; di != NULL; di = di->listind)
  188.   xfree ((void *) di);
  189. if (prdr == NULL)
  190.   firstrel = desrel->drlist;
  191. else
  192.   prdr->drlist = desrel->drlist;
  193. xfree ((void *) desrel);
  194.       }
  195.     else
  196.       {
  197. for (prdi = NULL, di = desrel->pid; di != NULL; prdi = di, di = di->listind)
  198.   {
  199.     if (di->cpndi >= cpn)
  200.       continue;
  201.     if (prdi == NULL)
  202.       desrel->pid = NULL;
  203.     else
  204.       prdi->listind = di->listind;
  205.     xfree ((void *) di);
  206.   }
  207.       }
  208. }