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 DB2
  22. {1, "db2 - BTDB1", "BTDB1", ANY_ACCESS, db2_access, db2_xaflags},
  23. {2, "db2 - BTDB2", "BTDB2", ANY_ACCESS, db2_access, db2_xaflags},
  24. #endif
  25. #ifdef ORACLE
  26. {3, "ora - blacktie", "blacktie", ANY_ACCESS, ora_access, ora_xaflags},
  27. {4, "ora - ORCL", "ORCL", ANY_ACCESS, ora_access, ora_xaflags},
  28. #endif
  29. {-1, 0, 0, 0, 0},
  30. };
  31. /* helper methods for controling transactions */
  32. int is_begin(enum TX_TYPE txtype) {
  33. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  34. return (txtype & TX_TYPE_BEGIN);
  35. }
  36. int is_commit(enum TX_TYPE txtype) {
  37. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  38. return (txtype & TX_TYPE_COMMIT);
  39. }
  40. int is_abort(enum TX_TYPE txtype) {
  41. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  42. return (txtype & TX_TYPE_ABORT);
  43. }
  44. int start_tx(enum TX_TYPE txtype) {
  45. int rv = TX_OK;
  46. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  47. if (is_begin(txtype)) {
  48. userlogc_debug( "TxLog - Starting Transaction");
  49. rv = tx_begin();
  50. }
  51. if (rv != TX_OK)
  52. userlogc_warn( "TxLog TX ERROR %d starting transaction", rv);
  53. return rv;
  54. }
  55. int end_tx(enum TX_TYPE txtype) {
  56. int rv = TX_OK;
  57. userlogc_debug( "%s:%d", __FUNCTION__, __LINE__);
  58. if (is_commit(txtype)) {
  59. userlogc_debug( "TxLog - Commiting transaction");
  60. rv = tx_commit();
  61. } else if (is_abort(txtype)) {
  62. userlogc_debug( "TxLog - Rolling back transaction");
  63. rv = tx_rollback();
  64. }
  65. if (rv != TX_OK)
  66. userlogc_warn( "TxLog TX finish error %d", rv);
  67. return rv;
  68. }
  69. int is_tx_in_state(enum TX_TYPE txtype) {
  70. int txs;
  71. int ts;
  72. /* userlogc_debug( "TxLog %s:%d %d", __FUNCTION__, __LINE__, txtype);*/
  73. ts = (txtype == TX_TYPE_NONE ? -1 : TX_ACTIVE);
  74. txs = get_tx_status();
  75. userlogc_debug("TxLog validating tx status actual %d vrs desired %d", txs, ts);
  76. return (txs == ts);
  77. }
  78. int get_tx_status()
  79. {
  80. TXINFO txinfo;
  81. int rv = tx_info(&txinfo);
  82. if (rv < 0) {
  83. userlogc_warn("TxLog is_tx_in_state tx_info error: %d", rv);
  84. return rv;
  85. }
  86. userlogc_debug("TxLog tx status %d", txinfo.transaction_state);
  87. return (txinfo.transaction_state);
  88. }
  89. static int reqid = 0;
  90. static void _init_req(test_req_t *req, int prodid, const char *dbfile, const char *data, char op, enum TX_TYPE txtype, int expect) {
  91. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  92. req->prod = prodid;
  93. req->txtype = txtype;
  94. req->expect = expect;
  95. req->id = ++reqid;
  96. req->op = op;
  97. req->status = 0;
  98. req->data[0] = 0;
  99. req->db[0] = 0;
  100. if (data)
  101. (void) strncpy(req->data, data, sizeof(req->data) - 1);
  102. if (dbfile)
  103. (void) strncpy(req->db, dbfile, sizeof(req->db) - 1);
  104. }
  105. test_req_t * get_buf(int remote, const char *data, const char *dbfile, char op, int prod, enum TX_TYPE txtype, int expect) {
  106. test_req_t *req;
  107. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  108. if (remote)
  109. req = (test_req_t *) tpalloc((char*) "X_C_TYPE", (char*) "test_req", 0);
  110. else
  111. req = (test_req_t *) malloc(sizeof (test_req_t));
  112. if (req != NULL) {
  113. int foo = sizeof (test_req_t);
  114. (void *) memset(req, 0, foo);
  115. _init_req(req, prod, dbfile, data, op, txtype, expect);
  116. } else {
  117. (void) fatal("out of memory (for alloc)");
  118. }
  119. return req;
  120. }
  121. void free_buf(int remote, test_req_t *req) {
  122. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  123. if (remote)
  124. tpfree((char *) req);
  125. else
  126. free(req);
  127. }
  128. int fail(const char *reason, int ret)
  129. {
  130. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  131. userlogc_warn( "TxLog %s: %dn", reason, ret);
  132. return ret;
  133. }
  134. int fatal(const char *msg)
  135. {
  136. userlogc_warn( "TxLog %s:%d: %s", __FUNCTION__, __LINE__, msg);
  137. return -1;
  138. }
  139. long null_xaflags()
  140. {
  141. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  142. return 0L;
  143. }
  144. int null_access(test_req_t *req, test_req_t *resp)
  145. {
  146. userlogc_debug( "TxLog %s:%d", __FUNCTION__, __LINE__);
  147. resp->status = 0;
  148. (void) userlogc_snprintf(resp->data, sizeof(resp->data), "%d", req->expect);
  149. userlogc_debug( "TxLog null_access: prod id=%d (%s) op=%c res=%s", req->prod, req->db, req->op, resp->data);
  150. return 0;
  151. }