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

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. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: bt_upgrade.c,v 11.19 2000/11/30 00:58:29 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <limits.h>
  14. #include <string.h>
  15. #endif
  16. #include "db_int.h"
  17. #include "db_page.h"
  18. #include "db_swap.h"
  19. #include "btree.h"
  20. #include "db_am.h"
  21. #include "db_upgrade.h"
  22. /*
  23.  * __bam_30_btreemeta --
  24.  * Upgrade the metadata pages from version 6 to version 7.
  25.  *
  26.  * PUBLIC: int __bam_30_btreemeta __P((DB *, char *, u_int8_t *));
  27.  */
  28. int
  29. __bam_30_btreemeta(dbp, real_name, buf)
  30. DB *dbp;
  31. char *real_name;
  32. u_int8_t *buf;
  33. {
  34. BTMETA30 *newmeta;
  35. BTMETA2X *oldmeta;
  36. DB_ENV *dbenv;
  37. int ret;
  38. dbenv = dbp->dbenv;
  39. newmeta = (BTMETA30 *)buf;
  40. oldmeta = (BTMETA2X *)buf;
  41. /*
  42.  * Move things from the end up, so we do not overwrite things.
  43.  * We are going to create a new uid, so we can move the stuff
  44.  * at the end of the structure first, overwriting the uid.
  45.  */
  46. newmeta->re_pad = oldmeta->re_pad;
  47. newmeta->re_len = oldmeta->re_len;
  48. newmeta->minkey = oldmeta->minkey;
  49. newmeta->maxkey = oldmeta->maxkey;
  50. newmeta->dbmeta.free = oldmeta->free;
  51. newmeta->dbmeta.flags = oldmeta->flags;
  52. newmeta->dbmeta.type  = P_BTREEMETA;
  53. newmeta->dbmeta.version = 7;
  54. /* Replace the unique ID. */
  55. if ((ret = __os_fileid(dbenv, real_name, 1, buf + 36)) != 0)
  56. return (ret);
  57. newmeta->root = 1;
  58. return (0);
  59. }
  60. /*
  61.  * __bam_31_btreemeta --
  62.  * Upgrade the database from version 7 to version 8.
  63.  *
  64.  * PUBLIC: int __bam_31_btreemeta
  65.  * PUBLIC:      __P((DB *, char *, u_int32_t, DB_FH *, PAGE *, int *));
  66.  */
  67. int
  68. __bam_31_btreemeta(dbp, real_name, flags, fhp, h, dirtyp)
  69. DB *dbp;
  70. char *real_name;
  71. u_int32_t flags;
  72. DB_FH *fhp;
  73. PAGE *h;
  74. int *dirtyp;
  75. {
  76. BTMETA31 *newmeta;
  77. BTMETA30 *oldmeta;
  78. COMPQUIET(dbp, NULL);
  79. COMPQUIET(real_name, NULL);
  80. COMPQUIET(fhp, NULL);
  81. newmeta = (BTMETA31 *)h;
  82. oldmeta = (BTMETA30 *)h;
  83. /*
  84.  * Copy the effected fields down the page.
  85.  * The fields may overlap each other so we
  86.  * start at the bottom and use memmove.
  87.  */
  88. newmeta->root = oldmeta->root;
  89. newmeta->re_pad = oldmeta->re_pad;
  90. newmeta->re_len = oldmeta->re_len;
  91. newmeta->minkey = oldmeta->minkey;
  92. newmeta->maxkey = oldmeta->maxkey;
  93. memmove(newmeta->dbmeta.uid,
  94.      oldmeta->dbmeta.uid, sizeof(oldmeta->dbmeta.uid));
  95. newmeta->dbmeta.flags = oldmeta->dbmeta.flags;
  96. newmeta->dbmeta.record_count = 0;
  97. newmeta->dbmeta.key_count = 0;
  98. ZERO_LSN(newmeta->dbmeta.unused3);
  99. /* Set the version number. */
  100. newmeta->dbmeta.version = 8;
  101. /* Upgrade the flags. */
  102. if (LF_ISSET(DB_DUPSORT))
  103. F_SET(&newmeta->dbmeta, BTM_DUPSORT);
  104. *dirtyp = 1;
  105. return (0);
  106. }
  107. /*
  108.  * __bam_31_lbtree --
  109.  *      Upgrade the database btree leaf pages.
  110.  *
  111.  * PUBLIC: int __bam_31_lbtree
  112.  * PUBLIC:      __P((DB *, char *, u_int32_t, DB_FH *, PAGE *, int *));
  113.  */
  114. int
  115. __bam_31_lbtree(dbp, real_name, flags, fhp, h, dirtyp)
  116. DB *dbp;
  117. char *real_name;
  118. u_int32_t flags;
  119. DB_FH *fhp;
  120. PAGE *h;
  121. int *dirtyp;
  122. {
  123. BKEYDATA *bk;
  124. db_pgno_t pgno;
  125. db_indx_t indx;
  126. int ret;
  127. ret = 0;
  128. for (indx = O_INDX; indx < NUM_ENT(h); indx += P_INDX) {
  129. bk = GET_BKEYDATA(h, indx);
  130. if (B_TYPE(bk->type) == B_DUPLICATE) {
  131. pgno = GET_BOVERFLOW(h, indx)->pgno;
  132. if ((ret = __db_31_offdup(dbp, real_name, fhp,
  133.     LF_ISSET(DB_DUPSORT) ? 1 : 0, &pgno)) != 0)
  134. break;
  135. if (pgno != GET_BOVERFLOW(h, indx)->pgno) {
  136. *dirtyp = 1;
  137. GET_BOVERFLOW(h, indx)->pgno = pgno;
  138. }
  139. }
  140. }
  141. return (ret);
  142. }