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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  trns.c  - Transaction service top routine
  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: trns.c,v 1.248 1997/04/17 11:03:20 vera Exp $ */
  28. #include "setup_os.h"
  29. #include "xmem.h"
  30. #include <sys/types.h>
  31. #if TIME_WITH_SYS_TIME
  32. # include <sys/time.h>
  33. # include <time.h>
  34. #else
  35. # if HAVE_SYS_TIME_H
  36. #  include <sys/time.h>
  37. # else
  38. #  include <time.h>
  39. # endif
  40. #endif
  41. #include <signal.h>
  42. #include <sys/ipc.h>
  43. #include <sys/msg.h>
  44. #ifdef HAVE_UNISTD_H
  45. #include <unistd.h>
  46. #endif
  47. #include "destrn.h"
  48. #include "strml.h"
  49. #include "expop.h"
  50. #include "fdcltrn.h"
  51. #ifndef CLK_TCK
  52. #define CLK_TCK 60
  53. #endif
  54. /*------ Transaction globals ------------------*/
  55. i4_t ljmsize;
  56. i4_t ljrsize;
  57. i4_t riskdmsz;
  58. i4_t  IAMM = 0;
  59. COST cost = 0L;
  60. CPNM curcpn = 1;
  61. struct des_nseg desnseg;
  62. struct ADREC bllj;
  63. struct ADREC blmj;
  64. char *pbuflj = bllj.block;
  65. char *bufmj = blmj.block;
  66. char *pbufmj;
  67. struct ldesind **TAB_IFAM;
  68. i4_t TIFAM_SZ;
  69. struct d_r_t *firstrel = NULL;
  70. char **scptab;
  71. i2_t maxscan = DTSCAN;
  72. i4_t idtr;
  73. i4_t minidnt;
  74. u2_t trnum;
  75. struct ADBL adlj;
  76. struct ADBL admj;
  77. u2_t EXNSSIZE;
  78. u2_t S_SC_S;
  79. struct dmbl_head *ffrdmbl;
  80. struct dmbl_head *lfrdmbl;
  81. /*---------------------------------------------*/
  82. pid_t parent;
  83. static key_t keyadm, keylj, keymj, keybf, keysn, keysr, keytrn;
  84. i4_t msqida, msqidl, msqidm, msqidb, msqids, msqidq, msqidt;
  85. /*i4_t sser, ns;*/
  86. extern i4_t errno;
  87. i4_t TRNUM, N_AT_SEG = 0;
  88. char *savestring (char *);
  89. #define ARG(num, what, type)   sscanf (args[num], "%d", &argum); 
  90.                                what = (type)(argum)
  91. #define PRINT(x, y) /*printf(x, y);*/
  92. void
  93. trans_init (i4_t argc,char *args[])
  94. {
  95.   i4_t n;
  96.   struct des_exns *desext;
  97.   struct msg_buf sbuf;
  98.   i4_t extssize, s_sc_s;
  99.   char **s;
  100.   i4_t argum;
  101.   
  102.   setbuf (stdout, NULL);
  103.   ARG(1, keytrn, key_t);
  104.   ARG(2, keysn, key_t);
  105.   ARG(3, keysr, key_t);
  106.   ARG(4, keylj, key_t);
  107.   ARG(5, keymj, key_t);
  108.   ARG(6, keybf, key_t);
  109.   ARG(7, TRNUM, i4_t);
  110.   trnum = TRNUM + CONSTTR;
  111.   ARG(8, minidnt, i4_t);
  112.   ARG(9, extssize, i4_t);
  113.   EXNSSIZE = extssize;
  114.   ARG(10, s_sc_s, i4_t);
  115.   ARG(14, parent, pid_t);
  116.   ARG(15, keyadm, key_t);
  117.   
  118.   S_SC_S = s_sc_s;
  119.   if ((msqidt = msgget (keytrn, IPC_CREAT | DEFAULT_ACCESS_RIGHTS)) < 0)
  120.     {
  121.       perror ("TRN.msgget: Queue for TRN");
  122.       exit (1);
  123.     }
  124.   
  125.   MSG_INIT (msqidl, keylj,  "LJ");
  126.   MSG_INIT (msqidm, keymj,  "MJ");
  127.   MSG_INIT (msqida, keyadm, "ADM");
  128.   MSG_INIT (msqidb, keybf,  "BUF");
  129.   MSG_INIT (msqids, keysn,  "SYN");
  130.   MSG_INIT (msqidq, keysr,  "SORT");
  131.   TIFAM_SZ = 2;
  132.   TAB_IFAM = (struct ldesind **) xmalloc (TIFAM_SZ * sizeof (struct ldesind **));
  133.   TAB_IFAM[0] = NULL;
  134.   TAB_IFAM[1] = NULL;
  135.   tab_difam (1);
  136.   adlj.cm = 0;
  137.   ljmsize = size1b + size4b + 2 * size2b + size2b + size4b + 2 * size2b + tidsize;
  138.   ljrsize = size1b + size4b + 2 * size2b;
  139.   scptab = (char **) xmalloc (chpsize * maxscan);
  140.   for (n = 0; n < maxscan; n++)
  141.     scptab[n] = NULL;
  142.   desnseg.lexnum = 0;
  143.   desnseg.mexnum = DEXTD;
  144.   desnseg.dextab = (struct des_exns *) xmalloc (dexsize * DEXTD);
  145.   for (n = 0, desext = desnseg.dextab; n < DEXTD; n++, desext++)
  146.     desext->efpn = (u2_t) ~ 0;
  147.   desnseg.mtobnum = TOBPTD;
  148.   desnseg.tobtab = (char **) xmalloc (chpsize * TOBPTD);
  149.   for (n = 0, s = desnseg.tobtab; n < TOBPTD; n++)
  150.     s[n] = NULL;
  151.   sbuf.mtype = START;
  152.   t2bpack (trnum, sbuf.mtext);
  153.   __MSGSND(msqids, &sbuf, size2b, 0,"TRN.msgsnd: START to SYN");
  154. } /* trans_init */
  155. #undef ARG
  156. int
  157. svpnt (void)
  158. {
  159.   struct msg_buf sbuf;
  160.   struct id_rel idr;
  161.   sbuf.mtype = SVPNT;
  162.   t2bpack (trnum, sbuf.mtext);
  163.   __MSGSND(msqids, &sbuf, size2b, 0,"TRN.msgsnd: SVPNT to SYN");
  164.   __MSGRCV(msqids, &sbuf, cpnsize, trnum, 0,"TRN.msgrcv: SVPNT from SYN");
  165.   curcpn = *(CPNM *) sbuf.mtext;
  166.   wmlj (CPRLJ, ljrsize + cpnsize, &adlj, &idr, NULL, curcpn);
  167.   return (curcpn);
  168. }
  169. int
  170. killtran (void)
  171. {
  172.   struct msg_buf sbuf;
  173.   u2_t n, num_tob;
  174.   struct des_tob *dt;
  175.   
  176.   if (IAMM != 0)
  177.     {
  178.       t2bpack (WLJET, sbuf.mtext);
  179.       ADM_SEND (TRNUM, size2b, "TRN.msgsnd: WLJET to ADM");
  180.       __MSGRCV(msqidl, &sbuf, 0, trnum, 0,"TRN.msgrcv: Answer from LJ");
  181.     }
  182.   num_tob = desnseg.mtobnum;
  183.   for (n = 0; n < num_tob; n++)
  184.     {
  185.       dt = (struct des_tob *) *(desnseg.tobtab + n);
  186.       if (dt != NULL)
  187.         {
  188.           delscd (dt->osctob, (char *) dt);
  189.           xfree ((void *) dt);
  190.         }
  191.     }
  192.   sbuf.mtype = COMMIT;
  193.   t2bpack (trnum, sbuf.mtext);
  194.   __MSGSND(msqids, &sbuf, size2b, 0,"TRN.msgsnd: COMMIT to SYN");
  195.   __MSGRCV(msqids, &sbuf, 0, trnum, 0,"TRN.msgrcv: COMMIT from SYN");
  196.   return (OK);
  197. }
  198. int
  199. closesc (i4_t scnum)
  200. {
  201.   char **t, sctype;
  202.   struct d_mesc *scpr;
  203.   struct d_r_t *desrel;
  204.   struct d_sc_i *scind;
  205.   struct ldesscan *desscan;
  206.   struct des_tob *dt;
  207.   if (scnum > maxscan)
  208.     return (NDSC);
  209.   t = scptab + scnum;
  210.   scpr = (struct d_mesc *) * t;
  211.   if (scpr == NULL)
  212.     return (NDSC);
  213.   if ((sctype = scpr->obsc) == SCR)
  214.     { /* relation scan */
  215.       desrel = (struct d_r_t *) scpr->pobsc;
  216.       desrel->oscnum--;
  217.       scind = (struct d_sc_i *) scpr;
  218.       desscan = &scind->dessc;
  219.       if (desscan->cur_key != NULL)
  220. {
  221.   xfree ((void *) desscan->cur_key);
  222. }
  223.     }
  224.   else if (sctype == SCI)
  225.     { /* index scan */
  226.       scind = (struct d_sc_i *) scpr;
  227.       desscan = &scind->dessc;
  228.       if (desscan->cur_key != NULL)
  229. {
  230.   xfree ((void *) desscan->cur_key);
  231. }
  232.       desscan->pdi->oscni--;
  233.     }
  234.   else if (sctype == SCTR || sctype == SCF)
  235.     {
  236.       dt = (struct des_tob *) scpr->pobsc;
  237.       dt->osctob--;
  238.     }
  239.   else
  240.     return (NDSC);
  241.   xfree ((void *) *t);
  242.   *t = NULL;
  243.   return (OK);
  244. }
  245. int
  246. mempos (i4_t scnum)
  247. {
  248.   struct d_mesc *scpr;
  249.   struct d_sc_r *screl;
  250.   struct d_sc_i *scind;
  251.   struct d_sc_f *scfltr;
  252.   char sctype;
  253.   scpr = (struct d_mesc *) * (scptab + scnum);
  254.   if (scnum >= maxscan || scpr == NULL)
  255.     return (NDSC);
  256.   if ((sctype = scpr->obsc) == SCTR)
  257.     { /* temporary relation scan */
  258.       screl = (struct d_sc_r *) scpr;
  259.       screl->memtid = screl->curtid;
  260.     }
  261.   else if (sctype == SCI || sctype == SCR)
  262.     { /* index scan */
  263.       scind = (struct d_sc_i *) scpr;
  264.       scind->dessc.mtidi = scind->dessc.ctidi;
  265.     }
  266.   else if (sctype == SCF)
  267.     {
  268.       scfltr = (struct d_sc_f *) scpr;
  269.       scfltr->mpnf = scfltr->pnf;
  270.       scfltr->mofff = scfltr->offf;
  271.     }
  272.   return (OK);
  273. }
  274. int
  275. curpos (i4_t scnum)
  276. {
  277.   struct d_mesc *scpr;
  278.   struct d_sc_r *screl;
  279.   struct d_sc_i *scind;
  280.   struct d_sc_f *scfltr;
  281.   char sctype;
  282.   scpr = (struct d_mesc *) * (scptab + scnum);
  283.   if (scnum >= maxscan || scpr == NULL)
  284.     return (NDSC);
  285.   if ((sctype = scpr->obsc) == SCTR)
  286.     { /* temporary relation scan */
  287.       screl = (struct d_sc_r *) scpr;
  288.       screl->curtid = screl->memtid;
  289.     }
  290.   else if (sctype == SCI || sctype == SCR)
  291.     { /* index scan */
  292.       scind = (struct d_sc_i *) scpr;
  293.       scind->dessc.ctidi = scind->dessc.mtidi;
  294.     }
  295.   else if (sctype == SCF)
  296.     {
  297.       scfltr = (struct d_sc_f *) scpr;
  298.       scfltr->pnf = scfltr->mpnf;
  299.       scfltr->offf = scfltr->mofff;
  300.     }
  301.   return (OK);
  302. }
  303. void
  304. modmes (void)
  305. {
  306.   struct msg_buf sbuf;
  307.   if (IAMM != 0)
  308.     return;
  309.   t2bpack (IAMMOD, sbuf.mtext);
  310.   ADM_SEND (TRNUM, size2b, "TRN.msgsnd: IAMMOD to ADM");
  311.   __MSGRCV(msqidt, &sbuf, size4b, (i4_t) trnum, 0,"TRN.msgrcv: IAMMOD from ADM");
  312.   idtr = t4bunpack (sbuf.mtext);
  313.   IAMM++;
  314.   return;
  315. }
  316. i4_t
  317. uniqnm (void)
  318. {
  319.   i4_t uniq_name;
  320.   struct msg_buf sbuf;
  321.   t2bpack (UNIQNM, sbuf.mtext);
  322.   ADM_SEND (TRNUM, size2b, "TRN.msgsnd: uniqnm to ADM");
  323.   __MSGRCV(msqidt, &sbuf, size4b, (i4_t) trnum, 0,"TRN.msgrcv: uniqnm from ADM");
  324.   uniq_name = t4bunpack (sbuf.mtext);
  325.   return (uniq_name);
  326. }
  327. CPNM
  328. sn_lock (struct id_rel *pidrel, i4_t t, char *lc, i4_t sz)
  329. {
  330.   char *p;
  331.   struct msg_buf sbuf;
  332.   CPNM cpn;
  333.   sbuf.mtype = LOCK;
  334.   p = sbuf.mtext;
  335.   BUFPACK(trnum,p);
  336.   BUFPACK(*pidrel,p);
  337.   BUFPACK(cost,p);
  338.   *p++ = t;
  339.   BUFPACK(sz,p);
  340.   bcopy (lc, p, sz);
  341.   p += sz;
  342.   __MSGSND(msqids, &sbuf, p - sbuf.mtext, 0,"TRN.msgsnd: LOCK to SYN");
  343.   __MSGRCV(msqids, &sbuf, cpnsize, trnum, 0,"TRN.msgrcv: LOCK from SYN");
  344.   cpn = *(CPNM *) sbuf.mtext;
  345.   return (cpn);
  346. }
  347. void
  348. sn_unltsp (CPNM cpn)
  349. {
  350.   struct msg_buf sbuf;
  351.   char *p;
  352.   
  353.   sbuf.mtype = UNLTSP;
  354.   p = sbuf.mtext;
  355.   BUFPACK(trnum,p);
  356.   BUFPACK(cpn,p);
  357.   __MSGSND(msqids, &sbuf, cpnsize + size2b, 0,"TRN.msgsnd: UNLTSP to SYN");
  358.   __MSGRCV(msqids, &sbuf, 0, trnum, 0,"TRN.msgrcv: UNLTSP from SYN");
  359. }
  360. static void
  361. sort (i4_t type, u2_t sn, u2_t * fpn, struct des_field *df, u2_t fn, u2_t fdfn,
  362.       u2_t * fsrt, u2_t kn, char prdbl, char *drctn, u2_t * lpn)
  363. {
  364.   u2_t n;
  365.   char *p;
  366.   struct msg_buf sbuf;
  367.   COST cost1;
  368.   sbuf.mtype = type;
  369.   p = sbuf.mtext;
  370.   BUFPACK(trnum,p);
  371.   BUFPACK(*fpn,p);
  372.   BUFPACK(fn,p);
  373.   BUFPACK(fdfn,p);
  374.   for (; fn != 0; fn--, df++)
  375.     BUFPACK(*df,p);
  376.   if (type == FLSORT)
  377.     BUFPACK(sn,p);
  378.   BUFPACK(kn,p);
  379.   for (n = kn; n != 0; n--, fsrt++)
  380.     BUFPACK(*fsrt,p);
  381.   *p++ = prdbl;
  382.   bcopy (drctn, p, kn);
  383.   p += kn;
  384.   
  385.   PRINTF (("TRN.sort: trnum = %dn", trnum));
  386.   
  387.   __MSGSND(msqidq, &sbuf, p - sbuf.mtext, 0,"TRN.msgsnd: SORT to SRT");
  388.   __MSGRCV(msqidq, &sbuf, 2 * size2b + sizeof (COST), trnum, 0,
  389.            "TRN.msgrcv: SORT from SRT");
  390.   p = sbuf.mtext;
  391.   BUFUPACK(p,*fpn);
  392.   BUFUPACK(p,*lpn);
  393.   BUFUPACK(p,cost1);
  394.   cost += cost1;
  395. }
  396. void
  397. srtr_trsort (u2_t * fpn, struct des_field *df, u2_t fn, u2_t fdfn,
  398.              u2_t * fsrt,u2_t kn, char prdbl, char *drctn, u2_t * lpn)
  399. {
  400.   sort (TRSORT, 0, fpn, df, fn, fdfn, fsrt, kn, prdbl, drctn, lpn);
  401. }
  402. void
  403. srtr_flsort (u2_t sn, u2_t * fpn, struct des_field *df, u2_t fn,
  404.              u2_t fdfn, u2_t * mfn,
  405.              u2_t kn, char prdbl, char *drctn, u2_t * lpn)
  406. {
  407.   sort (FLSORT, sn, fpn, df, fn, fdfn, mfn, kn, prdbl, drctn, lpn);
  408. }
  409. void
  410. srtr_tid (struct des_tob *dt)
  411. {
  412.   char *p;
  413.   struct msg_buf sbuf;
  414.   COST cost1;
  415.   u2_t fpn, lpn;
  416.   sbuf.mtype = TIDSRT;
  417.   p = sbuf.mtext;
  418.   BUFPACK(trnum,p);
  419.   BUFPACK(dt->firstpn,p);
  420.   __MSGSND(msqidq, &sbuf, 2 * size2b, 0,"TRN.msgsnd: SORT to SRT");
  421.   __MSGRCV(msqidq, &sbuf, 2 * size2b + sizeof (cost1), trnum, 0,
  422.            "TRN.msgrcv: SORT from SRT");
  423.   p = sbuf.mtext;
  424.   BUFUPACK(p,fpn);
  425.   BUFUPACK(p,lpn);
  426. dt->firstpn = fpn;
  427. dt->lastpn = lpn;
  428.   BUFUPACK(p,cost1);
  429.   cost += cost1;
  430. }
  431. void
  432. LJ_GETREC (struct ADBL *pcadlj)
  433. {
  434.   char *p;
  435.   struct msg_buf sbuf;
  436.   sbuf.mtype = GETREC;
  437.   p = sbuf.mtext;
  438.   t2bpack (trnum, p);
  439.   p += size2b;
  440.   bcopy ((char *) pcadlj, p, adjsize);
  441.   __MSGSND(msqidl, &sbuf, adjsize + size2b, 0,"TRN.msgsnd: LJ GETREC");
  442.   __MSGRCV(msqidl, &sbuf, sizeof (struct ADREC), trnum, 0,"TRN.msgrcv: Answer from LJ");
  443.   p = sbuf.mtext;
  444.   bllj.razm = t2bunpack (p);
  445.   p += size2b;
  446.   bcopy (p, pbuflj, bllj.razm);
  447. }
  448. void
  449. ADMT_getext (u2_t * pn)
  450. {
  451.   struct msg_buf sbuf;
  452.   t2bpack (GETEXT, sbuf.mtext);
  453.       
  454.   /* PRINT ("TRN.ADMT_getext before send: TRNUM = %dn", (i4_t)TRNUM)*/
  455.   
  456.   ADM_SEND (TRNUM, size2b, "TRN.msgsnd: GETEXT to ADM");
  457.       
  458.   /*  PRINT ("TRN.ADMT_getext before receive: msqidt = %dn", (i4_t)msqidt)*/
  459.   /*  PRINT ("TRN.ADMT_getext before receive: trnum  = %dn", (i4_t)trnum)*/
  460.   
  461.   __MSGRCV(msqidt, &sbuf, size2b, trnum, 0,"TRN.msgrcv: GETEXT from ADM");
  462.       
  463.   PRINT ("TRN.ADMT_getext after receive: sbuf.mtype = %dn", (i4_t)sbuf.mtype)
  464.   
  465.   *pn = t2bunpack (sbuf.mtext);
  466. }
  467. void
  468. ADMT_putext (u2_t * mfpn, u2_t cnt)
  469. {
  470.   struct msg_buf sbuf;
  471.   u2_t *p, *a;
  472.   
  473.   p = (u2_t *) sbuf.mtext;
  474.   *p++ = PUTEXT;
  475.   *p++ = cnt;
  476.   for (a = p + cnt; p < a;)
  477.     *p++ = *mfpn;
  478.       
  479.   /*  PRINT ("TRN.ADMT_putext before receive: msqida = %dn", (i4_t)msqida)*/
  480.   /*  PRINT ("TRN.ADMT_putext before receive: TRNUM  = %dn", (i4_t)TRNUM)*/
  481.   
  482.   ADM_SEND (TRNUM, (2 + cnt) * size2b, "TRN.msgsnd: PUTEXT to ADM");
  483. }
  484. void
  485. BUF_endop (void)
  486. {
  487.   struct msg_buf sbuf;
  488.   sbuf.mtype = ENDOP;
  489.   __MSGSND(msqidb, &sbuf, 0, 0,"TRN.msgsnd: ENDOP to BUF");
  490.   assert (N_AT_SEG == 0);
  491. }
  492. void
  493. error (char *s)
  494. {
  495.   printf ("error: %sn", s);
  496.   exit (0);
  497. }