0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <memory.h>
0038 #include <sys/param.h>
0039
0040 #include <ndrstandard.h>
0041 #include <ndebug.h>
0042 #include <nstdutil.h>
0043
0044 #include <ndrxdcmn.h>
0045 #include <atmi_int.h>
0046 #include <gencall.h>
0047 #include <utlist.h>
0048 #include <Exfields.h>
0049
0050 #include "xa_cmn.h"
0051 #include "nclopt.h"
0052 #include <ndrx.h>
0053 #include <qcommon.h>
0054 #include <atmi_cache.h>
0055 #include <ubfutil.h>
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 exprivate void print_hdr(char *dbname)
0069 {
0070 fprintf(stderr, " ND UTC DATE ADDED HITS TY DLEN KEY\n");
0071 fprintf(stderr, "--- ------------------- ----- -- ----- ----------------------------------------\n");
0072 }
0073
0074
0075
0076
0077
0078
0079
0080 exprivate int print_buffer(UBFH *p_ub, char *dbname)
0081 {
0082 int ret = EXSUCCEED;
0083 ndrx_tpcache_data_t cdata;
0084 char *keydata = NULL;
0085
0086 ndrx_debug_dump_UBF(log_debug, "Got reply buffer", p_ub);
0087
0088 if (EXSUCCEED!=ndrx_cache_mgt_ubf2data(p_ub, &cdata, NULL, &keydata, NULL, NULL))
0089 {
0090 NDRX_LOG(log_error, "Failed to get mandatory UBF data!");
0091 EXFAIL_OUT(ret);
0092 }
0093
0094 printf("%3d %19.19s %5.5s %2hd %5.5s %s\n"
0095 ,cdata.nodeid
0096 ,ndrx_get_strtstamp_from_sec(0, cdata.t)
0097 ,ndrx_decode_num(cdata.hits, 0, 0, 1)
0098 ,cdata.atmi_type_id
0099 ,ndrx_decode_num(cdata.atmi_buf_len, 1, 0, 1)
0100 ,keydata
0101 );
0102
0103 out:
0104
0105 if (NULL!=keydata)
0106 {
0107 NDRX_FREE(keydata);
0108 }
0109
0110 return ret;
0111 }
0112
0113
0114
0115
0116
0117 exprivate int call_cache(char *dbname)
0118 {
0119 UBFH *p_ub = (UBFH *)tpalloc("UBF", "", 1024);
0120 int ret=EXSUCCEED;
0121 int cd;
0122 long revent;
0123 int recv_continue = 1;
0124 int tp_errno;
0125 long rcv_count = 0;
0126 char *svcnm;
0127 char cmd = NDRX_CACHE_SVCMD_CLSHOW;
0128
0129
0130 svcnm = ndrx_cache_mgt_getsvc();
0131
0132
0133 if (NULL==p_ub)
0134 {
0135 NDRX_LOG(log_error, "Failed to alloc FB!");
0136 EXFAIL_OUT(ret);
0137 }
0138
0139 if (EXSUCCEED!=Bchg(p_ub, EX_CACHE_CMD, 0, &cmd, 0L))
0140 {
0141 NDRX_LOG(log_error, "Failed to install command code: %s",
0142 Bstrerror(Berror));
0143 EXFAIL_OUT(ret);
0144 }
0145
0146 if (EXSUCCEED!=Bchg(p_ub, EX_CACHE_DBNAME, 0, dbname, 0L))
0147 {
0148 NDRX_LOG(log_error, "Failed to install db name to buffer: %s",
0149 Bstrerror(Berror));
0150 EXFAIL_OUT(ret);
0151 }
0152
0153 if (EXFAIL == (cd = tpconnect(svcnm,
0154 (char *)p_ub,
0155 0,
0156 TPNOTRAN |
0157 TPRECVONLY)))
0158 {
0159 NDRX_LOG(log_error, "Connect error [%s]", tpstrerror(tperrno) );
0160 fprintf(stderr, "Connect error [%s]\n", tpstrerror(tperrno));
0161 ret = EXFAIL;
0162 goto out;
0163 }
0164 NDRX_LOG(log_debug, "Connected OK, cd = %d", cd );
0165
0166 while (recv_continue)
0167 {
0168 recv_continue=0;
0169 if (EXFAIL == tprecv(cd,
0170 (char **)&p_ub,
0171 0L,
0172 0L,
0173 &revent))
0174 {
0175 ret = EXFAIL;
0176 tp_errno = tperrno;
0177 if (TPEEVENT == tp_errno)
0178 {
0179 if (TPEV_SVCSUCC == revent)
0180 ret = EXSUCCEED;
0181 else
0182 {
0183 NDRX_LOG(log_error,
0184 "Unexpected conv event %lx", revent );
0185 EXFAIL_OUT(ret);
0186 }
0187 }
0188 else
0189 {
0190 NDRX_LOG(log_error, "recv error %d", tp_errno );
0191 EXFAIL_OUT(ret);
0192 }
0193 }
0194 else
0195 {
0196 if (EXSUCCEED!=print_buffer(p_ub, svcnm))
0197 {
0198 EXFAIL_OUT(ret);
0199 }
0200 rcv_count++;
0201 recv_continue=1;
0202 }
0203 }
0204
0205 fprintf(stderr, "%ld records cached in \"%s\" database\n", rcv_count, dbname);
0206
0207 out:
0208
0209 if (NULL!=p_ub)
0210 {
0211 tpfree((char *)p_ub);
0212 }
0213
0214 return ret;
0215 }
0216
0217
0218
0219
0220
0221
0222
0223
0224 expublic int cmd_cs(cmd_mapping_t *p_cmd_map, int argc, char **argv, int *p_have_next)
0225 {
0226 int ret=EXSUCCEED;
0227 char dbname[NDRX_CCTAG_MAX+1]={EXEOS};
0228 ncloptmap_t clopt[] =
0229 {
0230 {'d', BFLD_STRING, (void *)dbname, sizeof(dbname),
0231 NCLOPT_MAND|NCLOPT_HAVE_VALUE, "Database name"},
0232 {0}
0233 };
0234
0235 if (argc>=2 && '-'!=argv[1][0])
0236 {
0237 NDRX_STRCPY_SAFE(dbname, argv[1]);
0238 }
0239 else
0240 {
0241
0242 if (nstd_parse_clopt(clopt, EXTRUE, argc, argv, EXFALSE))
0243 {
0244 fprintf(stderr, XADMIN_INVALID_OPTIONS_MSG);
0245 EXFAIL_OUT(ret);
0246 }
0247 }
0248
0249
0250 if (EXSUCCEED!=tpinit(NULL))
0251 {
0252 fprintf(stderr, "Failed to tpinit(): %s\n", tpstrerror(tperrno));
0253 EXFAIL_OUT(ret);
0254 }
0255
0256 print_hdr(dbname);
0257
0258 if (EXSUCCEED!=call_cache(dbname))
0259 {
0260 NDRX_LOG(log_debug, "Failed to call cache server for db [%s]", dbname);
0261 fprintf(stderr, "Failed to call cache server!\n");
0262 EXFAIL_OUT(ret);
0263 }
0264
0265 out:
0266 return ret;
0267 }
0268
0269