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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: ex_btrec.c,v 11.8 2000/05/22 15:17:03 sue Exp $
  8.  */
  9. #include "db_config.h"
  10. #ifndef NO_SYSTEM_INCLUDES
  11. #include <sys/types.h>
  12. #include <errno.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <unistd.h>
  16. #endif
  17. #include <db.h>
  18. #ifdef HAVE_VXWORKS
  19. #define DATABASE "/vxtmp/vxtmp/access.db"
  20. #define WORDLIST "/vxtmp/vxtmp/wordlist"
  21. #define ERROR_RETURN ERROR
  22. #else
  23. #define DATABASE "access.db"
  24. #define WORDLIST "../test/wordlist"
  25. #define ERROR_RETURN 1
  26. int main __P((int, char *[]));
  27. void usage __P((char *));
  28. #endif
  29. int ex_btrec __P((void));
  30. void show __P((char *, DBT *, DBT *));
  31. #ifndef HAVE_VXWORKS
  32. int
  33. main(argc, argv)
  34. int argc;
  35. char *argv[];
  36. {
  37. extern char *optarg;
  38. extern int optind;
  39. int ch;
  40. while ((ch = getopt(argc, argv, "")) != EOF)
  41. switch (ch) {
  42. case '?':
  43. default:
  44. usage(argv[0]);
  45. }
  46. argc -= optind;
  47. argv += optind;
  48. return (ex_btrec());
  49. }
  50. void
  51. usage(progname)
  52. char *progname;
  53. {
  54. (void)fprintf(stderr, "usage: %sn", progname);
  55. exit(1);
  56. }
  57. #endif
  58. int
  59. ex_btrec()
  60. {
  61. DB *dbp;
  62. DBC *dbcp;
  63. DBT key, data;
  64. DB_BTREE_STAT *statp;
  65. FILE *fp;
  66. db_recno_t recno;
  67. u_int32_t len;
  68. int cnt, ret;
  69. char *p, *t, buf[1024], rbuf[1024];
  70. const char *progname = "ex_btrec"; /* Program name. */
  71. /* Open the word database. */
  72. if ((fp = fopen(WORDLIST, "r")) == NULL) {
  73. fprintf(stderr, "%s: open %s: %sn",
  74.     progname, WORDLIST, db_strerror(errno));
  75. return (ERROR_RETURN);
  76. }
  77. /* Remove the previous database. */
  78. (void)unlink(DATABASE);
  79. /* Create and initialize database object, open the database. */
  80. if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  81. fprintf(stderr,
  82.     "%s: db_create: %sn", progname, db_strerror(ret));
  83. return (ERROR_RETURN);
  84. }
  85. dbp->set_errfile(dbp, stderr);
  86. dbp->set_errpfx(dbp, progname); /* 1K page sizes. */
  87. if ((ret = dbp->set_pagesize(dbp, 1024)) != 0) {
  88. dbp->err(dbp, ret, "set_pagesize");
  89. return (ERROR_RETURN);
  90. } /* Record numbers. */
  91. if ((ret = dbp->set_flags(dbp, DB_RECNUM)) != 0) {
  92. dbp->err(dbp, ret, "set_flags: DB_RECNUM");
  93. return (ERROR_RETURN);
  94. }
  95. if ((ret =
  96.     dbp->open(dbp, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  97. dbp->err(dbp, ret, "open: %s", DATABASE);
  98. return (ERROR_RETURN);
  99. }
  100. /*
  101.  * Insert records into the database, where the key is the word
  102.  * preceded by its record number, and the data is the same, but
  103.  * in reverse order.
  104.  */
  105. memset(&key, 0, sizeof(DBT));
  106. memset(&data, 0, sizeof(DBT));
  107. for (cnt = 1; cnt <= 1000; ++cnt) {
  108. (void)sprintf(buf, "%04d_", cnt);
  109. if (fgets(buf + 4, sizeof(buf) - 4, fp) == NULL)
  110. break;
  111. len = strlen(buf);
  112. for (t = rbuf, p = buf + (len - 2); p >= buf;)
  113. *t++ = *p--;
  114. *t++ = '';
  115. key.data = buf;
  116. data.data = rbuf;
  117. data.size = key.size = len - 1;
  118. if ((ret =
  119.     dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) != 0) {
  120. dbp->err(dbp, ret, "DB->put");
  121. if (ret != DB_KEYEXIST)
  122. goto err1;
  123. }
  124. }
  125. /* Close the word database. */
  126. (void)fclose(fp);
  127. /* Print out the number of records in the database. */
  128. if ((ret = dbp->stat(dbp, &statp, NULL, 0)) != 0) {
  129. dbp->err(dbp, ret, "DB->stat");
  130. goto err1;
  131. }
  132. printf("%s: database contains %lu recordsn",
  133.     progname, (u_long)statp->bt_ndata);
  134. free(statp);
  135. /* Acquire a cursor for the database. */
  136. if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) {
  137. dbp->err(dbp, ret, "DB->cursor");
  138. goto err1;
  139. }
  140. /*
  141.  * Prompt the user for a record number, then retrieve and display
  142.  * that record.
  143.  */
  144. for (;;) {
  145. /* Get a record number. */
  146. printf("recno #> ");
  147. fflush(stdout);
  148. if (fgets(buf, sizeof(buf), stdin) == NULL)
  149. break;
  150. recno = atoi(buf);
  151. /*
  152.  * Reset the key each time, the dbp->c_get() routine returns
  153.  * the key and data pair, not just the key!
  154.  */
  155. key.data = &recno;
  156. key.size = sizeof(recno);
  157. if ((ret = dbcp->c_get(dbcp, &key, &data, DB_SET_RECNO)) != 0)
  158. goto get_err;
  159. /* Display the key and data. */
  160. show("k/dt", &key, &data);
  161. /* Move the cursor a record forward. */
  162. if ((ret = dbcp->c_get(dbcp, &key, &data, DB_NEXT)) != 0)
  163. goto get_err;
  164. /* Display the key and data. */
  165. show("nextt", &key, &data);
  166. /*
  167.  * Retrieve the record number for the following record into
  168.  * local memory.
  169.  */
  170. data.data = &recno;
  171. data.size = sizeof(recno);
  172. data.ulen = sizeof(recno);
  173. data.flags |= DB_DBT_USERMEM;
  174. if ((ret = dbcp->c_get(dbcp, &key, &data, DB_GET_RECNO)) != 0) {
  175. get_err: dbp->err(dbp, ret, "DBcursor->get");
  176. if (ret != DB_NOTFOUND && ret != DB_KEYEMPTY)
  177. goto err2;
  178. } else
  179. printf("retrieved recno: %lun", (u_long)recno);
  180. /* Reset the data DBT. */
  181. memset(&data, 0, sizeof(data));
  182. }
  183. if ((ret = dbcp->c_close(dbcp)) != 0) {
  184. dbp->err(dbp, ret, "DBcursor->close");
  185. goto err1;
  186. }
  187. if ((ret = dbp->close(dbp, 0)) != 0) {
  188. fprintf(stderr,
  189.     "%s: DB->close: %sn", progname, db_strerror(ret));
  190. return (ERROR_RETURN);
  191. }
  192. return (0);
  193. err2: (void)dbcp->c_close(dbcp);
  194. err1: (void)dbp->close(dbp, 0);
  195. return (ret);
  196. }
  197. /*
  198.  * show --
  199.  * Display a key/data pair.
  200.  */
  201. void
  202. show(msg, key, data)
  203. DBT *key, *data;
  204. char *msg;
  205. {
  206. printf("%s%.*s : %.*sn", msg,
  207.     (int)key->size, (char *)key->data,
  208.     (int)data->size, (char *)data->data);
  209. }