Back to home page

Enduro/X

 
 

    


0001 /**
0002  * @brief Load null driver - static version
0003  *
0004  * @file tmnull_switch.c
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 <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 
0038 #include <ndrstandard.h>
0039 #include <ndebug.h>
0040 #include <atmi.h>
0041 #include <tmenv.h>
0042 
0043 #include <xa.h>
0044 
0045 #include "atmi_tls.h"
0046 /*---------------------------Externs------------------------------------*/
0047 /*---------------------------Macros-------------------------------------*/
0048 /*---------------------------Enums--------------------------------------*/
0049 /*---------------------------Typedefs-----------------------------------*/
0050 /*---------------------------Globals------------------------------------*/
0051 /*---------------------------Statics------------------------------------*/
0052 exprivate MUTEX_LOCKDECL(M_init);
0053 /*---------------------------Prototypes---------------------------------*/
0054 
0055 
0056 expublic int ndrx_nul_xa_open_entry_stat(char *xa_info, int rmid, long flags);
0057 expublic int ndrx_nul_xa_close_entry_stat(char *xa_info, int rmid, long flags);
0058 expublic int ndrx_nul_xa_start_entry_stat(XID *xid, int rmid, long flags);
0059 expublic int ndrx_nul_xa_end_entry_stat(XID *xid, int rmid, long flags);
0060 expublic int ndrx_nul_xa_rollback_entry_stat(XID *xid, int rmid, long flags);
0061 expublic int ndrx_nul_xa_prepare_entry_stat(XID *xid, int rmid, long flags);
0062 expublic int ndrx_nul_xa_commit_entry_stat(XID *xid, int rmid, long flags);
0063 expublic int ndrx_nul_xa_recover_entry_stat(XID *xid, long count, int rmid, long flags);
0064 expublic int ndrx_nul_xa_forget_entry_stat(XID *xid, int rmid, long flags);
0065 expublic int ndrx_nul_xa_complete_entry_stat(int *handle, int *retval, int rmid, long flags);
0066 
0067 expublic int ndrx_nul_xa_open_entry(struct xa_switch_t *sw, char *xa_info, int rmid, long flags);
0068 expublic int ndrx_nul_xa_close_entry(struct xa_switch_t *sw, char *xa_info, int rmid, long flags);
0069 expublic int ndrx_nul_xa_start_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0070 expublic int ndrx_nul_xa_end_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0071 expublic int ndrx_nul_xa_rollback_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0072 expublic int ndrx_nul_xa_prepare_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0073 expublic int ndrx_nul_xa_commit_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0074 expublic int ndrx_nul_xa_recover_entry(struct xa_switch_t *sw, XID *xid, long count, int rmid, long flags);
0075 expublic int ndrx_nul_xa_forget_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags);
0076 expublic int ndrx_nul_xa_complete_entry(struct xa_switch_t *sw, int *handle, int *retval, int rmid, long flags);
0077 
0078 struct xa_switch_t tmnull_switch = 
0079 { 
0080     .name = "tmnull_switch",
0081     .flags = TMNOFLAGS,
0082     .version = 0,
0083     .xa_open_entry = ndrx_nul_xa_open_entry_stat,
0084     .xa_close_entry = ndrx_nul_xa_close_entry_stat,
0085     .xa_start_entry = ndrx_nul_xa_start_entry_stat,
0086     .xa_end_entry = ndrx_nul_xa_end_entry_stat,
0087     .xa_rollback_entry = ndrx_nul_xa_rollback_entry_stat,
0088     .xa_prepare_entry = ndrx_nul_xa_prepare_entry_stat,
0089     .xa_commit_entry = ndrx_nul_xa_commit_entry_stat,
0090     .xa_recover_entry = ndrx_nul_xa_recover_entry_stat,
0091     .xa_forget_entry = ndrx_nul_xa_forget_entry_stat,
0092     .xa_complete_entry = ndrx_nul_xa_complete_entry_stat
0093 };
0094 
0095 /**
0096  * Open API
0097  * @param sw
0098  * @param xa_info
0099  * @param rmid
0100  * @param flags
0101  * @return 
0102  */
0103 expublic int ndrx_nul_xa_open_entry(struct xa_switch_t *sw, char *xa_info, int rmid, long flags)
0104 {
0105     static int first = EXTRUE;
0106     
0107     /* mark that suspend no required by this resource... */
0108     if (first)
0109     {
0110         MUTEX_LOCK_V(M_init);
0111         if (first)
0112         {
0113             ndrx_xa_nosuspend(EXTRUE);
0114             first=EXFALSE;
0115         }
0116         MUTEX_UNLOCK_V(M_init);
0117     }
0118     
0119     if (G_atmi_tls->tmnull_is_open)
0120     {
0121         NDRX_LOG(log_error, "xa_open_entry() - already open!");
0122         return XAER_RMERR;
0123     }
0124     
0125     G_atmi_tls->tmnull_is_open = EXTRUE;
0126     G_atmi_tls->tmnull_rmid = rmid;
0127              
0128     return XA_OK;
0129 }
0130 /**
0131  * Close entry
0132  * @param sw
0133  * @param xa_info
0134  * @param rmid
0135  * @param flags
0136  * @return 
0137  */
0138 expublic int ndrx_nul_xa_close_entry(struct xa_switch_t *sw, char *xa_info, int rmid, long flags)
0139 {
0140     NDRX_LOG(log_info, "xa_close_entry() called");
0141     
0142     G_atmi_tls->tmnull_is_open = EXFALSE;
0143     return XA_OK;
0144 }
0145 
0146 /**
0147  * Open text file in RMID folder. Create file by TXID.
0148  * Check for file existance. If start & not exists - ok .
0149  * If exists and join - ok. Otherwise fail.
0150  * @param xa_info
0151  * @param rmid
0152  * @param flags
0153  * @return 
0154  */
0155 expublic int ndrx_nul_xa_start_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0156 {
0157     if (!G_atmi_tls->tmnull_is_open)
0158     {
0159         NDRX_LOG(log_error, "xa_start_entry() - XA not open!");
0160         return XAER_RMERR;
0161     }
0162     
0163     return XA_OK;
0164 }
0165 
0166 /**
0167  * Terminate XA access
0168  * @param sw
0169  * @param xid
0170  * @param rmid
0171  * @param flags
0172  * @return 
0173  */
0174 expublic int ndrx_nul_xa_end_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0175 {
0176     if (!G_atmi_tls->tmnull_is_open)
0177     {
0178         NDRX_LOG(log_error, "xa_end_entry() - XA not open!");
0179         return XAER_RMERR;
0180     }
0181     
0182 out:
0183     
0184     return XA_OK;
0185 }
0186 
0187 /**
0188  * Rollback
0189  * @param sw
0190  * @param xid
0191  * @param rmid
0192  * @param flags
0193  * @return 
0194  */
0195 expublic int ndrx_nul_xa_rollback_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0196 {
0197     if (!G_atmi_tls->tmnull_is_open)
0198     {
0199         NDRX_LOG(log_error, "xa_rollback_entry() - XA not open!");
0200         return XAER_RMERR;
0201     }
0202     
0203     return XA_OK;
0204 }
0205 
0206 /**
0207  * prepare
0208  * @param sw
0209  * @param xid
0210  * @param rmid
0211  * @param flags
0212  * @return 
0213  */
0214 expublic int ndrx_nul_xa_prepare_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0215 {
0216     if (!G_atmi_tls->tmnull_is_open)
0217     {
0218         NDRX_LOG(log_error, "xa_prepare_entry() - XA not open!");
0219         return XAER_RMERR;
0220     }
0221     
0222     return XA_OK;
0223 }
0224 
0225 /**
0226  * Commit
0227  * @param sw
0228  * @param xid
0229  * @param rmid
0230  * @param flags
0231  * @return 
0232  */
0233 expublic int ndrx_nul_xa_commit_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0234 {
0235     if (!G_atmi_tls->tmnull_is_open)
0236     {
0237         NDRX_LOG(log_error, "xa_commit_entry() - XA not open!");
0238         return XAER_RMERR;
0239     }
0240     
0241     return XA_OK;
0242 }
0243 
0244 /**
0245  * Return list of trans
0246  * @param sw
0247  * @param xid
0248  * @param count
0249  * @param rmid
0250  * @param flags
0251  * @return 
0252  */
0253 expublic int ndrx_nul_xa_recover_entry(struct xa_switch_t *sw, XID *xid, long count, int rmid, long flags)
0254 {
0255     if (!G_atmi_tls->tmnull_is_open)
0256     {
0257         NDRX_LOG(log_error, "xa_recover_entry() - XA not open!");
0258         return XAER_RMERR;
0259     }
0260     
0261     return 0; /* 0 transactions found... */
0262 }
0263 
0264 /**
0265  * Forget tran
0266  * @param sw
0267  * @param xid
0268  * @param rmid
0269  * @param flags
0270  * @return 
0271  */
0272 expublic int ndrx_nul_xa_forget_entry(struct xa_switch_t *sw, XID *xid, int rmid, long flags)
0273 {
0274    if (!G_atmi_tls->tmnull_is_open)
0275     {
0276         NDRX_LOG(log_error, "xa_forget_entry() - XA not open!");
0277         return XAER_RMERR;
0278     }
0279     
0280     NDRX_LOG(log_error, "xa_forget_entry() - not implemented!!");
0281     return XA_OK;
0282 }
0283 
0284 /**
0285  * CURRENTLY NOT USED!!!
0286  * @param sw
0287  * @param handle
0288  * @param retval
0289  * @param rmid
0290  * @param flags
0291  * @return 
0292  */
0293 expublic int ndrx_nul_xa_complete_entry(struct xa_switch_t *sw, int *handle, int *retval, int rmid, long flags)
0294 {
0295     if (!G_atmi_tls->tmnull_is_open)
0296     {
0297         NDRX_LOG(log_error, "xa_complete_entry() - XA not open!");
0298         return XAER_RMERR;
0299     }
0300     
0301     NDRX_LOG(log_error, "xa_complete_entry() - not using!!");
0302     return XAER_RMERR;
0303 }
0304 
0305 
0306 /* Static entries */
0307 expublic int ndrx_nul_xa_open_entry_stat( char *xa_info, int rmid, long flags)
0308 {
0309     return ndrx_nul_xa_open_entry(&tmnull_switch, xa_info, rmid, flags);
0310 }
0311 expublic int ndrx_nul_xa_close_entry_stat(char *xa_info, int rmid, long flags)
0312 {
0313     return ndrx_nul_xa_close_entry(&tmnull_switch, xa_info, rmid, flags);
0314 }
0315 expublic int ndrx_nul_xa_start_entry_stat(XID *xid, int rmid, long flags)
0316 {
0317     return ndrx_nul_xa_start_entry(&tmnull_switch, xid, rmid, flags);
0318 }
0319 
0320 expublic int ndrx_nul_xa_end_entry_stat(XID *xid, int rmid, long flags)
0321 {
0322     return ndrx_nul_xa_end_entry(&tmnull_switch, xid, rmid, flags);
0323 }
0324 expublic int ndrx_nul_xa_rollback_entry_stat(XID *xid, int rmid, long flags)
0325 {
0326     return ndrx_nul_xa_rollback_entry(&tmnull_switch, xid, rmid, flags);
0327 }
0328 expublic int ndrx_nul_xa_prepare_entry_stat(XID *xid, int rmid, long flags)
0329 {
0330     return ndrx_nul_xa_prepare_entry(&tmnull_switch, xid, rmid, flags);
0331 }
0332 
0333 expublic int ndrx_nul_xa_commit_entry_stat(XID *xid, int rmid, long flags)
0334 {
0335     return ndrx_nul_xa_commit_entry(&tmnull_switch, xid, rmid, flags);
0336 }
0337 
0338 expublic int ndrx_nul_xa_recover_entry_stat(XID *xid, long count, int rmid, long flags)
0339 {
0340     return ndrx_nul_xa_recover_entry(&tmnull_switch, xid, count, rmid, flags);
0341 }
0342 expublic int ndrx_nul_xa_forget_entry_stat(XID *xid, int rmid, long flags)
0343 {
0344     return ndrx_nul_xa_forget_entry(&tmnull_switch, xid, rmid, flags);
0345 }
0346 expublic int ndrx_nul_xa_complete_entry_stat(int *handle, int *retval, int rmid, long flags)
0347 {
0348     return ndrx_nul_xa_complete_entry(&tmnull_switch, handle, retval, rmid, flags);
0349 }
0350 
0351 /* vim: set ts=4 sw=4 et smartindent: */