db_conv.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. /*
  8.  * Copyright (c) 1990, 1993, 1994, 1995, 1996
  9.  * Keith Bostic.  All rights reserved.
  10.  */
  11. /*
  12.  * Copyright (c) 1990, 1993, 1994, 1995
  13.  * The Regents of the University of California.  All rights reserved.
  14.  *
  15.  * Redistribution and use in source and binary forms, with or without
  16.  * modification, are permitted provided that the following conditions
  17.  * are met:
  18.  * 1. Redistributions of source code must retain the above copyright
  19.  *    notice, this list of conditions and the following disclaimer.
  20.  * 2. Redistributions in binary form must reproduce the above copyright
  21.  *    notice, this list of conditions and the following disclaimer in the
  22.  *    documentation and/or other materials provided with the distribution.
  23.  * 3. Neither the name of the University nor the names of its contributors
  24.  *    may be used to endorse or promote products derived from this software
  25.  *    without specific prior written permission.
  26.  *
  27.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  28.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  29.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  30.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  31.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  32.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  33.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  34.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  35.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  36.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  37.  * SUCH DAMAGE.
  38.  */
  39. #include "db_config.h"
  40. #ifndef lint
  41. static const char revid[] = "$Id: db_conv.c,v 11.11 2000/11/30 00:58:31 ubell Exp $";
  42. #endif /* not lint */
  43. #ifndef NO_SYSTEM_INCLUDES
  44. #include <sys/types.h>
  45. #include <string.h>
  46. #endif
  47. #include "db_int.h"
  48. #include "db_page.h"
  49. #include "db_swap.h"
  50. #include "db_am.h"
  51. #include "btree.h"
  52. #include "hash.h"
  53. #include "qam.h"
  54. /*
  55.  * __db_pgin --
  56.  * Primary page-swap routine.
  57.  *
  58.  * PUBLIC: int __db_pgin __P((DB_ENV *, db_pgno_t, void *, DBT *));
  59.  */
  60. int
  61. __db_pgin(dbenv, pg, pp, cookie)
  62. DB_ENV *dbenv;
  63. db_pgno_t pg;
  64. void *pp;
  65. DBT *cookie;
  66. {
  67. DB_PGINFO *pginfo;
  68. pginfo = (DB_PGINFO *)cookie->data;
  69. switch (((PAGE *)pp)->type) {
  70. case P_HASH:
  71. case P_HASHMETA:
  72. case P_INVALID:
  73. return (__ham_pgin(dbenv, pg, pp, cookie));
  74. case P_BTREEMETA:
  75. case P_IBTREE:
  76. case P_IRECNO:
  77. case P_LBTREE:
  78. case P_LDUP:
  79. case P_LRECNO:
  80. case P_OVERFLOW:
  81. return (__bam_pgin(dbenv, pg, pp, cookie));
  82. case P_QAMMETA:
  83. case P_QAMDATA:
  84. return (__qam_pgin_out(dbenv, pg, pp, cookie));
  85. default:
  86. break;
  87. }
  88. return (__db_unknown_type(dbenv, "__db_pgin", ((PAGE *)pp)->type));
  89. }
  90. /*
  91.  * __db_pgout --
  92.  * Primary page-swap routine.
  93.  *
  94.  * PUBLIC: int __db_pgout __P((DB_ENV *, db_pgno_t, void *, DBT *));
  95.  */
  96. int
  97. __db_pgout(dbenv, pg, pp, cookie)
  98. DB_ENV *dbenv;
  99. db_pgno_t pg;
  100. void *pp;
  101. DBT *cookie;
  102. {
  103. DB_PGINFO *pginfo;
  104. pginfo = (DB_PGINFO *)cookie->data;
  105. switch (((PAGE *)pp)->type) {
  106. case P_HASH:
  107. case P_HASHMETA:
  108. case P_INVALID:
  109. return (__ham_pgout(dbenv, pg, pp, cookie));
  110. case P_BTREEMETA:
  111. case P_IBTREE:
  112. case P_IRECNO:
  113. case P_LBTREE:
  114. case P_LDUP:
  115. case P_LRECNO:
  116. case P_OVERFLOW:
  117. return (__bam_pgout(dbenv, pg, pp, cookie));
  118. case P_QAMMETA:
  119. case P_QAMDATA:
  120. return (__qam_pgin_out(dbenv, pg, pp, cookie));
  121. default:
  122. break;
  123. }
  124. return (__db_unknown_type(dbenv, "__db_pgout", ((PAGE *)pp)->type));
  125. }
  126. /*
  127.  * __db_metaswap --
  128.  * Byteswap the common part of the meta-data page.
  129.  *
  130.  * PUBLIC: void __db_metaswap __P((PAGE *));
  131.  */
  132. void
  133. __db_metaswap(pg)
  134. PAGE *pg;
  135. {
  136. u_int8_t *p;
  137. p = (u_int8_t *)pg;
  138. /* Swap the meta-data information. */
  139. SWAP32(p); /* lsn.file */
  140. SWAP32(p); /* lsn.offset */
  141. SWAP32(p); /* pgno */
  142. SWAP32(p); /* magic */
  143. SWAP32(p); /* version */
  144. SWAP32(p); /* pagesize */
  145. p += 4; /* unused, page type, unused, unused */
  146. SWAP32(p); /* free */
  147. SWAP32(p); /* alloc_lsn part 1 */
  148. SWAP32(p); /* alloc_lsn part 2 */
  149. SWAP32(p); /* cached key count */
  150. SWAP32(p); /* cached record count */
  151. SWAP32(p); /* flags */
  152. }
  153. /*
  154.  * __db_byteswap --
  155.  * Byteswap a page.
  156.  *
  157.  * PUBLIC: int __db_byteswap __P((DB_ENV *, db_pgno_t, PAGE *, size_t, int));
  158.  */
  159. int
  160. __db_byteswap(dbenv, pg, h, pagesize, pgin)
  161. DB_ENV *dbenv;
  162. db_pgno_t pg;
  163. PAGE *h;
  164. size_t pagesize;
  165. int pgin;
  166. {
  167. BINTERNAL *bi;
  168. BKEYDATA *bk;
  169. BOVERFLOW *bo;
  170. RINTERNAL *ri;
  171. db_indx_t i, len, tmp;
  172. u_int8_t *p, *end;
  173. COMPQUIET(pg, 0);
  174. if (pgin) {
  175. M_32_SWAP(h->lsn.file);
  176. M_32_SWAP(h->lsn.offset);
  177. M_32_SWAP(h->pgno);
  178. M_32_SWAP(h->prev_pgno);
  179. M_32_SWAP(h->next_pgno);
  180. M_16_SWAP(h->entries);
  181. M_16_SWAP(h->hf_offset);
  182. }
  183. switch (h->type) {
  184. case P_HASH:
  185. for (i = 0; i < NUM_ENT(h); i++) {
  186. if (pgin)
  187. M_16_SWAP(h->inp[i]);
  188. switch (HPAGE_TYPE(h, i)) {
  189. case H_KEYDATA:
  190. break;
  191. case H_DUPLICATE:
  192. len = LEN_HKEYDATA(h, pagesize, i);
  193. p = HKEYDATA_DATA(P_ENTRY(h, i));
  194. for (end = p + len; p < end;) {
  195. if (pgin) {
  196. P_16_SWAP(p);
  197. memcpy(&tmp,
  198.     p, sizeof(db_indx_t));
  199. p += sizeof(db_indx_t);
  200. } else {
  201. memcpy(&tmp,
  202.     p, sizeof(db_indx_t));
  203. SWAP16(p);
  204. }
  205. p += tmp;
  206. SWAP16(p);
  207. }
  208. break;
  209. case H_OFFDUP:
  210. p = HOFFPAGE_PGNO(P_ENTRY(h, i));
  211. SWAP32(p); /* pgno */
  212. break;
  213. case H_OFFPAGE:
  214. p = HOFFPAGE_PGNO(P_ENTRY(h, i));
  215. SWAP32(p); /* pgno */
  216. SWAP32(p); /* tlen */
  217. break;
  218. }
  219. }
  220. /*
  221.  * The offsets in the inp array are used to determine
  222.  * the size of entries on a page; therefore they
  223.  * cannot be converted until we've done all the
  224.  * entries.
  225.  */
  226. if (!pgin)
  227. for (i = 0; i < NUM_ENT(h); i++)
  228. M_16_SWAP(h->inp[i]);
  229. break;
  230. case P_LBTREE:
  231. case P_LDUP:
  232. case P_LRECNO:
  233. for (i = 0; i < NUM_ENT(h); i++) {
  234. if (pgin)
  235. M_16_SWAP(h->inp[i]);
  236. /*
  237.  * In the case of on-page duplicates, key information
  238.  * should only be swapped once.
  239.  */
  240. if (h->type == P_LBTREE && i > 1) {
  241. if (pgin) {
  242. if (h->inp[i] == h->inp[i - 2])
  243. continue;
  244. } else {
  245. M_16_SWAP(h->inp[i]);
  246. if (h->inp[i] == h->inp[i - 2])
  247. continue;
  248. M_16_SWAP(h->inp[i]);
  249. }
  250. }
  251. bk = GET_BKEYDATA(h, i);
  252. switch (B_TYPE(bk->type)) {
  253. case B_KEYDATA:
  254. M_16_SWAP(bk->len);
  255. break;
  256. case B_DUPLICATE:
  257. case B_OVERFLOW:
  258. bo = (BOVERFLOW *)bk;
  259. M_32_SWAP(bo->pgno);
  260. M_32_SWAP(bo->tlen);
  261. break;
  262. }
  263. if (!pgin)
  264. M_16_SWAP(h->inp[i]);
  265. }
  266. break;
  267. case P_IBTREE:
  268. for (i = 0; i < NUM_ENT(h); i++) {
  269. if (pgin)
  270. M_16_SWAP(h->inp[i]);
  271. bi = GET_BINTERNAL(h, i);
  272. M_16_SWAP(bi->len);
  273. M_32_SWAP(bi->pgno);
  274. M_32_SWAP(bi->nrecs);
  275. switch (B_TYPE(bi->type)) {
  276. case B_KEYDATA:
  277. break;
  278. case B_DUPLICATE:
  279. case B_OVERFLOW:
  280. bo = (BOVERFLOW *)bi->data;
  281. M_32_SWAP(bo->pgno);
  282. M_32_SWAP(bo->tlen);
  283. break;
  284. }
  285. if (!pgin)
  286. M_16_SWAP(h->inp[i]);
  287. }
  288. break;
  289. case P_IRECNO:
  290. for (i = 0; i < NUM_ENT(h); i++) {
  291. if (pgin)
  292. M_16_SWAP(h->inp[i]);
  293. ri = GET_RINTERNAL(h, i);
  294. M_32_SWAP(ri->pgno);
  295. M_32_SWAP(ri->nrecs);
  296. if (!pgin)
  297. M_16_SWAP(h->inp[i]);
  298. }
  299. break;
  300. case P_OVERFLOW:
  301. case P_INVALID:
  302. /* Nothing to do. */
  303. break;
  304. default:
  305. return (__db_unknown_type(dbenv, "__db_byteswap", h->type));
  306. }
  307. if (!pgin) {
  308. /* Swap the header information. */
  309. M_32_SWAP(h->lsn.file);
  310. M_32_SWAP(h->lsn.offset);
  311. M_32_SWAP(h->pgno);
  312. M_32_SWAP(h->prev_pgno);
  313. M_32_SWAP(h->next_pgno);
  314. M_16_SWAP(h->entries);
  315. M_16_SWAP(h->hf_offset);
  316. }
  317. return (0);
  318. }