0001 /**
0002 * @brief PostgreSQL PQ TMSRV driver tests / branch transactions - server
0003 *
0004 * @file atmisv67.pgc
0005 */
0006 /* -----------------------------------------------------------------------------
0007 * Enduro/X Middleware Platform for Distributed Transaction Processing
0008 * Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0009 * Copyright (C) 2017-2023, Mavimax, Ltd. All Rights Reserved.
0010 * This software is released under one of the following licenses:
0011 * AGPL (with Java and Go exceptions) or Mavimax's license for commercial use.
0012 * See LICENSE file for full text.
0013 * -----------------------------------------------------------------------------
0014 * AGPL license:
0015 *
0016 * This program is free software; you can redistribute it and/or modify it under
0017 * the terms of the GNU Affero General Public License, version 3 as published
0018 * by the Free Software Foundation;
0019 *
0020 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0021 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0022 * PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0023 * for more details.
0024 *
0025 * You should have received a copy of the GNU Affero General Public License along
0026 * with this program; if not, write to the Free Software Foundation, Inc.,
0027 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0028 *
0029 * -----------------------------------------------------------------------------
0030 * A commercial use license is available from Mavimax, Ltd
0031 * contact@mavimax.com
0032 * -----------------------------------------------------------------------------
0033 */
0034 #include <stdio.h>
0035 #include <stdlib.h>
0036 #include <ndebug.h>
0037 #include <atmi.h>
0038 #include <ndrstandard.h>
0039 #include <ubf.h>
0040 #include <test.fd.h>
0041 #include <string.h>
0042 #include <unistd.h>
0043 #include "test67.h"
0044
0045 /*---------------------------Externs------------------------------------*/
0046 /*---------------------------Macros-------------------------------------*/
0047 /*---------------------------Enums--------------------------------------*/
0048 /*---------------------------Typedefs-----------------------------------*/
0049 /*---------------------------Globals------------------------------------*/
0050 /*---------------------------Statics------------------------------------*/
0051 /*---------------------------Prototypes---------------------------------*/
0052
0053 /**
0054 * Shared test function add some data to DB
0055 */
0056 int shared_svc_func(TPSVCINFO *p_svc)
0057 {
0058 int ret=EXSUCCEED;
0059 char testbuf[1024];
0060 UBFH *p_ub = (UBFH *)p_svc->data;
0061
0062 EXEC SQL BEGIN DECLARE SECTION;
0063 long id;
0064 EXEC SQL END DECLARE SECTION;
0065
0066 tplogprintubf(log_debug, "Got UBF", p_ub);
0067
0068 if (EXFAIL==Bget(p_ub, T_LONG_FLD, 0, (char *)&id, 0))
0069 {
0070 NDRX_LOG(log_error, "TESTERROR: Failed to get T_LONG_FLD: %s",
0071 Bstrerror(Berror));
0072 EXFAIL_OUT(ret);
0073 }
0074
0075 EXEC SQL INSERT INTO EXTEST(userid) VALUES (:id);
0076
0077 if ((sqlca.sqlcode < 0) || (sqlca.sqlcode == 100))
0078 {
0079
0080 NDRX_LOG(log_error, "TESTERROR: error code [%d] message [%s] rows %d, warning %c",
0081 sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, sqlca.sqlerrd[2], sqlca.sqlwarn[0]);
0082 EXFAIL_OUT(ret);
0083 }
0084
0085 out:
0086 return ret;
0087 }
0088
0089 /**
0090 * Standard service entry.
0091 * transaction shall be open by caller.
0092 */
0093 void TESTSV (TPSVCINFO *p_svc)
0094 {
0095 int ret;
0096 ret = shared_svc_func(p_svc);
0097
0098 tpreturn( ret==EXSUCCEED?TPSUCCESS:TPFAIL,
0099 0L,
0100 p_svc->data,
0101 0L,
0102 0L);
0103 }
0104
0105 /**
0106 * Timeout service
0107 */
0108 void TOUTSV (TPSVCINFO *p_svc)
0109 {
0110 int ret=EXSUCCEED;
0111 char testbuf[1024];
0112 UBFH *p_ub = (UBFH *)p_svc->data;
0113
0114 sleep(60);
0115
0116 out:
0117 tpreturn( ret==EXSUCCEED?TPSUCCESS:TPFAIL,
0118 0L,
0119 (char *)p_ub,
0120 0L,
0121 0L);
0122 }
0123
0124 /**
0125 * Failure service
0126 */
0127 void FAILSV (TPSVCINFO *p_svc)
0128 {
0129 int ret;
0130
0131 /* do some insert */
0132 ret = shared_svc_func(p_svc);
0133
0134 /* fail the insert */
0135 tpreturn( TPFAIL,
0136 0L,
0137 p_svc->data,
0138 0L,
0139 0L);
0140 }
0141
0142 /**
0143 * Do initialisation
0144 */
0145 int NDRX_INTEGRA(tpsvrinit)(int argc, char **argv)
0146 {
0147 int ret = EXSUCCEED;
0148 NDRX_LOG(log_debug, "tpsvrinit called");
0149
0150 /*
0151 * This opens connection to database
0152 */
0153 if (EXSUCCEED!=tpopen())
0154 {
0155 NDRX_LOG(log_error, "Failed to tpopen: %s", tpstrerror(tperrno));
0156 EXFAIL_OUT(ret);
0157 }
0158
0159 if (EXSUCCEED!=tpadvertise("TESTSV", TESTSV))
0160 {
0161 NDRX_LOG(log_error, "Failed to initialise TESTSV: %s", tpstrerror(tperrno));
0162 EXFAIL_OUT(ret);
0163 }
0164 else if (EXSUCCEED!=tpadvertise("TOUTSV", TOUTSV))
0165 {
0166 NDRX_LOG(log_error, "Failed to initialise TOUTSV: %s", tpstrerror(tperrno));
0167 EXFAIL_OUT(ret);
0168 }
0169 else if (EXSUCCEED!=tpadvertise("FAILSV", FAILSV))
0170 {
0171 NDRX_LOG(log_error, "Failed to initialise FAILSV: %s", tpstrerror(tperrno));
0172 EXFAIL_OUT(ret);
0173 }
0174
0175
0176 out:
0177 return ret;
0178 }
0179
0180 /**
0181 * Do de-initialisation
0182 */
0183 void NDRX_INTEGRA(tpsvrdone)(void)
0184 {
0185 NDRX_LOG(log_debug, "tpsvrdone called");
0186 tpclose();
0187 }
0188
0189 /* vim: set ts=4 sw=4 et smartindent: */