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

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. #ifndef lint
  8. static char copyright[] =
  9.     "Copyright (c) 1996-2000nSleepycat Software Inc.  All rights reserved.n";
  10. static char revid[] =
  11.     "$Id: db_dump185.c,v 11.8 2001/01/10 17:26:21 bostic Exp $";
  12. #endif
  13. #include <sys/types.h>
  14. #include <ctype.h>
  15. #include <errno.h>
  16. #include <fcntl.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <db.h>
  21. /* Hash Table Information */
  22. typedef struct hashhdr185 { /* Disk resident portion */
  23. int magic; /* Magic NO for hash tables */
  24. int version; /* Version ID */
  25. u_int32_t lorder; /* Byte Order */
  26. int bsize; /* Bucket/Page Size */
  27. int bshift; /* Bucket shift */
  28. int dsize; /* Directory Size */
  29. int ssize; /* Segment Size */
  30. int sshift; /* Segment shift */
  31. int ovfl_point; /* Where overflow pages are being
  32.  * allocated */
  33. int last_freed; /* Last overflow page freed */
  34. int max_bucket; /* ID of Maximum bucket in use */
  35. int high_mask; /* Mask to modulo into entire table */
  36. int low_mask; /* Mask to modulo into lower half of
  37.  * table */
  38. int ffactor; /* Fill factor */
  39. int nkeys; /* Number of keys in hash table */
  40. } HASHHDR185;
  41. typedef struct htab185  { /* Memory resident data structure */
  42. HASHHDR185 hdr; /* Header */
  43. } HTAB185;
  44. /* Hash Table Information */
  45. typedef struct hashhdr186 { /* Disk resident portion */
  46. int32_t magic; /* Magic NO for hash tables */
  47. int32_t version; /* Version ID */
  48. int32_t lorder; /* Byte Order */
  49. int32_t bsize; /* Bucket/Page Size */
  50. int32_t bshift; /* Bucket shift */
  51. int32_t ovfl_point; /* Where overflow pages are being allocated */
  52. int32_t last_freed; /* Last overflow page freed */
  53. int32_t max_bucket; /* ID of Maximum bucket in use */
  54. int32_t high_mask; /* Mask to modulo into entire table */
  55. int32_t low_mask; /* Mask to modulo into lower half of table */
  56. int32_t ffactor; /* Fill factor */
  57. int32_t nkeys; /* Number of keys in hash table */
  58. int32_t hdrpages; /* Size of table header */
  59. int32_t h_charkey; /* value of hash(CHARKEY) */
  60. #define NCACHED 32 /* number of bit maps and spare points */
  61. int32_t spares[NCACHED];/* spare pages for overflow */
  62. u_int16_t bitmaps[NCACHED]; /* address of overflow page bitmaps */
  63. } HASHHDR186;
  64. typedef struct htab186  { /* Memory resident data structure */
  65. HASHHDR186 hdr; /* Header */
  66. } HTAB186;
  67. typedef struct _epgno {
  68. u_int32_t pgno; /* the page number */
  69. u_int16_t index; /* the index on the page */
  70. } EPGNO;
  71. typedef struct _epg {
  72. void *page; /* the (pinned) page */
  73. u_int16_t index; /* the index on the page */
  74. } EPG;
  75. typedef struct _cursor {
  76. EPGNO  pg; /* B: Saved tree reference. */
  77. DBT  key; /* B: Saved key, or key.data == NULL. */
  78. u_int32_t rcursor; /* R: recno cursor (1-based) */
  79. #define CURS_ACQUIRE 0x01 /*  B: Cursor needs to be reacquired. */
  80. #define CURS_AFTER 0x02 /*  B: Unreturned cursor after key. */
  81. #define CURS_BEFORE 0x04 /*  B: Unreturned cursor before key. */
  82. #define CURS_INIT 0x08 /* RB: Cursor initialized. */
  83. u_int8_t flags;
  84. } CURSOR;
  85. /* The in-memory btree/recno data structure. */
  86. typedef struct _btree {
  87. void  *bt_mp; /* memory pool cookie */
  88. void  *bt_dbp; /* pointer to enclosing DB */
  89. EPG   bt_cur; /* current (pinned) page */
  90. void  *bt_pinned; /* page pinned across calls */
  91. CURSOR   bt_cursor; /* cursor */
  92. EPGNO   bt_stack[50]; /* stack of parent pages */
  93. EPGNO  *bt_sp; /* current stack pointer */
  94. DBT   bt_rkey; /* returned key */
  95. DBT   bt_rdata; /* returned data */
  96. int   bt_fd; /* tree file descriptor */
  97. u_int32_t bt_free; /* next free page */
  98. u_int32_t bt_psize; /* page size */
  99. u_int16_t bt_ovflsize; /* cut-off for key/data overflow */
  100. int   bt_lorder; /* byte order */
  101. /* sorted order */
  102. enum { NOT, BACK, FORWARD } bt_order;
  103. EPGNO   bt_last; /* last insert */
  104. /* B: key comparison function */
  105. int (*bt_cmp) __P((DBT *, DBT *));
  106. /* B: prefix comparison function */
  107. size_t (*bt_pfx) __P((DBT *, DBT *));
  108. /* R: recno input function */
  109. int (*bt_irec) __P((struct _btree *, u_int32_t));
  110. FILE  *bt_rfp; /* R: record FILE pointer */
  111. int   bt_rfd; /* R: record file descriptor */
  112. void  *bt_cmap; /* R: current point in mapped space */
  113. void  *bt_smap; /* R: start of mapped space */
  114. void  *bt_emap; /* R: end of mapped space */
  115. size_t   bt_msize; /* R: size of mapped region. */
  116. u_int32_t bt_nrecs; /* R: number of records */
  117. size_t   bt_reclen; /* R: fixed record length */
  118. u_char   bt_bval; /* R: delimiting byte/pad character */
  119. /*
  120.  * NB:
  121.  * B_NODUPS and R_RECNO are stored on disk, and may not be changed.
  122.  */
  123. #define B_INMEM 0x00001 /* in-memory tree */
  124. #define B_METADIRTY 0x00002 /* need to write metadata */
  125. #define B_MODIFIED 0x00004 /* tree modified */
  126. #define B_NEEDSWAP 0x00008 /* if byte order requires swapping */
  127. #define B_RDONLY 0x00010 /* read-only tree */
  128. #define B_NODUPS 0x00020 /* no duplicate keys permitted */
  129. #define R_RECNO 0x00080 /* record oriented tree */
  130. #define R_CLOSEFP 0x00040 /* opened a file pointer */
  131. #define R_EOF 0x00100 /* end of input file reached. */
  132. #define R_FIXLEN 0x00200 /* fixed length records */
  133. #define R_MEMMAPPED 0x00400 /* memory mapped file. */
  134. #define R_INMEM 0x00800 /* in-memory file */
  135. #define R_MODIFIED 0x01000 /* modified file */
  136. #define R_RDONLY 0x02000 /* read-only file */
  137. #define B_DB_LOCK 0x04000 /* DB_LOCK specified. */
  138. #define B_DB_SHMEM 0x08000 /* DB_SHMEM specified. */
  139. #define B_DB_TXN 0x10000 /* DB_TXN specified. */
  140. u_int32_t flags;
  141. } BTREE;
  142. void db_btree __P((DB *, int));
  143. void db_hash __P((DB *, int));
  144. void dbt_dump __P((DBT *));
  145. void dbt_print __P((DBT *));
  146. int main __P((int, char *[]));
  147. void usage __P((void));
  148. int
  149. main(argc, argv)
  150. int argc;
  151. char *argv[];
  152. {
  153. extern char *optarg;
  154. extern int optind;
  155. DB *dbp;
  156. DBT key, data;
  157. int ch, pflag, rval;
  158. pflag = 0;
  159. while ((ch = getopt(argc, argv, "f:p")) != EOF)
  160. switch (ch) {
  161. case 'f':
  162. if (freopen(optarg, "w", stdout) == NULL) {
  163. fprintf(stderr, "db_dump185: %s: %sn",
  164.     optarg, strerror(errno));
  165. exit (1);
  166. }
  167. break;
  168. case 'p':
  169. pflag = 1;
  170. break;
  171. case '?':
  172. default:
  173. usage();
  174. }
  175. argc -= optind;
  176. argv += optind;
  177. if (argc != 1)
  178. usage();
  179. if ((dbp = dbopen(argv[0], O_RDONLY, 0, DB_BTREE, NULL)) == NULL) {
  180. if ((dbp =
  181.     dbopen(argv[0], O_RDONLY, 0, DB_HASH, NULL)) == NULL) {
  182. fprintf(stderr,
  183.     "db_dump185: %s: %sn", argv[0], strerror(errno));
  184. exit (1);
  185. }
  186. db_hash(dbp, pflag);
  187. } else
  188. db_btree(dbp, pflag);
  189. /*
  190.  * !!!
  191.  * DB 1.85 DBTs are a subset of DB 2.0 DBTs, so we just use the
  192.  * new dump/print routines.
  193.  */
  194. if (pflag)
  195. while (!(rval = dbp->seq(dbp, &key, &data, R_NEXT))) {
  196. dbt_print(&key);
  197. dbt_print(&data);
  198. }
  199. else
  200. while (!(rval = dbp->seq(dbp, &key, &data, R_NEXT))) {
  201. dbt_dump(&key);
  202. dbt_dump(&data);
  203. }
  204. if (rval == -1) {
  205. fprintf(stderr, "db_dump185: seq: %sn", strerror(errno));
  206. exit (1);
  207. }
  208. return (0);
  209. }
  210. /*
  211.  * db_hash --
  212.  * Dump out hash header information.
  213.  */
  214. void
  215. db_hash(dbp, pflag)
  216. DB *dbp;
  217. int pflag;
  218. {
  219. HTAB185 *hash185p;
  220. HTAB186 *hash186p;
  221. printf("format=%sn", pflag ? "print" : "bytevalue");
  222. printf("type=hashn");
  223. /* DB 1.85 was version 2, DB 1.86 was version 3. */
  224. hash185p = dbp->internal;
  225. if (hash185p->hdr.version > 2) {
  226. hash186p = dbp->internal;
  227. printf("h_ffactor=%lun", (u_long)hash186p->hdr.ffactor);
  228. if (hash186p->hdr.lorder != 0)
  229. printf("db_lorder=%lun", (u_long)hash186p->hdr.lorder);
  230. printf("db_pagesize=%lun", (u_long)hash186p->hdr.bsize);
  231. } else {
  232. printf("h_ffactor=%lun", (u_long)hash185p->hdr.ffactor);
  233. if (hash185p->hdr.lorder != 0)
  234. printf("db_lorder=%lun", (u_long)hash185p->hdr.lorder);
  235. printf("db_pagesize=%lun", (u_long)hash185p->hdr.bsize);
  236. }
  237. printf("HEADER=ENDn");
  238. }
  239. /*
  240.  * db_btree --
  241.  * Dump out btree header information.
  242.  */
  243. void
  244. db_btree(dbp, pflag)
  245. DB *dbp;
  246. int pflag;
  247. {
  248. BTREE *btp;
  249. btp = dbp->internal;
  250. printf("format=%sn", pflag ? "print" : "bytevalue");
  251. printf("type=btreen");
  252. #ifdef NOT_AVAILABLE_IN_185
  253. printf("bt_minkey=%lun", (u_long)XXX);
  254. printf("bt_maxkey=%lun", (u_long)XXX);
  255. #endif
  256. if (btp->bt_lorder != 0)
  257. printf("db_lorder=%lun", (u_long)btp->bt_lorder);
  258. printf("db_pagesize=%lun", (u_long)btp->bt_psize);
  259. if (!(btp->flags & B_NODUPS))
  260. printf("duplicates=1n");
  261. printf("HEADER=ENDn");
  262. }
  263. static char hex[] = "0123456789abcdef";
  264. /*
  265.  * dbt_dump --
  266.  * Write out a key or data item using byte values.
  267.  */
  268. void
  269. dbt_dump(dbtp)
  270. DBT *dbtp;
  271. {
  272. size_t len;
  273. u_int8_t *p;
  274. for (len = dbtp->size, p = dbtp->data; len--; ++p)
  275. (void)printf("%c%c",
  276.     hex[(*p & 0xf0) >> 4], hex[*p & 0x0f]);
  277. printf("n");
  278. }
  279. /*
  280.  * dbt_print --
  281.  * Write out a key or data item using printable characters.
  282.  */
  283. void
  284. dbt_print(dbtp)
  285. DBT *dbtp;
  286. {
  287. size_t len;
  288. u_int8_t *p;
  289. for (len = dbtp->size, p = dbtp->data; len--; ++p)
  290. if (isprint((int)*p)) {
  291. if (*p == '\')
  292. (void)printf("\");
  293. (void)printf("%c", *p);
  294. } else
  295. (void)printf("\%c%c",
  296.     hex[(*p & 0xf0) >> 4], hex[*p & 0x0f]);
  297. printf("n");
  298. }
  299. /*
  300.  * usage --
  301.  * Display the usage message.
  302.  */
  303. void
  304. usage()
  305. {
  306. (void)fprintf(stderr, "usage: db_dump185 [-p] [-f file] db_filen");
  307. exit(1);
  308. }