/* * Called by the client to insert data into the databases. Also can kill this * thread if commanded to by the client. */ void TXN_FUNC(TPSVCINFO *msg) { int ret, i, commit, key_value, data_value; DBT key, data; memset(&key, 0, sizeof key); memset(&data, 0, sizeof data); commit = 1; ++cnt_request; #ifdef SERVER1 key_value = data_value = cnt_request + 1; #else key_value = data_value = (rand() % 1000) + 1; #endif data.data = &data_value; data.size = sizeof(data_value); key.data = &key_value; key.size = sizeof(key_value); /* Kill the server to see what happens. */ if (msg->data != NULL) { pthread_exit(NULL); } /* Insert data into the tables. */ if (verbose) { printf("put1: key: n"); printf("put1: data:\n"); } if ((ret = db1->put(db1, NULL, &key, &data, 0)) != 0) { if (ret == DB_LOCK_DEADLOCK) goto abort; fprintf(stderr, "%s: %s: Table1->put: %s\n", progname, TXN_STRING, db_strerror(ret)); goto err; } if ((ret = db2->put(db2, NULL, &key, &data, 0)) != 0) { if (ret == DB_LOCK_DEADLOCK) goto abort; fprintf(stderr, "%s: %s: Table2->put: %s\n", progname, TXN_STRING, db_strerror(ret)); goto err; } /* Returns a commit or abort command to the client. */ if (verbose) printf("%s: %s: commit\n", progname, TXN_STRING); tpreturn(TPSUCCESS, 0L, 0, 0L, 0); if (0) { abort: if (verbose) printf("%s: %s: abort\n", progname, TXN_STRING); tpreturn(TPSUCCESS, 1L, 0, 0L, 0); } return; err: tpreturn(TPFAIL, 1L, 0, 0L, 0); }
/*********************************************************************** 交易: CLIENT_LOGIN 功能:远程监控客户端连接主监控时调用 输入参数: iHostID(客户端主机ID, 对应WF_HOSTINFO.HOST_ID) --客户端守护进程启动时建议默认根据hostname取ID sSysUserName(Unix 用户名) 返回值: iLogID(登录ID; -1登录失败) sMsg(错误信息. 当iLogID == -1时有效) ----------------------------------------------------------------------*/ void CLIENT_LOGIN(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setLogID(-1); //输入参数不合法,登录失败 ParaList.addMsg("登录主监控守护时输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); ParaList.getSysUserName(g_pShmTable->ClientReqInfo.m_sSysUserName); g_pShmTable->ClientReqInfo.m_iStatus = REQ_CLIENT_LOGIN; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_CLIENT_LOGIN) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setLogID(-1); //time out,failed ParaList.addMsg("登录主监控超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: //SERVER_ACCEPT MAX_CLIENT_NUM SERVER_REJECT if (g_pShmTable->ClientReqInfo.m_iStatus == SERVER_ACCEPT){ ParaList.setLogID(g_pShmTable->ClientReqInfo.m_iIndex); } else if (g_pShmTable->ClientReqInfo.m_iStatus == MAX_CLIENT_NUM) { ParaList.setLogID(-1); ParaList.addMsg("远程守护监控连接达到最大限制!"); } else { ParaList.setLogID(-1); ParaList.addMsg(g_pShmTable->ClientReqInfo.m_sMsgBuf); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
AAA( TPSVCINFO *msg ) { char *sndbuf; sndbuf = msg->data; h_col1 = 0; /* EXEC SQL SELECT col1 INTO :h_col1 FROM ABC ; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 10; sqlstm.arrsiz = 1; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "select col1 into :b0 from ABC "; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )5; sqlstm.selerr = (unsigned short)1; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)256; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = ( void *)&h_col1; sqlstm.sqhstl[0] = (unsigned int )sizeof(int); sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( void *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned int )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if ( sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 ){ printf( "select failed sqlcode = %d\n",sqlca.sqlcode ); tpreturn( TPFAIL, sqlca.sqlcode, NULL, 0, 0 ); } printf( "sqlca.sqlcode = %d, col1 = %d\n", sqlca.sqlcode, h_col1); tpreturn( TPSUCCESS, sqlca.sqlcode, (char *)sndbuf, sizeof(sndbuf), 0 ); }
/* * This function is called by the client. Here, on Server 1 data is * inserted into table 1 and it returns successfully. On Server 2 data * is inserted into table 2, but then it sleeps for 30 seconds then * returns, in order to force a timeout and to make sure that the data * is rolled back in both databases. */ void TXN_FUNC(TPSVCINFO *msg) { DBT data; DBT key; int ret, val, i; DB *db; const char *name; #ifdef SERVER1 i = 0; #else i = 1; #endif db = dbs[i]; name = db_names[i]; val = 1; memset(&key, 0, sizeof(key)); key.data = &val; key.size = sizeof(val); memset(&data, 0, sizeof(data)); data.data = &val; data.size = sizeof(val); if (verbose) { printf("put: key in %s: %i\n", val, db_names[0]); printf("put: data in %s: %i\n", val, db_names[0]); } if ((ret = db->put(db, NULL, &key, &data, 0)) != 0) { if (ret == DB_LOCK_DEADLOCK) goto abort; fprintf(stderr, "%s: %s: %s->put: %s\n", progname, TXN_STRING, name, db_strerror(ret)); goto err; } /* Sleep for 30 seconds to force a timeout error. */ #ifdef SERVER2 sleep(30); #endif tpreturn(TPSUCCESS, 0L, 0, 0L, 0); if (0) { abort: if (verbose) printf("%s: %s: abort\n", progname, TXN_STRING); tpreturn(TPSUCCESS, 1L, 0, 0L, 0); } return; err: tpreturn(TPFAIL, 0L, 0, 0L, 0); }
void read_db1(TPSVCINFO *msg) { int ret, db_num, commit, key_value; DBT key, data; DB *db; db = dbs[0]; memset(&key, 0, sizeof key); memset(&data, 0, sizeof data); commit = 1; db_num = key_value = KEY_VALUE; key.data = &key_value; key.size = sizeof(key_value); data.flags = DB_DBT_MALLOC; /* Insert data into the tables. */ if (verbose) { printf("get: key: %i ", key_value); printf("get: data.\n"); } /* Get data from the table. */ if ((ret = db->get(db, NULL, &key, &data, 0)) != 0) { if (ret == DB_LOCK_DEADLOCK || ret == DB_LOCK_NOTGRANTED) goto abort; fprintf(stderr, "%s: %s: %s->get: %s\n", progname, READ_STRING, db_names[0], db_strerror(ret)); goto err; } if (data.data != NULL) free(data.data); /* Returns a commit or abort command to the client. */ if (verbose) printf("%s: %s: commit\n", progname, READ_STRING); tpreturn(TPSUCCESS, 0L, 0, 0L, 0); if (0) { abort: if (verbose) printf("%s: %s: abort\n", progname, READ_STRING); tpreturn(TPSUCCESS, 1L, 0, 0L, 0); } return; err: tpreturn(TPFAIL, 1L, 0, 0L, 0); }
void write_db1(TPSVCINFO *msg) { int ret, commit, key_value, data_value; DBT key, data; DB *db; db = dbs[0]; memset(&key, 0, sizeof key); memset(&data, 0, sizeof data); commit = 1; key_value = data_value = KEY_VALUE; data.data = &data_value; data.size = sizeof(data_value); key.data = &key_value; key.size = sizeof(key_value); /* Insert data into the tables. */ if (verbose) { printf("put: key: %i ", key_value); printf("put: data: %i\n", data_value); } /* Insert data into the tables. */ if ((ret = db->put(db, NULL, &key, &data, 0)) != 0) { if (ret == DB_LOCK_DEADLOCK || ret == DB_LOCK_NOTGRANTED) goto abort; fprintf(stderr, "%s: %s: %s->put: %s\n", progname, WRITE_STRING, db_names[0], db_strerror(ret)); goto err; } /* Returns a commit or abort command to the client. */ if (verbose) printf("%s: %s: commit\n", progname, WRITE_STRING); tpreturn(TPSUCCESS, 0L, 0, 0L, 0); if (0) { abort: if (verbose) printf("%s: %s: abort\n", progname, WRITE_STRING); tpreturn(TPSUCCESS, 1L, 0, 0L, 0); } return; err: tpreturn(TPFAIL, 1L, 0, 0L, 0); }
/* * This is test service! */ void TESTSVFN (TPSVCINFO *p_svc) { int ret=SUCCEED; char *str = "THIS IS TEST - OK!"; UBFH *p_ub = (UBFH *)p_svc->data; NDRX_LOG(log_debug, "TESTSVFN got call"); /* Just print the buffer */ Bprint(p_ub); if (NULL==(p_ub = (UBFH *)tprealloc((char *)p_ub, 4096))) /* allocate some stuff for more data to put in */ { ret=FAIL; goto out; } if (FAIL==Bchg(p_ub, T_STRING_FLD, 0, (char *)str, 0)) { ret=FAIL; goto out; } out: tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, (char *)p_ub, 0L, 0L); }
void NBFEXAMPLE(TPSVCINFO * svcinfo) { char* buf = svcinfo->data; int rc = 0; char name[16]; long id; int len = 16; rc = btgetattribute(buf, (char*)"name", 0, (char*) name, &len); if(rc == 0) { btlogger((char*) "get name value is %s", name); } len = 0; rc = btgetattribute(buf, (char*)"id", 0, (char*)&id, &len); if(rc == 0) { btlogger((char*) "get id value is %d", id); } btlogger((char*)"remove attr"); rc = btdelattribute(buf, (char*)"name", 0); if(rc == 0) { btlogger((char*) "remove name"); } id = 1234; rc = btsetattribute(&buf, (char*)"id", 0, (char*)&id, sizeof(id)); if(rc == 0) { btlogger((char*) "set id value to 1234"); } tpreturn(TPSUCCESS, 0, buf, strlen(buf), 0); }
void BAR(TPSVCINFO * svcinfo) #endif { test_req_t *req = (test_req_t *) svcinfo->data; test_req_t *resp = (test_req_t *) tpalloc((char*) "X_C_TYPE", (char*) "test_req", 0); product_t *p = products; btlogger_debug( "TxLog %s service %s running", __FUNCTION__, TXTEST_SVC_NAME); resp->status = -1; inject_fault(O_XA_COMMIT, req->txtype); for (p = products; p->id != -1; p++) { if (req->prod == p->id) { int rv; strncpy(req->db, p->dbname, sizeof(req->db)); btlogger_debug("TxLog Service %s %4d: prod=%8s (id=%d) op=%c tx=0x%x data=%s", TXTEST_SVC_NAME, req->id, p->pname, p->id, req->op, req->txtype, req->data); rv = p->access(req, resp); btlogger_debug("TxLog Service %s %4d: resp->status=%d rv=%d", TXTEST_SVC_NAME, req->id, resp->status, rv); break; } } tpreturn(TPSUCCESS, resp->status, (char *) resp, sizeof (test_req_t), 0); }
void TEST4_2ND (TPSVCINFO *p_svc) { int ret=SUCCEED; static double d = 11.66; UBFH *p_ub = (UBFH *)p_svc->data; NDRX_LOG(log_debug, "TESTSVFN got call"); /* Just print the buffer */ Bprint(p_ub); if (NULL==(p_ub = (UBFH *)tprealloc((char *)p_ub, 4096))) /* allocate some stuff for more data to put in */ { ret=FAIL; goto out; } d+=1; if (FAIL==Badd(p_ub, T_DOUBLE_2_FLD, (char *)&d, 0)) { ret=FAIL; goto out; } out: tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, (char *)p_ub, 0L, 0L); }
void NOTRANFAIL(TPSVCINFO *p_svc) { UBFH *p_ub = (UBFH *)p_svc->data; if (tpgetlev()) { NDRX_LOG(log_error, "TESTERROR: SHOULD NOT BE IN TRNASACTION!"); } tpreturn (TPFAIL, 0L, (char *)p_ub, 0L, 0L); }
void FOOAPP(TPSVCINFO * svcinfo) { char* buffer; int sendlen; btlogger((char*) "bar called - svc: %s data %s len: %d flags: %d", svcinfo->name, svcinfo->data, svcinfo->len, svcinfo->flags); sendlen = 15; buffer = tpalloc("X_OCTET", 0, sendlen); strcpy(buffer, "BAR SAYS HELLO"); tpreturn(TPSUCCESS, 0, buffer, sendlen, 0); }
/** * Service entry * @return SUCCEED/FAIL */ void USERREGSV (TPSVCINFO *p_svc) { int ret = SUCCEED; int rsp = 0; Message_t msg; long len; char * buf = p_svc->data; memset(&msg, 0, sizeof(msg)); /* allocate some stuff for more data to put in */ len = tptypes(p_svc->data, NULL, NULL) + 1024; if (NULL==(buf = tprealloc(buf, len))) { TP_LOG(log_error, "Failed reallocate buffer to size %d: %s", len, tpstrerror(tperrno)); ret=FAIL; goto out; } if (SUCCEED != parse_msg(&msg, buf, len)) { TP_LOG(log_error, "Failed to parse msg"); ret=FAIL; goto out; } msg.rsp.rspstatus = 100; strcpy(msg.rsp.rsprspmsg, "User successfully registered"); if(SUCCEED != msg_build(&msg, &buf, &len)) { TP_LOG(log_error, "Failed to build msg"); ret=FAIL; goto out; } out: tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, buf, 0L, 0L); }
/** * Advertise the service. * @param p_svc */ void DOADV(TPSVCINFO *p_svc) { int ret=SUCCEED; UBFH *p_ub = (UBFH *)p_svc->data; /* Advertise test service */ ret=tpadvertise("TESTSVFN", TESTSVFN); tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, (char *)p_ub, 0L, 0L); }
void RUNTX(TPSVCINFO *p_svc) { int first=1; UBFH *p_ub = (UBFH *)p_svc->data; char buf[1024]; p_ub = (UBFH *)tprealloc ((char *)p_ub, Bsizeof (p_ub) + 4096); if (SUCCEED!=Bget(p_ub, T_STRING_FLD, 0, buf, 0)) { NDRX_LOG(log_error, "TESTERROR: Failed to get T_STRING_FLD: %s", Bstrerror(Berror)); tpreturn (TPFAIL, 0L, NULL, 0L, 0L); } if (SUCCEED!=__write_to_tx_file(buf)) { NDRX_LOG(log_error, "TESTERROR: Failed to call __write_to_tx_file()"); tpreturn (TPFAIL, 0L, NULL, 0L, 0L); } /* Return OK */ tpreturn (TPSUCCESS, 0L, (char *)p_ub, 0L, 0L); }
/** * This will check the client id for first & second call, * - odd calls must match with odd client id * - even calls must match the even client id */ void TESTSVFN (TPSVCINFO *p_svc) { int ret=SUCCEED; UBFH *p_ub = (UBFH *)p_svc->data; static int call_num = 0; NDRX_LOG(log_debug, "TESTSVFN got call from client [%s]", p_svc->cltid.clientdata); if (call_num < 2) { strcpy(M_cltid[call_num].clientdata, p_svc->cltid.clientdata); } else { NDRX_LOG(log_debug, "call_num = %d, mod %d, mods [%s] vs [%s]", call_num, call_num %2, M_cltid[call_num %2].clientdata, p_svc->cltid.clientdata); if (0!=strcmp(M_cltid[call_num%2].clientdata, p_svc->cltid.clientdata)) { NDRX_LOG(log_error, "TESTERROR: call_num = %d, mod %d, " "mods [%s] vs [%s] - not equal!", call_num, call_num %2, M_cltid[call_num %2].clientdata, p_svc->cltid.clientdata); FAIL_OUT(ret); } } out: call_num++; tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, (char *)p_ub, 0L, 0L); }
/************************************* * 功能: 同步应答 * * 参数: rval: 处理结果标志 * * rcode:返回代码 * * data: 返回的数据包 * * len: 返回的数据包长度 * * 返回值: * * 无 * **************************************/ int cslreturn_common(int rval,long rcode,char *data,long len) { tpreturn(rval,rcode,data,len,(long)0); return 0; }
/*********************************************************************** 交易: SEND_REMOTEMSG 功能:远程监控发送一个应用程序状态和输出信息到主监控 输入参数: iLogID(登录ID) iHostID(主机ID) iProecessID iProcessCnt cState(进程状态) iMainGuardIndex <sMsg=str_msg>... 返回值: iResult(0-失败, 1-成功) ----------------------------------------------------------------------*/ void SEND_REMOTEMSG(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); //输入参数不合法 ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); //g_pShmTable->ClientReqInfo.m_cState = ParaList.getState(); //strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,ParaList.getBuiltMsg()); strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,sQqstBuf); g_pShmTable->ClientReqInfo.m_iStatus = REQ_SEND_REMOTEMSG; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_SEND_REMOTEMSG) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out,failed ParaList.addMsg("输出消息超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: // CLIENT_LOG_DEAD REMOTEMSG_SENT if (g_pShmTable->ClientReqInfo.m_iStatus == REMOTEMSG_SENT) { ParaList.setResult(1); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD) { ParaList.setResult(0); ParaList.addMsg("client log dead."); } else { ParaList.setResult(0); ParaList.addMsg("Failed. Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
/*********************************************************************** 交易: ACK_COMMAND 功能:返回指令执行后的结果信息(在GET_COMMAND后调用) 输入参数: iLogID(登录ID) iHostID(主机ID) iProcessID(指令操作的进程ID) iOperation(指令动作) (1-start, 2-stop, 3-ChangeStatus, 4-Refresh) iResult(0-失败, 1-成功) 指令的执行情况 sMsg(指令执行返回的文本信息) 返回值: iResult(0-失败, 1-成功) 交易的执行情况 //iMainGuardIndex(当指令为启动指令时,标识远程应用进程在主监控守护主机AppInfo中的下标) sMsg (失败原因) ----------------------------------------------------------------------*/ void ACK_COMMAND(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); //输入参数不合法 ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); g_pShmTable->ClientReqInfo.m_iProcessID = ParaList.getProcessID(); g_pShmTable->ClientReqInfo.m_iResult = ParaList.getResult(); g_pShmTable->ClientReqInfo.m_iOperation = ParaList.getOperation(); strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,ParaList.getMsg()); g_pShmTable->ClientReqInfo.m_iStatus = REQ_ACK_COMMAND; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_ACK_COMMAND) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out,failed ParaList.addMsg("返回指令执行结果超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: // CLIENT_LOG_DEAD ACK_COMMAND_END if (g_pShmTable->ClientReqInfo.m_iStatus == ACK_COMMAND_END) { ParaList.setResult(1); //ParaList.setMainGuardIndex(g_pShmTable->ClientReqInfo.m_iMainGuardIndex); //ParaList.addMsg("已获取到iMainGuardIndex"); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD) { ParaList.setResult(0); ParaList.addMsg("client log dead."); } else { ParaList.setResult(0); ParaList.addMsg("Failed. Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); TWfLog::log(0,"server_client send ACK_COMMAND_END msg:%s",sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
/*********************************************************************** 交易: GET_COMMAND 功能:远程监控客户端获取其需要执行的指令时调用 输入参数: iLogID(登录ID) iHostID(主机ID) 返回值: iResult (0-失败, 1-有操作指令, 2-当前无指令) iOperation (1-start, 2-stop, 3-ChangeStatus, 4-Refresh) iProcessID (指令操作的进程号) iStaffID iPlanID cState sMsg (iResult=0时存放失败信息; ) ----------------------------------------------------------------------*/ void GET_COMMAND(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); DEFINE_QUERY(qry); qry.commit(); qry.close(); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock signal LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); g_pShmTable->ClientReqInfo.m_iStatus = REQ_GET_COMMAND; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_GET_COMMAND) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out ParaList.addMsg("获取指令超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: //REQ_COMMAND_RECV CLIENT_LOG_DEAD REQ_NO_COMMAND if (g_pShmTable->ClientReqInfo.m_iStatus == REQ_COMMAND_RECV){ ParaList.setResult(1); ParaList.setOperation(g_pShmTable->ClientReqInfo.m_iOperation); ParaList.setProcessID(g_pShmTable->ClientReqInfo.m_iProcessID); ParaList.setStaffID(g_pShmTable->ClientReqInfo.m_iStaffID); ParaList.setPlanID(g_pShmTable->ClientReqInfo.m_iPlanID); ParaList.setState(g_pShmTable->ClientReqInfo.m_cState); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD){ ParaList.setResult(0); ParaList.addMsg("Err: CLIENT_LOG_DEAD"); } else if (g_pShmTable->ClientReqInfo.m_iStatus == REQ_NO_COMMAND){ ParaList.setResult(2); } else { ParaList.setResult(0); ParaList.addMsg("Err: Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
void P_GET_TRANSINFO(TPSVCINFO *rqst) { long drawID = 0; int iRet = 0; char swsnaddr[30]; char *allrcvbuf = NULL; char *rcvbuf = NULL; FBFR32 *sendbuf; FBFR32 *recvbuf; char *sendstring; char *sendbuf2=NULL; int iLen = rqst->len; long i; sendstring = new char[iLen]; memset(sendstring,'\0',iLen); sendbuf2 = (char *) tpalloc("STRING", NULL, MAX_CMAMSG_LEN); //char *sendbuf = NULL; long lRecLen = 0; string s_rcvbuff; char cRouteKey[30]; char tmpBuff[30]; memset(swsnaddr,0,sizeof(swsnaddr)); allrcvbuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); //rcvbuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); if ((sendbuf = (FBFR32 *)tpalloc("FML32",NULL,MAX_CMAMSG_LEN)) == NULL) { sprintf(sendbuf2,"<iResult=1><sMsg=sendbuf err>"); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } if ((recvbuf = (FBFR32 *)tpalloc("FML32",NULL,MAX_CMAMSG_LEN)) == NULL) { sprintf(sendbuf2,"<iResult=1><sMsg=recvbuf err>"); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } //sendbuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); memset(sendstring,0,MAX_CMAMSG_LEN); s_rcvbuff.clear(); memcpy(sendstring, rqst->data, iLen); sendstring[iLen] = 0; TrimHeadNull(sendstring,iLen); ::PETRI::P_RECVBUFF.reset(); ::PETRI::P_RECVBUFF.parseBuff(sendstring); drawID = (long) ::PETRI::P_RECVBUFF.getDrawID(); vector<long> transList; transList.clear(); TOCIQuery query (::PETRI::P_DB.getDB()); try { string sql = "SELECT TRANSITION_ID FROM P_TRANSITION_ATTR WHERE DRAW_ID= :DRAWID AND EXE_STATE = 'R'"; query.close(); query.setSQL(sql.c_str()); query.setParameter("DRAWID",drawID); query.open(); while(query.next()) { transList.push_back(query.field(0).asLong()); } query.close(); query.commit(); } catch (TOCIException& toe) { query.close(); query.commit(); sprintf(sendbuf2,"<iResult=1><sMsg=Get Transition of The Draw Error! %s>",toe.getErrMsg()); tpfree(rcvbuf); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } catch (...) { query.close(); query.commit(); sprintf(sendbuf2,"<iResult=1><sMsg=Get Transition of The Draw Error!> other error"); tpfree(rcvbuf); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); }; if (0 == transList.size()){ memset(sendbuf2,0,MAX_CMAMSG_LEN); tpfree(rcvbuf); tpfree((char *)sendbuf); query.commit(); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } for (int idx = 0;idx <transList.size();idx ++ ) { try { string sql = "select b.wsnaddr from P_TRANSITION_HOST_INFO a, WF_HOST_WSNADDR b where a.wsnaddr_id = b.wsnaddr_id and a.transition_id = :TRANSID"; query.close(); query.setSQL(sql.c_str()); query.setParameter("TRANSID",transList[idx]); query.open(); while(query.next()) { strcpy( swsnaddr,query.field(0).asString() ); } query.close(); string sql2 = "select HOST_AREA||HOST_DOMAIN from P_TRANSITION_HOST_INFO where transition_id = :TRANSID"; query.close(); query.setSQL(sql2.c_str()); query.setParameter("TRANSID",transList[idx]); query.open(); while(query.next()) { strcpy( tmpBuff,query.field(0).asString()); } query.close(); query.commit(); }catch (TOCIException & toe){ sprintf(sendbuf2,"<iResult=1><lTransitionID=%ld><sMsg=get WSNADDR err:%s>",transList[idx],toe.getErrMsg()); query.close(); query.commit(); } catch(...) { sprintf(sendbuf2,"<iResult=1><lTransitionID=%ld><sMsg=get WSNADDR other err>",transList[idx]); query.close(); query.commit(); } if(0 == swsnaddr[0]){ sprintf(sendbuf2,"<iResult=1><lTransitionID=%ld><sMsg=Transition have no WSNADDR >",transList[idx]); } /* iRet = setenv("WSNADDR",swsnaddr,1); if( -1 == iRet){ sprintf(rcvbuf,"<iResult=1><lTransitionID=%ld><sMsg=set WSNADDR fail>",transList[idx]); }; */ sprintf(sendbuf2,"<lTransitionID=%ld>%s\0",transList[idx],sendstring); strcpy(cRouteKey, tmpBuff); //iRet = cslfput(&sendbuf,ROUTE_KEY,0,cRouteKey); //iRet = Fchg32(&sendbuf,ROUTE_KEY,0,(char*)cRouteKey,(FLDLEN32)10); strcpy(cRouteKey, tmpBuff); iRet = Fchg32(sendbuf,ROUTE_KEY,0,(char *)cRouteKey,0); //iRet = Fchg32((FBFR32*)(&sendbuf),ROUTE_KEY,0,(char*)cRouteKey,(FLDLEN32)20); if(iRet < 0) { userlog("cRouteKey=[%s],iRet=[%d]",cRouteKey,iRet); sprintf(sendbuf2,"<iResult=1><sMsg=cslfput to ROUTE_KEY is error>\0"); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } iRet = Fchg32(sendbuf,SEND_STRING,0,(char *)sendbuf2,0); if(iRet < 0) { userlog("sendstring=[%s],iRet=[%d]",sendstring,iRet); sprintf(sendbuf2,"<iResult=1><sMsg=cslfput to SEND_STRING is error>\0"); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } iRet = tpcall("P_G_T_LOCAL",(char *)sendbuf,0,(char **)&recvbuf,&lRecLen,0); if (iRet < 0){ sprintf(sendbuf2,"<iResult=1><lTransitionID=%ld><sMsg=call localsvc err,tperrno:%d>\0",transList[idx],tperrno); } userlog(sendbuf2); s_rcvbuff = s_rcvbuff + "$" + sendbuf2; } sprintf (allrcvbuf,"%s\0",s_rcvbuff.c_str()); tpfree((char *)sendbuf); tpfree((char *)rcvbuf); tpreturn(TPSUCCESS,0L,allrcvbuf,MAX_CMAMSG_LEN,0L); }
void P_CHANGE_STATUS(TPSVCINFO *rqst) { long ltransID=0; int iRet=0; char swsnaddr[30]; FBFR32 *sendbuf; FBFR32 *recvbuf; char *sendstring; char *sendbuf2=NULL; int iLen = rqst->len; long i; sendstring = new char[iLen]; memset(sendstring,'\0',iLen); sendbuf2 = (char *) tpalloc("STRING", NULL, MAX_CMAMSG_LEN); //char *rcvbuf = NULL; //char *sendbuf = NULL; long lRecLen = 0; char cRouteKey[30]; char tmpBuff[30]; memset(swsnaddr,0,sizeof(swsnaddr)); //rcvbuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); //sendbuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); if ((sendbuf = (FBFR32 *)tpalloc("FML32",NULL,MAX_CMAMSG_LEN)) == NULL) { sprintf(sendbuf2,"<iResult=1><sMsg=sendbuf err>"); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } if ((recvbuf = (FBFR32 *)tpalloc("FML32",NULL,MAX_CMAMSG_LEN)) == NULL) { sprintf(sendbuf2,"<iResult=1><sMsg=recvbuf err>"); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } //int iLen = rqst->len; memcpy(sendstring, rqst->data, iLen); sendstring[iLen] = 0; TrimHeadNull(sendstring,iLen); ::PETRI::P_RECVBUFF.reset(); ::PETRI::P_RECVBUFF.parseBuff(sendstring); ltransID = ::PETRI::P_RECVBUFF.getTransitionID(); TOCIQuery query (::PETRI::P_DB.getDB()); try { string sql = "select b.wsnaddr from P_TRANSITION_HOST_INFO a, WF_HOST_WSNADDR b where a.wsnaddr_id = b.wsnaddr_id and a.transition_id = :TRANSID"; query.close(); query.setSQL(sql.c_str()); query.setParameter("TRANSID",ltransID); query.open(); while(query.next()) { strcpy( swsnaddr,query.field(0).asString() ); } query.close(); string sql2 = "select HOST_AREA||HOST_DOMAIN from P_TRANSITION_HOST_INFO where transition_id = :TRANSID"; query.close(); query.setSQL(sql2.c_str()); query.setParameter("TRANSID",ltransID); query.open(); while(query.next()) { strcpy( tmpBuff,query.field(0).asString()); } query.close(); query.commit(); }catch (TOCIException & toe){ sprintf(sendbuf2,"<iResult=1><sMsg=get WSNADDR err:%s>",toe.getErrMsg()); query.close(); query.commit(); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } catch(...) { sprintf(sendbuf2,"<iResult=1><sMsg=get WSNADDR other err>"); query.close(); query.commit(); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } if(0 == swsnaddr[0]){ sprintf(sendbuf2,"<iResult=1><sMsg=Transition have no WSNADDR >"); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } /* iRet = setenv("WSNADDR",swsnaddr,1); if( -1 == iRet){ sprintf(rcvbuf,"<iResult=1><sMsg=set WSNADDR fail>"); tpfree(sendbuf); tpreturn(TPSUCCESS,0L,rcvbuf,strlen(rcvbuf),0L); }; */ strcpy(cRouteKey, tmpBuff); //iRet = Fchg32(&sendbuf,ROUTE_KEY,0,(char*)cRouteKey,(FLDLEN32)10); iRet = Fchg32(sendbuf,ROUTE_KEY,0,(char *)cRouteKey,0); if(iRet < 0) { userlog("cRouteKey=[%s],iRet=[%d]",cRouteKey,iRet); sprintf(sendbuf2,"<iResult=1><sMsg=cslfput to ROUTE_KEY is error>"); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } iRet = Fchg32(sendbuf,SEND_STRING,0,(char *)sendstring,0); if(iRet < 0) { userlog("sendstring=[%s],iRet=[%d]",sendstring,iRet); sprintf(sendbuf2,"<iResult=1><sMsg=cslfput to SEND_STRING is error>"); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } iRet = tpcall("P_C_S_LOCAL",(char *)sendbuf,0,(char **)&recvbuf,&lRecLen,0); if (iRet < 0){ sprintf(sendbuf2,"<iResult=1><sMsg=call localsvc err,tperrno:%d>",tperrno); tpfree((char *)sendbuf); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); } tpfree((char *)sendbuf); sprintf(sendbuf2,"<iResult=0><sMsg=you tpcall success>"); tpreturn(TPSUCCESS,0L,sendbuf2,MAX_CMAMSG_LEN,0L); }
void P_C_S_LOCAL(TPSVCINFO *rqst) { char *sQqstBuf; //sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); //int iLen = rqst->len; //memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iRet = 0; FBFR32 *recvbuf = NULL; //recvbuf=(FBFR32 *) tpalloc("FML32",NULL,MAX_CMAMSG_LEN); FBFR32 *sendbuf = NULL; sendbuf=(FBFR32 *)tpalloc("FML32",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; //memcpy(sQqstBuf, rqst->data, iLen); //memcpy(recvbuf, rqst->data, iLen); recvbuf=(FBFR32 *)rqst->data; Fget32(recvbuf, SEND_STRING, 0, sQqstBuf, 0); //sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); ::PETRI::P_CMDMSG->mtype = (long)pid; sprintf(::PETRI::P_CMDMSG->mbody,"<iNeedAck=1>%s\0",sQqstBuf); while ( ::PETRI::P_MQ.ackMQ.receive(pid) ) { userlog("%ld,%s\n",::PETRI::P_ACKMSG->mtype,::PETRI::P_ACKMSG->mbody); }; if(!(::PETRI::P_MQ.cmdMQ.send())) { tpfree((char *)recvbuf); memset(sQqstBuf,0,MAX_CMAMSG_LEN); strcpy(sQqstBuf,"<iResult=1><sMsg=MQ Send Fail>"); iRet = Fchg32(recvbuf,SEND_STRING,0,(char *)sQqstBuf,0); if( iRet > 0 ) tpreturn(TPSUCCESS,0L,(char *)recvbuf,strlen(sQqstBuf),0L); else userlog("P_F_LOCAL Error sQqstBuf!"); } int iTime=0; bool ifAck = false; while ( iTime++ < WAIT_TIME ) { if (::PETRI::P_MQ.ackMQ.receive(pid)) { ifAck = true; break; } sleep(1); } if (ifAck) { strcpy(sQqstBuf,::PETRI::P_ACKMSG->mbody); userlog(::PETRI::P_ACKMSG->mbody); } /* else { while ( ::PETRI::P_MQ.cmdMQ.receive(pid) ){}; strcpy(sQqstBuf,"<iResult=1><sMsg=schd order send OK,wait result timeOut>"); } */ //strcpy(sQqstBuf,"OK"); //tpfree((char *)recvbuf); char sTemp[10]="OK"; //iRet = Fchg32(recvbuf,SEND_STRING,0,(char *)sQqstBuf,0); iRet = Fchg32(sendbuf,SEND_STRING,0,(char *)sTemp,0); userlog("iRet=[%d]",iRet); tpreturn(TPSUCCESS,0L,(char *)sendbuf,MAX_CMAMSG_LEN,0); //tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
void login(TPSVCINFO *rqst) { tpreturn(TPSUCCESS,0,rqst->data,0L,0); }