request.c
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:5k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2009, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include "tx/request.h"
  19. product_t products[] = {
  20. {0, "null db", "null", ANY_ACCESS, null_access, null_xaflags},
  21. #ifdef ORACLE
  22. {1, "ora - blacktie", "blacktie", ANY_ACCESS, ora_access, ora_xaflags},
  23. {2, "ora - bt", "bt", ANY_ACCESS, ora_access, ora_xaflags},
  24. #endif
  25. {-1, 0, 0, 0, 0},
  26. };
  27. /* helper methods for controling transactions */
  28. int is_begin(enum TX_TYPE txtype) {
  29. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  30. return (txtype & TX_TYPE_BEGIN);
  31. }
  32. int is_commit(enum TX_TYPE txtype) {
  33. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  34. return (txtype & TX_TYPE_COMMIT);
  35. }
  36. int is_abort(enum TX_TYPE txtype) {
  37. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  38. return (txtype & TX_TYPE_ABORT);
  39. }
  40. int start_tx(enum TX_TYPE txtype) {
  41. int rv = TX_OK;
  42. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  43. if (is_begin(txtype)) {
  44. userlogc_debug( "TxLog - Starting Transaction");
  45. rv = tx_begin();
  46. }
  47. if (rv != TX_OK)
  48. userlogc_warn( "TxLog TX ERROR %d starting transaction", rv);
  49. return rv;
  50. }
  51. int end_tx(enum TX_TYPE txtype) {
  52. int rv = TX_OK;
  53. userlogc_debug( "%s:%d", __FUNCTION__, __LINE__);
  54. if (is_commit(txtype)) {
  55. userlogc_debug( "TxLog - Commiting transaction");
  56. rv = tx_commit();
  57. } else if (is_abort(txtype)) {
  58. userlogc_debug( "TxLog - Rolling back transaction");
  59. rv = tx_rollback();
  60. }
  61. if (rv != TX_OK)
  62. userlogc_warn( "TxLog TX finish error %d", rv);
  63. return rv;
  64. }
  65. int is_tx_in_state(enum TX_TYPE txtype) {
  66. int txs;
  67. int ts;
  68. /* userlogc_debug( "TxLog %s:%d %d", __FUNCTION__, __LINE__, txtype);*/
  69. ts = (txtype == TX_TYPE_NONE ? -1 : TX_ACTIVE);
  70. txs = get_tx_status();
  71. userlogc_debug("TxLog validating tx status actual %d vrs desired %d", txs, ts);
  72. return (txs == ts);
  73. }
  74. int get_tx_status()
  75. {
  76. TXINFO txinfo;
  77. int rv = tx_info(&txinfo);
  78. if (rv < 0) {
  79. userlogc_warn("TxLog is_tx_in_state tx_info error: %d", rv);
  80. return rv;
  81. }
  82. userlogc_debug("TxLog tx status %d", txinfo.transaction_state);
  83. return (txinfo.transaction_state);
  84. }
  85. static int reqid = 0;
  86. static void _init_req(test_req_t *req, int prodid, const char *dbfile, const char *data, char op, enum TX_TYPE txtype, int expect) {
  87. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  88. req->prod = prodid;
  89. req->txtype = txtype;
  90. req->expect = expect;
  91. req->id = ++reqid;
  92. req->op = op;
  93. req->status = 0;
  94. req->data[0] = 0;
  95. req->db[0] = 0;
  96. if (data)
  97. (void) strncpy(req->data, data, sizeof(req->data) - 1);
  98. if (dbfile)
  99. (void) strncpy(req->db, dbfile, sizeof(req->db) - 1);
  100. }
  101. test_req_t * get_buf(int remote, const char *data, const char *dbfile, char op, int prod, enum TX_TYPE txtype, int expect) {
  102. test_req_t *req;
  103. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  104. if (remote)
  105. req = (test_req_t *) tpalloc((char*) "X_C_TYPE", (char*) "test_req", 0);
  106. else
  107. req = (test_req_t *) malloc(sizeof (test_req_t));
  108. if (req != NULL) {
  109. int foo = sizeof (test_req_t);
  110. (void *) memset(req, 0, foo);
  111. _init_req(req, prod, dbfile, data, op, txtype, expect);
  112. } else {
  113. (void) fatal("out of memory (for alloc)");
  114. }
  115. return req;
  116. }
  117. void free_buf(int remote, test_req_t *req) {
  118. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  119. if (remote)
  120. tpfree((char *) req);
  121. else
  122. free(req);
  123. }
  124. int fail(const char *reason, int ret)
  125. {
  126. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  127. userlogc_warn( "TxLog %s: %dn", reason, ret);
  128. return ret;
  129. }
  130. int fatal(const char *msg)
  131. {
  132. userlogc_debug( "TxLog %s:%d: %s", __FUNCTION__, __LINE__, msg);
  133. return -1;
  134. }
  135. long null_xaflags()
  136. {
  137. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  138. return 0L;
  139. }
  140. int null_access(test_req_t *req, test_req_t *resp)
  141. {
  142. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  143. resp->status = 0;
  144. (void) userlogc_snprintf(resp->data, sizeof(resp->data), "%d", req->expect);
  145. userlogc_debug( "TxLog null_access: prod id=%d (%s) op=%c res=%s", req->prod, req->db, req->op, resp->data);
  146. return 0;
  147. }