xa_db.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1998-2002
  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.21 2002/08/29 14:22:25 margo Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. #include "dbinc/xa.h"
  16. #include "dbinc/txn.h"
  17. static int __xa_close __P((DB *, u_int32_t));
  18. static int __xa_cursor __P((DB *, DB_TXN *, DBC **, u_int32_t));
  19. static int __xa_del __P((DB *, DB_TXN *, DBT *, u_int32_t));
  20. static int __xa_get __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  21. static int __xa_open __P((DB *, DB_TXN *,
  22.     const char *, const char *, DBTYPE, u_int32_t, int));
  23. static int __xa_put __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  24. typedef struct __xa_methods {
  25. int (*close) __P((DB *, u_int32_t));
  26. int (*cursor) __P((DB *, DB_TXN *, DBC **, u_int32_t));
  27. int (*del) __P((DB *, DB_TXN *, DBT *, u_int32_t));
  28. int (*get) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  29. int (*open) __P((DB *, DB_TXN *,
  30.     const char *, const char *, DBTYPE, u_int32_t, int));
  31. int (*put) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  32. } XA_METHODS;
  33. /*
  34.  * __db_xa_create --
  35.  * DB XA constructor.
  36.  *
  37.  * PUBLIC: int __db_xa_create __P((DB *));
  38.  */
  39. int
  40. __db_xa_create(dbp)
  41. DB *dbp;
  42. {
  43. XA_METHODS *xam;
  44. int ret;
  45. /*
  46.  * Interpose XA routines in front of any method that takes a TXN
  47.  * ID as an argument.
  48.  */
  49. if ((ret = __os_calloc(dbp->dbenv, 1, sizeof(XA_METHODS), &xam)) != 0)
  50. return (ret);
  51. dbp->xa_internal = xam;
  52. xam->open = dbp->open;
  53. dbp->open = __xa_open;
  54. xam->close = dbp->close;
  55. dbp->close = __xa_close;
  56. return (0);
  57. }
  58. /*
  59.  * __xa_open --
  60.  * XA open wrapper.
  61.  */
  62. static int
  63. __xa_open(dbp, txn, name, subdb, type, flags, mode)
  64. DB *dbp;
  65. DB_TXN *txn;
  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, txn, 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->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->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->dbenv, dbp->xa_internal);
  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->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->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. }