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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  obrind.c  -  Addresses to Index Control Programm
  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: obrind.c,v 1.247 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. #include <assert.h>
  34. extern struct ldesind **TAB_IFAM;
  35. u2_t
  36. getrec (u2_t sn, i4_t rn, u2_t pn, struct A *pg, u2_t * offloc)
  37. {
  38.   char *a;
  39.   u2_t size;
  40.   char key[size4b + 1], key2[size2b];
  41.   char *begagr, *loc;
  42.   a = key;
  43.   *a++ = BITVL(0) | EOSC;
  44.   t4bpack (rn, a);
  45.   t2bpack (pn, key2);
  46.   tab_difam (sn);
  47.   a = icp_lookup (pg, TAB_IFAM[sn], key, key2, size2b, &begagr, &loc);
  48.   assert (a != NULL);
  49.   size = t2bunpack (a + size2b);
  50.   *offloc = a + size2b - pg->p_shm;
  51.   putwul (pg, 'n');
  52.   return (size);
  53. }
  54. int
  55. fgetnext (struct ldesscan *desscn, u2_t * pn, u2_t * size, i4_t modescan)
  56. /* delrel,opscrl */
  57. {
  58.   return (fscan_ind (desscn, (char *) pn, (char *) size, size2b, modescan));
  59. }
  60. int
  61. getnext (struct ldesscan *desscn, u2_t * pn, u2_t * size, i4_t modescan)
  62. /* delrel,opscrl */
  63. {
  64.   return (scan_ind (desscn, (char *) pn, (char *) size, size2b, modescan));
  65. }
  66. void
  67. modcur (struct ldesscan *desscn, u2_t size)
  68. /* only for IFAM: ordins,delcon */
  69. {
  70.   char *asp, *a;
  71.   struct A pg;
  72.   u2_t sn, pn, off;
  73.   i4_t idm;
  74.   sn = desscn->pdi->i_segn;
  75.   pn = desscn->curlpn;
  76.   while (BUF_enforce (sn, pn) < 0);
  77.   asp = getwl (&pg, sn, pn);
  78.   off = desscn->offp + size2b;
  79.   a = asp + off;
  80.   idm = begmop (asp);
  81.   recmjform (OLD, sn, pn, idm, off, size2b, a, 0);
  82.   MJ_PUTBL ();
  83.   t2bpack (size, a);
  84.   putpg (&pg, 'm');
  85. }
  86. void
  87. modrec (u2_t sn, i4_t rn, u2_t pn, i2_t delta)
  88. /* only for IFAM: orddel,ordmod */
  89. {
  90.   char *a, *asp;
  91.   char key[size4b + 1];
  92.   char key2[size2b];
  93.   struct A pg;
  94.   char *begagr, *loc;
  95.   u2_t size, pn1;
  96.   i4_t idm;
  97.   a = key;
  98.   *a++ = BITVL(0) | EOSC;
  99.   t4bpack (rn, a);
  100.   t2bpack (pn, key2);
  101.   tab_difam (sn);
  102.   a = icp_lookup (&pg, TAB_IFAM[sn], key, key2, size2b, &begagr, &loc);
  103.   assert (a != NULL);
  104.   pn1 = pg.p_pn;
  105.   BUF_enforce (sn, pn1);
  106.   beg_mop ();
  107.   asp = pg.p_shm;
  108.   idm = ++((struct p_head *) asp)->idmod;
  109.   a += size2b;
  110.   recmjform (OLD, sn, pn1, idm, a - asp, size2b, a, 0);
  111.   MJ_PUTBL ();
  112.   size = t2bunpack (a);
  113.   size += delta;
  114.   t2bpack (size, a);
  115.   putpg (&pg, 'm');
  116. }
  117. int
  118. insrec (struct ldesind *desind, i4_t rn, u2_t pn, u2_t size)
  119. /* only for IFAM: ordins */
  120. {
  121.   char *a;
  122.   char key[size4b + 1], key2[size2b], inf[size2b];
  123.   a = key;
  124.   *a++ = BITVL(0) | EOSC;
  125.   t4bpack (rn, a);
  126.   t2bpack (pn, key2);
  127.   t2bpack (size, inf);
  128.   return (icp_insrtn (desind, key, key2, inf, size2b));
  129. }
  130. int
  131. delrec (struct ldesind *desind, i4_t rn, u2_t pn)
  132. /* only for IFAM: */
  133. {
  134.   char *a;
  135.   char key[size4b + 1], key2[size2b];
  136.   a = key;
  137.   *a++ = BITVL(0) | EOSC;
  138.   t4bpack (rn, a);
  139.   t2bpack (pn, key2);
  140.   return (icp_rem (desind, key, key2, size2b));
  141. }
  142. void
  143. crindci (struct ldesind *desind) /* only for ordind: crind */
  144. {
  145.   char *asp;
  146.   u2_t sn, pn;
  147.   struct ind_page *indph;
  148.   struct A pg;
  149.   sn = desind->i_segn;
  150.   pn = getempt (sn);
  151.   asp = getnew (&pg, sn, pn);
  152.   indph = (struct ind_page *) asp;
  153.   indph->ind_ph.idmod = 0L;
  154.   indph->ind_nextpn = (u2_t) ~ 0;
  155.   indph->ind_off = indphsize;
  156.   indph->ind_wpage = LEAF;
  157.   putwul (&pg, 'm');
  158.   desind->ldi.rootpn = pn;
  159. }
  160. /*
  161. static
  162. void
  163. tidpack (struct des_tid *tid, char *pnt)
  164. {
  165.     t2bpack(tid->tindex,pnt); pnt+=size2b;
  166.     t2bpack(tid->tpn,pnt);
  167. }
  168. */
  169. static
  170. void
  171. tidunpack (struct des_tid *tid, char *pnt)
  172. {
  173. /*
  174.     tid->tindex=t2bunpack(pnt); pnt+=size2b;
  175.     tid->tpn=t2bunpack(pnt);
  176.     */
  177.   bcopy (pnt, (char *) tid, tidsize);
  178. }
  179. int
  180. ordindi (struct ldesind *desind,char * key, struct des_tid *tid)
  181.      /* only for ordind: proind */
  182. {
  183.   /*    tidpack(tid,key2);*/
  184.   return (icp_insrtn (desind, key, (char *) tid, (char *) NULL, 0));
  185. }
  186. int
  187. ordindd (struct ldesind *desind, char *key, struct des_tid *tid)
  188.      /* only for ordind: proind,mproind,rollback */
  189. {
  190.   /*    tidpack(tid,key2);*/
  191.   return (icp_rem (desind, key, (char *) tid, 0));
  192. }
  193. int
  194. ind_tid (struct ldesscan *desscn, struct des_tid *tid, i4_t modescan)
  195.      /* only for ordind: next */
  196. {
  197.   i4_t ans;
  198.   char mas[2 * size2b];
  199.   
  200.   ans = scan_ind (desscn, mas, NULL, 0, modescan);
  201.   if (ans == OK)
  202.     tidunpack (tid, mas);
  203.   return (ans);
  204. }
  205. int
  206. ind_ftid (struct ldesscan *desscn, struct des_tid *tid, i4_t modescan)
  207. /* only for ordind: opscin */
  208. {
  209.   i4_t ans;
  210.   char mas[2 * size2b];
  211.   
  212.   ans = fscan_ind (desscn, mas, NULL, 0, modescan);
  213.   if (ans == OK)
  214.     tidunpack (tid, mas);
  215.   return (ans);
  216. }