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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: bt_method.c,v 11.20 2000/11/30 00:58:28 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. #include "db_page.h"
  16. #include "btree.h"
  17. #include "qam.h"
  18. static int __bam_set_bt_compare
  19.        __P((DB *, int (*)(DB *, const DBT *, const DBT *)));
  20. static int __bam_set_bt_maxkey __P((DB *, u_int32_t));
  21. static int __bam_set_bt_minkey __P((DB *, u_int32_t));
  22. static int __bam_set_bt_prefix
  23.        __P((DB *, size_t(*)(DB *, const DBT *, const DBT *)));
  24. static int __ram_set_re_delim __P((DB *, int));
  25. static int __ram_set_re_len __P((DB *, u_int32_t));
  26. static int __ram_set_re_pad __P((DB *, int));
  27. static int __ram_set_re_source __P((DB *, const char *));
  28. /*
  29.  * __bam_db_create --
  30.  * Btree specific initialization of the DB structure.
  31.  *
  32.  * PUBLIC: int __bam_db_create __P((DB *));
  33.  */
  34. int
  35. __bam_db_create(dbp)
  36. DB *dbp;
  37. {
  38. BTREE *t;
  39. int ret;
  40. /* Allocate and initialize the private btree structure. */
  41. if ((ret = __os_calloc(dbp->dbenv, 1, sizeof(BTREE), &t)) != 0)
  42. return (ret);
  43. dbp->bt_internal = t;
  44. t->bt_minkey = DEFMINKEYPAGE; /* Btree */
  45. t->bt_compare = __bam_defcmp;
  46. t->bt_prefix = __bam_defpfx;
  47. dbp->set_bt_compare = __bam_set_bt_compare;
  48. dbp->set_bt_maxkey = __bam_set_bt_maxkey;
  49. dbp->set_bt_minkey = __bam_set_bt_minkey;
  50. dbp->set_bt_prefix = __bam_set_bt_prefix;
  51. t->re_pad = ' '; /* Recno */
  52. t->re_delim = 'n';
  53. t->re_eof = 1;
  54. dbp->set_re_delim = __ram_set_re_delim;
  55. dbp->set_re_len = __ram_set_re_len;
  56. dbp->set_re_pad = __ram_set_re_pad;
  57. dbp->set_re_source = __ram_set_re_source;
  58. return (0);
  59. }
  60. /*
  61.  * __bam_db_close --
  62.  * Btree specific discard of the DB structure.
  63.  *
  64.  * PUBLIC: int __bam_db_close __P((DB *));
  65.  */
  66. int
  67. __bam_db_close(dbp)
  68. DB *dbp;
  69. {
  70. BTREE *t;
  71. t = dbp->bt_internal;
  72. /* Recno */
  73. /* Close any backing source file descriptor. */
  74. if (t->re_fp != NULL)
  75. (void)fclose(t->re_fp);
  76. /* Free any backing source file name. */
  77. if (t->re_source != NULL)
  78. __os_freestr(t->re_source);
  79. __os_free(t, sizeof(BTREE));
  80. dbp->bt_internal = NULL;
  81. return (0);
  82. }
  83. /*
  84.  * __bam_set_flags --
  85.  * Set Btree specific flags.
  86.  *
  87.  * PUBLIC: int __bam_set_flags __P((DB *, u_int32_t *flagsp));
  88.  */
  89. int
  90. __bam_set_flags(dbp, flagsp)
  91. DB *dbp;
  92. u_int32_t *flagsp;
  93. {
  94. u_int32_t flags;
  95. flags = *flagsp;
  96. if (LF_ISSET(DB_DUP | DB_DUPSORT | DB_RECNUM | DB_REVSPLITOFF)) {
  97. DB_ILLEGAL_AFTER_OPEN(dbp, "DB->set_flags");
  98. /*
  99.  * The DB_DUP and DB_DUPSORT flags are shared by the Hash
  100.  * and Btree access methods.
  101.  */
  102. if (LF_ISSET(DB_DUP | DB_DUPSORT))
  103. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE | DB_OK_HASH);
  104. if (LF_ISSET(DB_RECNUM | DB_REVSPLITOFF))
  105. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
  106. if (LF_ISSET(DB_DUP | DB_DUPSORT)) {
  107. /* DB_DUP/DB_DUPSORT is incompatible with DB_RECNUM. */
  108. if (F_ISSET(dbp, DB_BT_RECNUM))
  109. goto incompat;
  110. if (LF_ISSET(DB_DUPSORT)) {
  111. if (dbp->dup_compare == NULL)
  112. dbp->dup_compare = __bam_defcmp;
  113. F_SET(dbp, DB_AM_DUPSORT);
  114. }
  115. F_SET(dbp, DB_AM_DUP);
  116. LF_CLR(DB_DUP | DB_DUPSORT);
  117. }
  118. if (LF_ISSET(DB_RECNUM)) {
  119. /* DB_RECNUM is incompatible with DB_DUP/DB_DUPSORT. */
  120. if (F_ISSET(dbp, DB_AM_DUP))
  121. goto incompat;
  122. F_SET(dbp, DB_BT_RECNUM);
  123. LF_CLR(DB_RECNUM);
  124. }
  125. if (LF_ISSET(DB_REVSPLITOFF)) {
  126. F_SET(dbp, DB_BT_REVSPLIT);
  127. LF_CLR(DB_REVSPLITOFF);
  128. }
  129. *flagsp = flags;
  130. }
  131. return (0);
  132. incompat:
  133. return (__db_ferr(dbp->dbenv, "DB->set_flags", 1));
  134. }
  135. /*
  136.  * __bam_set_bt_compare --
  137.  * Set the comparison function.
  138.  */
  139. static int
  140. __bam_set_bt_compare(dbp, func)
  141. DB *dbp;
  142. int (*func) __P((DB *, const DBT *, const DBT *));
  143. {
  144. BTREE *t;
  145. DB_ILLEGAL_AFTER_OPEN(dbp, "set_bt_compare");
  146. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
  147. t = dbp->bt_internal;
  148. /*
  149.  * Can't default the prefix routine if the user supplies a comparison
  150.  * routine; shortening the keys can break their comparison algorithm.
  151.  */
  152. t->bt_compare = func;
  153. if (t->bt_prefix == __bam_defpfx)
  154. t->bt_prefix = NULL;
  155. return (0);
  156. }
  157. /*
  158.  * __bam_set_bt_maxkey --
  159.  * Set the maximum keys per page.
  160.  */
  161. static int
  162. __bam_set_bt_maxkey(dbp, bt_maxkey)
  163. DB *dbp;
  164. u_int32_t bt_maxkey;
  165. {
  166. BTREE *t;
  167. DB_ILLEGAL_AFTER_OPEN(dbp, "set_bt_maxkey");
  168. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
  169. t = dbp->bt_internal;
  170. if (bt_maxkey < 1) {
  171. __db_err(dbp->dbenv, "minimum bt_maxkey value is 1");
  172. return (EINVAL);
  173. }
  174. t->bt_maxkey = bt_maxkey;
  175. return (0);
  176. }
  177. /*
  178.  * __bam_set_bt_minkey --
  179.  * Set the minimum keys per page.
  180.  */
  181. static int
  182. __bam_set_bt_minkey(dbp, bt_minkey)
  183. DB *dbp;
  184. u_int32_t bt_minkey;
  185. {
  186. BTREE *t;
  187. DB_ILLEGAL_AFTER_OPEN(dbp, "set_bt_minkey");
  188. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
  189. t = dbp->bt_internal;
  190. if (bt_minkey < 2) {
  191. __db_err(dbp->dbenv, "minimum bt_minkey value is 2");
  192. return (EINVAL);
  193. }
  194. t->bt_minkey = bt_minkey;
  195. return (0);
  196. }
  197. /*
  198.  * __bam_set_bt_prefix --
  199.  * Set the prefix function.
  200.  */
  201. static int
  202. __bam_set_bt_prefix(dbp, func)
  203. DB *dbp;
  204. size_t (*func) __P((DB *, const DBT *, const DBT *));
  205. {
  206. BTREE *t;
  207. DB_ILLEGAL_AFTER_OPEN(dbp, "set_bt_prefix");
  208. DB_ILLEGAL_METHOD(dbp, DB_OK_BTREE);
  209. t = dbp->bt_internal;
  210. t->bt_prefix = func;
  211. return (0);
  212. }
  213. /*
  214.  * __ram_set_flags --
  215.  * Set Recno specific flags.
  216.  *
  217.  * PUBLIC: int __ram_set_flags __P((DB *, u_int32_t *flagsp));
  218.  */
  219. int
  220. __ram_set_flags(dbp, flagsp)
  221. DB *dbp;
  222. u_int32_t *flagsp;
  223. {
  224. u_int32_t flags;
  225. flags = *flagsp;
  226. if (LF_ISSET(DB_RENUMBER | DB_SNAPSHOT)) {
  227. DB_ILLEGAL_AFTER_OPEN(dbp, "DB->set_flags");
  228. DB_ILLEGAL_METHOD(dbp, DB_OK_RECNO);
  229. if (LF_ISSET(DB_RENUMBER)) {
  230. F_SET(dbp, DB_RE_RENUMBER);
  231. LF_CLR(DB_RENUMBER);
  232. }
  233. if (LF_ISSET(DB_SNAPSHOT)) {
  234. F_SET(dbp, DB_RE_SNAPSHOT);
  235. LF_CLR(DB_SNAPSHOT);
  236. }
  237. *flagsp = flags;
  238. }
  239. return (0);
  240. }
  241. /*
  242.  * __ram_set_re_delim --
  243.  * Set the variable-length input record delimiter.
  244.  */
  245. static int
  246. __ram_set_re_delim(dbp, re_delim)
  247. DB *dbp;
  248. int re_delim;
  249. {
  250. BTREE *t;
  251. DB_ILLEGAL_AFTER_OPEN(dbp, "set_re_delim");
  252. DB_ILLEGAL_METHOD(dbp, DB_OK_RECNO);
  253. t = dbp->bt_internal;
  254. t->re_delim = re_delim;
  255. F_SET(dbp, DB_RE_DELIMITER);
  256. return (0);
  257. }
  258. /*
  259.  * __ram_set_re_len --
  260.  * Set the variable-length input record length.
  261.  */
  262. static int
  263. __ram_set_re_len(dbp, re_len)
  264. DB *dbp;
  265. u_int32_t re_len;
  266. {
  267. BTREE *t;
  268. QUEUE *q;
  269. DB_ILLEGAL_AFTER_OPEN(dbp, "set_re_len");
  270. DB_ILLEGAL_METHOD(dbp, DB_OK_QUEUE | DB_OK_RECNO);
  271. t = dbp->bt_internal;
  272. t->re_len = re_len;
  273. q = dbp->q_internal;
  274. q->re_len = re_len;
  275. F_SET(dbp, DB_RE_FIXEDLEN);
  276. return (0);
  277. }
  278. /*
  279.  * __ram_set_re_pad --
  280.  * Set the fixed-length record pad character.
  281.  */
  282. static int
  283. __ram_set_re_pad(dbp, re_pad)
  284. DB *dbp;
  285. int re_pad;
  286. {
  287. BTREE *t;
  288. QUEUE *q;
  289. DB_ILLEGAL_AFTER_OPEN(dbp, "set_re_pad");
  290. DB_ILLEGAL_METHOD(dbp, DB_OK_QUEUE | DB_OK_RECNO);
  291. t = dbp->bt_internal;
  292. t->re_pad = re_pad;
  293. q = dbp->q_internal;
  294. q->re_pad = re_pad;
  295. F_SET(dbp, DB_RE_PAD);
  296. return (0);
  297. }
  298. /*
  299.  * __ram_set_re_source --
  300.  * Set the backing source file name.
  301.  */
  302. static int
  303. __ram_set_re_source(dbp, re_source)
  304. DB *dbp;
  305. const char *re_source;
  306. {
  307. BTREE *t;
  308. DB_ILLEGAL_AFTER_OPEN(dbp, "set_re_source");
  309. DB_ILLEGAL_METHOD(dbp, DB_OK_RECNO);
  310. t = dbp->bt_internal;
  311. return (__os_strdup(dbp->dbenv, re_source, &t->re_source));
  312. }