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

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.  * $Id: ex_dbclient.c,v 1.12 2000/10/26 14:13:05 bostic Exp $
  8.  */
  9. #include "db_config.h"
  10. #ifndef NO_SYSTEM_INCLUDES
  11. #include <sys/types.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <unistd.h>
  16. #endif
  17. #include <db.h>
  18. #define DATABASE_HOME "database"
  19. #define DATABASE "access.db"
  20. int db_clientrun __P((DB_ENV *, char *));
  21. int ex_dbclient_run __P((char *, FILE *, char *, char *));
  22. #ifdef HAVE_VXWORKS
  23. int ex_dbclient __P((char *));
  24. #define ERROR_RETURN ERROR
  25. #define VXSHM_KEY 10
  26. #else
  27. int main __P((int, char *[]));
  28. #define ERROR_RETURN 1
  29. #endif
  30. /*
  31.  * An example of a program creating/configuring a Berkeley DB environment.
  32.  */
  33. #ifndef HAVE_VXWORKS
  34. int
  35. main(argc, argv)
  36. int argc;
  37. char *argv[];
  38. {
  39. char *home;
  40. int ret;
  41. if (argc != 2) {
  42. fprintf(stderr, "Usage: %s hostnamen",argv[0]);
  43. exit(1);
  44. }
  45. /*
  46.  * All of the shared database files live in DATABASE_HOME, but
  47.  * data files will live in CONFIG_DATA_DIR.
  48.  */
  49. home = DATABASE_HOME;
  50. if ((ret = ex_dbclient_run(home, stderr, argv[1], argv[0])) != 0)
  51. return (ret);
  52. return (0);
  53. }
  54. #endif
  55. int
  56. ex_dbclient(host)
  57. char *host;
  58. {
  59. char *home;
  60. char *progname = "ex_dbclient"; /* Program name. */
  61. int ret;
  62. /*
  63.  * All of the shared database files live in DATABASE_HOME, but
  64.  * data files will live in CONFIG_DATA_DIR.
  65.  */
  66. home = DATABASE_HOME;
  67. if ((ret = ex_dbclient_run(home, stderr, host, progname)) != 0)
  68. return (ret);
  69. return (0);
  70. }
  71. int
  72. ex_dbclient_run(home, errfp, host, progname)
  73. char *home, *host, *progname;
  74. FILE *errfp;
  75. {
  76. DB_ENV *dbenv;
  77. int ret, retry;
  78. /*
  79.  * Create an environment object and initialize it for error
  80.  * reporting.
  81.  */
  82. if ((ret = db_env_create(&dbenv, DB_CLIENT)) != 0) {
  83. fprintf(errfp, "%s: %sn", progname, db_strerror(ret));
  84. return (ERROR_RETURN);
  85. }
  86. #ifdef HAVE_VXWORKS
  87. if ((ret = dbenv->set_shm_key(dbenv, VXSHM_KEY)) != 0) {
  88. fprintf(errfp, "%s: %sn", progname, db_strerror(ret));
  89. return (ERROR_RETURN);
  90. }
  91. #endif
  92. retry = 0;
  93. retry:
  94. while (retry < 5) {
  95. /*
  96.  * Set the server host we are talking to.
  97.  */
  98. if ((ret =
  99.     dbenv->set_server(dbenv, host, 10000, 10000, 0)) != 0) {
  100. fprintf(stderr, "Try %d: DBENV->set_server: %sn",
  101.     retry, db_strerror(ret));
  102. retry++;
  103. if ((ret = __os_sleep(dbenv, 15, 0)) != 0)
  104. return (ret);
  105. } else
  106. break;
  107. }
  108. if (retry >= 5) {
  109. fprintf(stderr, "DBENV->set_server: %sn", db_strerror(ret));
  110. dbenv->close(dbenv, 0);
  111. return (ERROR_RETURN);
  112. }
  113. /*
  114.  * We want to specify the shared memory buffer pool cachesize,
  115.  * but everything else is the default.
  116.  */
  117. if ((ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0)) != 0) {
  118. dbenv->err(dbenv, ret, "set_cachesize");
  119. dbenv->close(dbenv, 0);
  120. return (ERROR_RETURN);
  121. }
  122. /*
  123.  * We have multiple processes reading/writing these files, so
  124.  * we need concurrency control and a shared buffer pool, but
  125.  * not logging or transactions.
  126.  */
  127. if ((ret = dbenv->open(dbenv, home,
  128.     DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN, 0)) != 0) {
  129. dbenv->err(dbenv, ret, "environment open: %s", home);
  130. dbenv->close(dbenv, 0);
  131. if (ret == DB_NOSERVER)
  132. goto retry;
  133. return (ERROR_RETURN);
  134. }
  135. ret = db_clientrun(dbenv, progname);
  136. printf("db_clientrun returned %dn", ret);
  137. if (ret == DB_NOSERVER)
  138. goto retry;
  139. /* Close the handle. */
  140. if ((ret = dbenv->close(dbenv, 0)) != 0) {
  141. fprintf(stderr, "DBENV->close: %sn", db_strerror(ret));
  142. return (ERROR_RETURN);
  143. }
  144. return (0);
  145. }
  146. int
  147. db_clientrun(dbenv, progname)
  148. DB_ENV *dbenv;
  149. char *progname;
  150. {
  151. DB *dbp;
  152. DBT key, data;
  153. u_int32_t len;
  154. int ret;
  155. char *p, *t, buf[1024], rbuf[1024];
  156. /* Remove the previous database. */
  157. /* Create and initialize database object, open the database. */
  158. if ((ret = db_create(&dbp, dbenv, 0)) != 0) {
  159. fprintf(stderr,
  160.     "%s: db_create: %sn", progname, db_strerror(ret));
  161. return (ret);
  162. }
  163. if ((ret = dbp->set_pagesize(dbp, 1024)) != 0) {
  164. dbp->err(dbp, ret, "set_pagesize");
  165. goto err1;
  166. }
  167. if ((ret =
  168.     dbp->open(dbp, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  169. dbp->err(dbp, ret, "%s: open", DATABASE);
  170. goto err1;
  171. }
  172. /*
  173.  * Insert records into the database, where the key is the user
  174.  * input and the data is the user input in reverse order.
  175.  */
  176. memset(&key, 0, sizeof(DBT));
  177. memset(&data, 0, sizeof(DBT));
  178. for (;;) {
  179. printf("input> ");
  180. fflush(stdout);
  181. if (fgets(buf, sizeof(buf), stdin) == NULL)
  182. break;
  183. if ((len = strlen(buf)) <= 1)
  184. continue;
  185. for (t = rbuf, p = buf + (len - 2); p >= buf;)
  186. *t++ = *p--;
  187. *t++ = '';
  188. key.data = buf;
  189. data.data = rbuf;
  190. data.size = key.size = len - 1;
  191. switch (ret =
  192.     dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) {
  193. case 0:
  194. break;
  195. default:
  196. dbp->err(dbp, ret, "DB->put");
  197. if (ret != DB_KEYEXIST)
  198. goto err1;
  199. break;
  200. }
  201. memset(&data, 0, sizeof(DBT));
  202. switch (ret = dbp->get(dbp, NULL, &key, &data, 0)) {
  203. case 0:
  204. printf("%.*s : %.*sn",
  205.     (int)key.size, (char *)key.data,
  206.     (int)data.size, (char *)data.data);
  207. break;
  208. default:
  209. dbp->err(dbp, ret, "DB->get");
  210. break;
  211. }
  212. }
  213. if ((ret = dbp->close(dbp, 0)) != 0) {
  214. fprintf(stderr,
  215.     "%s: DB->close: %sn", progname, db_strerror(ret));
  216. return (1);
  217. }
  218. return (0);
  219. err1: (void)dbp->close(dbp, 0);
  220. return (ret);
  221. }