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

中间件编程

开发平台:

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. #ifdef TX_RC
  20. #include "testrm.h"
  21. #ifndef TX_RC_RMID
  22. #define TX_RC_RMID 202
  23. #endif
  24. /**
  25.  * See if the request corresponds to a request to inject faults during
  26.  * 2PC processing
  27.  */
  28. static void inject_fault(int xa_method, int type)
  29. {
  30. userlogc( "TxLog inject_fault check type=0x%x", type);
  31. if (type & TX_TYPE_HALT) {
  32. fault_t fault = {0, TX_RC_RMID, O_XA_NONE, XA_OK, F_HALT, (void*) 0};
  33. if (type & TX_TYPE_PREPARE) {
  34. fault.op = O_XA_PREPARE;
  35. userlogc( "TxLog inject_fault adding halt on prepare");
  36. } else if (type & TX_TYPE_COMMIT) {
  37. fault.op = O_XA_COMMIT;
  38. userlogc( "TxLog inject_fault adding halt on commit");
  39. } else {
  40. userlogc( "TxLog inject_fault not adding fault ");
  41. }
  42. (void) dummy_rm_add_fault(&fault);
  43. }
  44. }
  45. #else
  46. #define inject_fault(xa_method, type)
  47. #endif
  48. #ifdef UNITTEST
  49. void tx_db_service(TPSVCINFO *svcinfo)
  50. #else
  51. void BAR(TPSVCINFO * svcinfo)
  52. #endif
  53. {
  54. test_req_t *req = (test_req_t *) svcinfo->data;
  55. test_req_t *resp = (test_req_t *) tpalloc((char*) "X_C_TYPE", (char*) "test_req", 0);
  56. product_t *p = products;
  57. userlogc_debug( "TxLog %s service %s running", __FUNCTION__, TXTEST_SVC_NAME);
  58. resp->status = -1;
  59. // see if the client wishes to inject a fault during 2PC protocol processing
  60. inject_fault(O_XA_COMMIT, req->txtype);
  61. for (p = products; p->id != -1; p++) {
  62. if (req->prod == p->id) {
  63. int rv;
  64. strncpy(req->db, p->dbname, sizeof(req->db));
  65. userlogc_debug("TxLog Service %s %4d: prod=%8s (id=%d) op=%c tx=0x%x data=%s", TXTEST_SVC_NAME,
  66. req->id, p->pname, p->id, req->op, req->txtype, req->data);
  67. rv = p->access(req, resp);
  68. userlogc_debug("TxLog Service %s %4d: resp->status=%d rv=%d", TXTEST_SVC_NAME, req->id, resp->status, rv);
  69. break;
  70. }
  71. }
  72. tpreturn(TPSUCCESS, resp->status, (char *) resp, sizeof (test_req_t), 0);
  73. }