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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: xa_map.c,v 11.19 2002/09/03 14:58:27 sue Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #endif
  15. #include "db_int.h"
  16. #include "dbinc/txn.h"
  17. /*
  18.  * This file contains all the mapping information that we need to support
  19.  * the DB/XA interface.
  20.  */
  21. /*
  22.  * __db_rmid_to_env
  23.  * Return the environment associated with a given XA rmid.
  24.  *
  25.  * PUBLIC: int __db_rmid_to_env __P((int rmid, DB_ENV **envp));
  26.  */
  27. int
  28. __db_rmid_to_env(rmid, envp)
  29. int rmid;
  30. DB_ENV **envp;
  31. {
  32. DB_ENV *env;
  33. env = TAILQ_FIRST(&DB_GLOBAL(db_envq));
  34. if (env != NULL && env->xa_rmid == rmid) {
  35. *envp = env;
  36. return (0);
  37. }
  38. /*
  39.  * When we map an rmid, move that environment to be the first one in
  40.  * the list of environments, so we acquire the correct environment
  41.  * in DB->open.
  42.  */
  43. for (; env != NULL; env = TAILQ_NEXT(env, links))
  44. if (env->xa_rmid == rmid) {
  45. TAILQ_REMOVE(&DB_GLOBAL(db_envq), env, links);
  46. TAILQ_INSERT_HEAD(&DB_GLOBAL(db_envq), env, links);
  47. *envp = env;
  48. return (0);
  49. }
  50. return (1);
  51. }
  52. /*
  53.  * __db_xid_to_txn
  54.  * Return the txn that corresponds to this XID.
  55.  *
  56.  * PUBLIC: int __db_xid_to_txn __P((DB_ENV *, XID *, size_t *));
  57.  */
  58. int
  59. __db_xid_to_txn(dbenv, xid, offp)
  60. DB_ENV *dbenv;
  61. XID *xid;
  62. size_t *offp;
  63. {
  64. struct __txn_detail *td;
  65. return (__txn_map_gid(dbenv, (u_int8_t *)xid->data, &td, offp));
  66. }
  67. /*
  68.  * __db_map_rmid
  69.  * Create a mapping between the specified rmid and environment.
  70.  *
  71.  * PUBLIC: int __db_map_rmid __P((int, DB_ENV *));
  72.  */
  73. int
  74. __db_map_rmid(rmid, env)
  75. int rmid;
  76. DB_ENV *env;
  77. {
  78. env->xa_rmid = rmid;
  79. TAILQ_INSERT_TAIL(&DB_GLOBAL(db_envq), env, links);
  80. return (0);
  81. }
  82. /*
  83.  * __db_unmap_rmid
  84.  * Destroy the mapping for the given rmid.
  85.  *
  86.  * PUBLIC: int __db_unmap_rmid __P((int));
  87.  */
  88. int
  89. __db_unmap_rmid(rmid)
  90. int rmid;
  91. {
  92. DB_ENV *e;
  93. for (e = TAILQ_FIRST(&DB_GLOBAL(db_envq));
  94.     e->xa_rmid != rmid;
  95.     e = TAILQ_NEXT(e, links));
  96. if (e == NULL)
  97. return (EINVAL);
  98. TAILQ_REMOVE(&DB_GLOBAL(db_envq), e, links);
  99. return (0);
  100. }
  101. /*
  102.  * __db_map_xid
  103.  * Create a mapping between this XID and the transaction at
  104.  * "off" in the shared region.
  105.  *
  106.  * PUBLIC: int __db_map_xid __P((DB_ENV *, XID *, size_t));
  107.  */
  108. int
  109. __db_map_xid(env, xid, off)
  110. DB_ENV *env;
  111. XID *xid;
  112. size_t off;
  113. {
  114. REGINFO *infop;
  115. TXN_DETAIL *td;
  116. infop = &((DB_TXNMGR *)env->tx_handle)->reginfo;
  117. td = (TXN_DETAIL *)R_ADDR(infop, off);
  118. R_LOCK(env, infop);
  119. memcpy(td->xid, xid->data, XIDDATASIZE);
  120. td->bqual = (u_int32_t)xid->bqual_length;
  121. td->gtrid = (u_int32_t)xid->gtrid_length;
  122. td->format = (int32_t)xid->formatID;
  123. R_UNLOCK(env, infop);
  124. return (0);
  125. }
  126. /*
  127.  * __db_unmap_xid
  128.  * Destroy the mapping for the specified XID.
  129.  *
  130.  * PUBLIC: void __db_unmap_xid __P((DB_ENV *, XID *, size_t));
  131.  */
  132. void
  133. __db_unmap_xid(env, xid, off)
  134. DB_ENV *env;
  135. XID *xid;
  136. size_t off;
  137. {
  138. TXN_DETAIL *td;
  139. COMPQUIET(xid, NULL);
  140. td = (TXN_DETAIL *)R_ADDR(&((DB_TXNMGR *)env->tx_handle)->reginfo, off);
  141. memset(td->xid, 0, sizeof(td->xid));
  142. }