oracle linux proc 多執行緒連線庫 程式碼示例
阿新 • • 發佈:2019-01-30
#include "sqlca.h" #include "sqlda.h" #define SQLCODE sqlca.sqlcode #define SQLNOTFOUND 1403 #define SQLCODE sqlca.sqlcode #define SQLERRMSG sqlca.sqlerrm.sqlerrmc static int g_db_debug_switch = 0; #define G_DB_DEBUG(format,...) \ if (g_db_debug_switch ){ \ printf(format, ##__VA_ARGS__);\ } //bool CDBOperation::OpenDB(const char *user, const char *passwd, const char *db) bool CDBOperation::OpenDB( const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket) { (void)host; (void)port; (void)unix_socket; m_pDBAccess = (void *)malloc(sizeof(sql_context)); struct sqlca sqlca; EXEC SQL BEGIN DECLARE SECTION; sql_context *DBcontest = (sql_context *)m_pDBAccess; VARCHAR username[32]={0};// = user; VARCHAR password[32]={0}; // = passwd; VARCHAR dbname[32]={0}; // = db; EXEC SQL END DECLARE SECTION; strcpy((char *)username.arr, user); username.len = strlen((char *)username.arr); strcpy((char *)password.arr, passwd); password.len = strlen((char *)password.arr); strcpy((char *)dbname.arr, db); dbname.len = strlen((char *)dbname.arr); //一定要順序來 EXEC SQL ENABLE THREADS; EXEC SQL CONTEXT ALLOCATE :*DBcontest; EXEC SQL CONTEXT USE :*DBcontest; EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; ////////////////////////////////////////////<span style="font-family: Arial, Helvetica, sans-serif;"> </span> if(SQLCODE) { G_DB_DEBUG("%d | %s | open db sql_init fail %s %s %d %s\n",pthread_self(), __FUNCTION__, user, db, SQLCODE,sqlca.sqlerrm.sqlerrmc); EXEC SQL CONTEXT FREE :*DBcontest; free(m_pDBAccess); m_pDBAccess = NULL; return false; } G_DB_DEBUG("%d | %s | open db ok %s %s %d %s\n",pthread_self(), __FUNCTION__, user, db, SQLCODE,sqlca.sqlerrm.sqlerrmc); return true; } void CDBOperation::CloseDB() { struct sqlca sqlca; EXEC SQL BEGIN DECLARE SECTION; sql_context *DBcontest = (sql_context *)m_pDBAccess; EXEC SQL END DECLARE SECTION; EXEC SQL CONTEXT USE :*DBcontest; //EXEC SQL ROLLBACK WORK RELEASE; EXEC SQL COMMIT WORK RELEASE; EXEC SQL CONTEXT FREE :*DBcontest; if(SQLCODE) { G_DB_DEBUG("%d | %s | Close oracle fail[%d][%s]/n",pthread_self(), __FUNCTION__, sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); } else { G_DB_DEBUG("%d | %s | close db %d\n",pthread_self(), __FUNCTION__, time(NULL) - survival_time ); } free(m_pDBAccess); m_pDBAccess = NULL; } </pre><pre name="code" class="cpp">int CDBOperation::UpdateBankWorkKey(char* pMerchantID, char* pTermID, char* pPinKey, char* pMacKey, char* pBatchNo) { struct sqlca sqlca; EXEC SQL BEGIN DECLARE SECTION; sql_context *DBcontest = (sql_context *)m_pDBAccess; char szBankMacKey[48]={0}; char szBankPInKey[48]={0}; char szTerminalID_41[48]={0}; char szMerchantID_42[48]={0}; char szBatchNo[48]={0}; char szSql[512]={0}; int nRet; EXEC SQL END DECLARE SECTION; EXEC SQL CONTEXT USE :*DBcontest;//這個在每個函式裡必須有 strcpy(szBankMacKey, pMacKey); strcpy(szBankPInKey, pPinKey); strcpy(szTerminalID_41, pTermID); strcpy(szMerchantID_42, pMerchantID); EXEC SQL UPDATE tab_platkey SET MacKey=:szBankMacKey, PinKey=:szBankPInKey, SignTime=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') WHERE PlatTermNo=:szTerminalID_41 AND PlatMerchantNo=:szMerchantID_42; if (SQLCODE){ sprintf(szSql, "UPDATE tab_platkey SET MacKey=:'%s', PinKey=:'%s', SignTime=:to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') WHERE PlatTermNo=:'%s' AND PlatMerchantNo=:'%s'", pMacKey,pPinKey, pTermID,pMerchantID); G_DB_DEBUG("%d | %s | %s \n",pthread_self(), __FUNCTION__, szSql); return -1; } strcpy(szBatchNo, pBatchNo); EXEC SQL UPDATE tab_platmerterm SET BatchNo =:szBatchNo WHERE PlatTermNo =:szTerminalID_41 AND PlatMerchantID =:szMerchantID_42; if (SQLCODE){ sprintf(szSql, "UPDATE tab_platmerterm SET BatchNo =:'%s' WHERE PlatTermNo =:'%s' AND PlatMerchantID =:'%s'", pBatchNo, pTermID,pMerchantID); G_DB_DEBUG("%d | %s | %s\n",pthread_self(), __FUNCTION__, szSql); return -1; } EXEC SQL COMMIT; return 0; } proc -lclntsh parse=no THREADS=YES code=cpp cpp_suffix=cpp iname=DBOperation.pc