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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: xa_db.c,v 11.9 2000/09/06 18:57:59 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 "xa.h"
  16. #include "xa_ext.h"
  17. #include "txn.h"
  18. static int __xa_close __P((DB *, u_int32_t));
  19. static int __xa_cursor __P((DB *, DB_TXN *, DBC **, u_int32_t));
  20. static int __xa_del __P((DB *, DB_TXN *, DBT *, u_int32_t));
  21. static int __xa_get __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  22. static int __xa_open __P((DB *,
  23.     const char *, const char *, DBTYPE, u_int32_t, int));
  24. static int __xa_put __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  25. typedef struct __xa_methods {
  26. int (*close) __P((DB *, u_int32_t));
  27. int (*cursor) __P((DB *, DB_TXN *, DBC **, u_int32_t));
  28. int (*del) __P((DB *, DB_TXN *, DBT *, u_int32_t));
  29. int (*get) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  30. int (*open) __P((DB *,
  31.     const char *, const char *, DBTYPE, u_int32_t, int));
  32. int (*put) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  33. } XA_METHODS;
  34. /*
  35.  * __db_xa_create --
  36.  * DB XA constructor.
  37.  *
  38.  * PUBLIC: int __db_xa_create __P((DB *));
  39.  */
  40. int
  41. __db_xa_create(dbp)
  42. DB *dbp;
  43. {
  44. XA_METHODS *xam;
  45. int ret;
  46. /*
  47.  * Interpose XA routines in front of any method that takes a TXN
  48.  * ID as an argument.
  49.  */
  50. if ((ret = __os_calloc(dbp->dbenv, 1, sizeof(XA_METHODS), &xam)) != 0)
  51. return (ret);
  52. dbp->xa_internal = xam;
  53. xam->open = dbp->open;
  54. dbp->open = __xa_open;
  55. xam->close = dbp->close;
  56. dbp->close = __xa_close;
  57. return (0);
  58. }
  59. /*
  60.  * __xa_open --
  61.  * XA open wrapper.
  62.  */
  63. static int
  64. __xa_open(dbp, name, subdb, type, flags, mode)
  65. DB *dbp;
  66. const char *name, *subdb;
  67. DBTYPE type;
  68. u_int32_t flags;
  69. int mode;
  70. {
  71. XA_METHODS *xam;
  72. int ret;
  73. xam = (XA_METHODS *)dbp->xa_internal;
  74. if ((ret = xam->open(dbp, name, subdb, type, flags, mode)) != 0)
  75. return (ret);
  76. xam->cursor = dbp->cursor;
  77. xam->del = dbp->del;
  78. xam->get = dbp->get;
  79. xam->put = dbp->put;
  80. dbp->cursor = __xa_cursor;
  81. dbp->del = __xa_del;
  82. dbp->get = __xa_get;
  83. dbp->put = __xa_put;
  84. return (0);
  85. }
  86. static int
  87. __xa_cursor(dbp, txn, dbcp, flags)
  88. DB *dbp;
  89. DB_TXN *txn;
  90. DBC **dbcp;
  91. u_int32_t flags;
  92. {
  93. DB_TXN *t;
  94. t = txn != NULL && txn == dbp->open_txn ? txn : dbp->dbenv->xa_txn;
  95. if (t->txnid == TXN_INVALID)
  96. t = NULL;
  97. return (((XA_METHODS *)dbp->xa_internal)->cursor (dbp, t, dbcp, flags));
  98. }
  99. static int
  100. __xa_del(dbp, txn, key, flags)
  101. DB *dbp;
  102. DB_TXN *txn;
  103. DBT *key;
  104. u_int32_t flags;
  105. {
  106. DB_TXN *t;
  107. t = txn != NULL && txn == dbp->open_txn ? txn : dbp->dbenv->xa_txn;
  108. if (t->txnid == TXN_INVALID)
  109. t = NULL;
  110. return (((XA_METHODS *)dbp->xa_internal)->del(dbp, t, key, flags));
  111. }
  112. static int
  113. __xa_close(dbp, flags)
  114. DB *dbp;
  115. u_int32_t flags;
  116. {
  117. int (*real_close) __P((DB *, u_int32_t));
  118. real_close = ((XA_METHODS *)dbp->xa_internal)->close;
  119. __os_free(dbp->xa_internal, sizeof(XA_METHODS));
  120. dbp->xa_internal = NULL;
  121. return (real_close(dbp, flags));
  122. }
  123. static int
  124. __xa_get(dbp, txn, key, data, flags)
  125. DB *dbp;
  126. DB_TXN *txn;
  127. DBT *key, *data;
  128. u_int32_t flags;
  129. {
  130. DB_TXN *t;
  131. t = txn != NULL && txn == dbp->open_txn ? txn : dbp->dbenv->xa_txn;
  132. if (t->txnid == TXN_INVALID)
  133. t = NULL;
  134. return (((XA_METHODS *)dbp->xa_internal)->get
  135.     (dbp, t, key, data, flags));
  136. }
  137. static int
  138. __xa_put(dbp, txn, key, data, flags)
  139. DB *dbp;
  140. DB_TXN *txn;
  141. DBT *key, *data;
  142. u_int32_t flags;
  143. {
  144. DB_TXN *t;
  145. t = txn != NULL && txn == dbp->open_txn ? txn : dbp->dbenv->xa_txn;
  146. if (t->txnid == TXN_INVALID)
  147. t = NULL;
  148. return (((XA_METHODS *)dbp->xa_internal)->put
  149.     (dbp, t, key, data, flags));
  150. }