From 557df3459867ff12671ad9d0f3aa733d36bf6ed9 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Thu, 15 Dec 2022 15:13:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=B4=A6=E6=88=B7?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=B2=E6=AD=A2=E9=87=8D=E5=A4=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/HGPdtToolDb/HGPdtToolDb.cpp | 17 +- db/HGPdtToolDb/HGPdtToolDb.def | 1 + db/HGPdtToolDb/HGPdtToolDb.h | 17 +- db/HGPdtToolDb/HGPdtToolDb.vcxproj | 4 +- db/HGPdtToolDb/HGPdtToolDbImpl.cpp | 293 ++++++++++++++++++++++++- db/HGPdtToolDb/HGPdtToolDbImpl.hpp | 22 +- db/HGPdtToolDbTest/HGPdtToolDbTest.cpp | 8 +- db/database_cfg.txt | 2 +- 8 files changed, 340 insertions(+), 24 deletions(-) diff --git a/db/HGPdtToolDb/HGPdtToolDb.cpp b/db/HGPdtToolDb/HGPdtToolDb.cpp index 065f327..c3e0290 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.cpp +++ b/db/HGPdtToolDb/HGPdtToolDb.cpp @@ -2,8 +2,8 @@ #include "HGPdtToolDbImpl.hpp" #include "base/HGInc.h" -HGResult HGAPI HGPdtToolDb_CreateUserMgr(const HGChar* host, HGUShort port, - const HGChar* userName, const HGChar* pwd, HGPdtToolDbUserMgr* userMgr) +HGResult HGAPI HGPdtToolDb_CreateUserMgr(const HGChar* host, HGUShort port, const HGChar* userName, const HGChar* pwd, + HGPdtToolDbUserEventFunc func, HGPointer param, HGPdtToolDbUserMgr* userMgr) { if (NULL == userMgr) { @@ -11,7 +11,7 @@ HGResult HGAPI HGPdtToolDb_CreateUserMgr(const HGChar* host, HGUShort port, } HGPdtToolDbUserMgrImpl* userMgrImpl = new HGPdtToolDbUserMgrImpl; - HGResult ret = userMgrImpl->Create(host, port, userName, pwd); + HGResult ret = userMgrImpl->Create(host, port, userName, pwd, func, param); if (HGBASE_ERR_OK != ret) { delete userMgrImpl; @@ -62,6 +62,17 @@ HGResult HGAPI HGPdtToolDb_GetUserName(HGPdtToolDbUserMgr userMgr, HGChar* userN return userMgrImpl->GetUserName(userName, maxLen); } +HGResult HGAPI HGPdtToolDb_RefuseUser(HGPdtToolDbUserMgr userMgr, HGChar* userName) +{ + if (NULL == userMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGPdtToolDbUserMgrImpl* userMgrImpl = (HGPdtToolDbUserMgrImpl*)userMgr; + return userMgrImpl->RefuseUser(userName); +} + HGResult HGAPI HGPdtToolDb_GetUserList(HGPdtToolDbUserMgr userMgr, HGChar** userNameList, HGUInt maxLen, HGUInt* count) { if (NULL == userMgr) diff --git a/db/HGPdtToolDb/HGPdtToolDb.def b/db/HGPdtToolDb/HGPdtToolDb.def index 5057f4e..c3ce63e 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.def +++ b/db/HGPdtToolDb/HGPdtToolDb.def @@ -6,6 +6,7 @@ HGPdtToolDb_CreateUserMgr HGPdtToolDb_DestroyUserMgr HGPdtToolDb_GetUserType HGPdtToolDb_GetUserName +HGPdtToolDb_RefuseUser HGPdtToolDb_GetUserList HGPdtToolDb_ReleaseUserList HGPdtToolDb_CreateUser diff --git a/db/HGPdtToolDb/HGPdtToolDb.h b/db/HGPdtToolDb/HGPdtToolDb.h index 25225fb..cb2f524 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.h +++ b/db/HGPdtToolDb/HGPdtToolDb.h @@ -5,6 +5,13 @@ #include "base/HGBaseErr.h" #include "HGPdtToolDbErr.h" +/* 账户在其他地方登录 */ +#define HGPDTTOOLDB_USEREVENT_CONFLICT 1L +/* 网络连接断开 */ +#define HGPDTTOOLDB_USEREVENT_DISCONNECT 2L +/* 被管理员账户强制下线 */ +#define HGPDTTOOLDB_USEREVENT_REFUSE 3L + /* 管理员账户 */ #define HGPDTTOOLDB_USERTYPE_ROOT 1L /* 普通账户 */ @@ -95,9 +102,12 @@ HG_DECLARE_HANDLE(HGPdtToolDbUserMgr); HG_DECLARE_HANDLE(HGPdtToolDbDevice); +/* 用户事件 */ +typedef void (HGAPI* HGPdtToolDbUserEventFunc)(HGPdtToolDbUserMgr userMgr, HGUInt event, HGPointer param); + /* 登录 */ -HGEXPORT HGResult HGAPI HGPdtToolDb_CreateUserMgr(const HGChar *host, HGUShort port, - const HGChar *userName, const HGChar *pwd, HGPdtToolDbUserMgr *userMgr); +HGEXPORT HGResult HGAPI HGPdtToolDb_CreateUserMgr(const HGChar *host, HGUShort port, const HGChar *userName, const HGChar *pwd, + HGPdtToolDbUserEventFunc func, HGPointer param, HGPdtToolDbUserMgr *userMgr); /* 登出 */ HGEXPORT HGResult HGAPI HGPdtToolDb_DestroyUserMgr(HGPdtToolDbUserMgr userMgr); @@ -108,6 +118,9 @@ HGEXPORT HGResult HGAPI HGPdtToolDb_GetUserType(HGPdtToolDbUserMgr userMgr, HGUI /* 获取当前账户名称 */ HGEXPORT HGResult HGAPI HGPdtToolDb_GetUserName(HGPdtToolDbUserMgr userMgr, HGChar *userName, HGUInt maxLen); +/* 强制某个账户下线,需要管理员账户才能调用 */ +HGEXPORT HGResult HGAPI HGPdtToolDb_RefuseUser(HGPdtToolDbUserMgr userMgr, HGChar* userName); + /* 获取账户列表,需要管理员账户才能调用 */ HGEXPORT HGResult HGAPI HGPdtToolDb_GetUserList(HGPdtToolDbUserMgr userMgr, HGChar **userNameList, HGUInt maxLen, HGUInt* count); diff --git a/db/HGPdtToolDb/HGPdtToolDb.vcxproj b/db/HGPdtToolDb/HGPdtToolDb.vcxproj index e082917..a5544a8 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.vcxproj +++ b/db/HGPdtToolDb/HGPdtToolDb.vcxproj @@ -111,8 +111,8 @@ true false HGPdtToolDb.def - libmysql.lib;%(AdditionalDependencies) - ../lib/x86;%(AdditionalLibraryDirectories) + libmysql.lib;HGBase.lib;%(AdditionalDependencies) + ../lib/x86;../../../sdk/lib/win/x86/Release;%(AdditionalLibraryDirectories) diff --git a/db/HGPdtToolDb/HGPdtToolDbImpl.cpp b/db/HGPdtToolDb/HGPdtToolDbImpl.cpp index 08d4022..02b4973 100644 --- a/db/HGPdtToolDb/HGPdtToolDbImpl.cpp +++ b/db/HGPdtToolDb/HGPdtToolDbImpl.cpp @@ -102,6 +102,16 @@ HGPdtToolDbUserMgrImpl::HGPdtToolDbUserMgrImpl() { m_sql = NULL; m_userName.clear(); + m_connectId = -1; + m_func = NULL; + m_param = NULL; + m_valid = HGFALSE; + + m_lock = NULL; + m_event = NULL; + m_stopThread = HGFALSE; + m_thread = NULL; + m_deviceList.clear(); } @@ -110,7 +120,8 @@ HGPdtToolDbUserMgrImpl::~HGPdtToolDbUserMgrImpl() } -HGResult HGPdtToolDbUserMgrImpl::Create(const HGChar* host, HGUShort port, const HGChar* userName, const HGChar* pwd) +HGResult HGPdtToolDbUserMgrImpl::Create(const HGChar* host, HGUShort port, const HGChar* userName, const HGChar* pwd, + HGPdtToolDbUserEventFunc func, HGPointer param) { if (NULL != m_sql) { @@ -160,8 +171,30 @@ HGResult HGPdtToolDbUserMgrImpl::Create(const HGChar* host, HGUShort port, const return HGBASE_ERR_FAIL; } + int connectId = GetConnectId(sql); + if (-1 == connectId) + { + mysql_close(sql); + return HGBASE_ERR_FAIL; + } + + if (!SetUserLoginInfo(sql, userName, connectId, userName)) + { + mysql_close(sql); + return HGBASE_ERR_FAIL; + } + m_sql = sql; m_userName = userName; + m_connectId = connectId; + m_func = func; + m_param = param; + m_valid = HGTRUE; + + HGBase_CreateLock(&m_lock); + HGBase_CreateEvent(HGTRUE, HGFALSE, &m_event); + m_stopThread = HGFALSE; + HGBase_OpenThread(ThreadFunc, this, &m_thread); return HGBASE_ERR_OK; } @@ -172,9 +205,22 @@ HGResult HGPdtToolDbUserMgrImpl::Destroy() return HGBASE_ERR_FAIL; } + m_stopThread = HGTRUE; + HGBase_SetEvent(m_event); + HGBase_CloseThread(m_thread); + m_thread = NULL; + HGBase_DestroyEvent(m_event); + m_event = NULL; + HGBase_DestroyLock(m_lock); + m_lock = NULL; + mysql_close(m_sql); m_sql = NULL; m_userName.clear(); + m_connectId = -1; + m_func = NULL; + m_param = NULL; + m_valid = HGFALSE; return HGBASE_ERR_OK; } @@ -217,9 +263,47 @@ HGResult HGPdtToolDbUserMgrImpl::GetUserName(HGChar* userName, HGUInt maxLen) return HGBASE_ERR_OK; } +HGResult HGPdtToolDbUserMgrImpl::RefuseUser(HGChar* userName) +{ + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + + if (NULL == userName || 0 == *userName) + { + return HGBASE_ERR_INVALIDARG; + } + + HGUInt userType = 0; + GetUserType(&userType); + if (HGPDTTOOLDB_USERTYPE_ROOT != userType) + { + return HGBASE_ERR_ACCESSDENIED; + } + + if (0 == strcmp(userName, "root")) + { + return HGBASE_ERR_FAIL; + } + + if (!SetUserLoginInfo(m_sql, userName, m_connectId, m_userName)) + { + return HGBASE_ERR_FAIL; + } + + return HGBASE_ERR_OK; +} + HGResult HGPdtToolDbUserMgrImpl::GetUserList(HGChar** userNameList, HGUInt maxLen, HGUInt* count) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -287,7 +371,10 @@ HGResult HGPdtToolDbUserMgrImpl::ReleaseUserList(HGChar** userNameList, HGUInt c HGResult HGPdtToolDbUserMgrImpl::CreateUser(const HGChar* userName, const HGChar* defPwd) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -341,7 +428,10 @@ HGResult HGPdtToolDbUserMgrImpl::CreateUser(const HGChar* userName, const HGChar HGResult HGPdtToolDbUserMgrImpl::DestroyUser(const HGChar* userName) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -395,7 +485,10 @@ HGResult HGPdtToolDbUserMgrImpl::DestroyUser(const HGChar* userName) HGResult HGPdtToolDbUserMgrImpl::SetPassword(const HGChar* userName, const HGChar* pwd) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -420,7 +513,10 @@ HGResult HGPdtToolDbUserMgrImpl::SetPassword(const HGChar* userName, const HGCha HGResult HGPdtToolDbUserMgrImpl::ModifyPassword(const HGChar* oldPwd, const HGChar* newPwd) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -448,7 +544,10 @@ HGResult HGPdtToolDbUserMgrImpl::ModifyPassword(const HGChar* oldPwd, const HGCh HGResult HGPdtToolDbUserMgrImpl::UploadFile(const HGChar* tag, const HGChar* fileName) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -546,7 +645,10 @@ HGResult HGPdtToolDbUserMgrImpl::UploadFile(const HGChar* tag, const HGChar* fil HGResult HGPdtToolDbUserMgrImpl::DownloadFile(const HGChar* tag, const HGChar* fileName) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -614,7 +716,10 @@ HGResult HGPdtToolDbUserMgrImpl::DownloadFile(const HGChar* tag, const HGChar* f HGResult HGPdtToolDbUserMgrImpl::Export(const HGChar* xlsPath) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -759,7 +864,10 @@ HGResult HGPdtToolDbUserMgrImpl::Export(const HGChar* xlsPath) HGResult HGPdtToolDbUserMgrImpl::GetConfig(const HGChar* key, HGChar* value, HGUInt maxLen) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -810,7 +918,10 @@ HGResult HGPdtToolDbUserMgrImpl::GetConfig(const HGChar* key, HGChar* value, HGU HGResult HGPdtToolDbUserMgrImpl::SetConfig(const HGChar* key, const HGChar* value) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -842,7 +953,10 @@ HGResult HGPdtToolDbUserMgrImpl::SetConfig(const HGChar* key, const HGChar* valu HGResult HGPdtToolDbUserMgrImpl::OpenDevice(const HGChar* sn, class HGPdtToolDbDeviceImpl** deviceImpl) { - if (NULL == m_sql) + HGBase_EnterLock(m_lock); + HGBool valid = m_valid; + HGBase_LeaveLock(m_lock); + if (NULL == m_sql || !valid) { return HGBASE_ERR_FAIL; } @@ -877,6 +991,44 @@ HGResult HGPdtToolDbUserMgrImpl::OpenDevice(const HGChar* sn, class HGPdtToolDbD return HGBASE_ERR_OK; } +void HGAPI HGPdtToolDbUserMgrImpl::ThreadFunc(HGThread thread, HGPointer param) +{ + HGPdtToolDbUserMgrImpl* p = (HGPdtToolDbUserMgrImpl*)param; + while (!p->m_stopThread) + { + HGUInt event = 0; + + int connectId; + std::string takeUserName; + bool ret = GetUserLoginInfo(p->m_sql, p->m_userName.c_str(), connectId, takeUserName); + if (!ret) + { + event = HGPDTTOOLDB_USEREVENT_DISCONNECT; + } + else if (takeUserName == "root" && p->m_userName != takeUserName) + { + event = HGPDTTOOLDB_USEREVENT_REFUSE; + } + else if (connectId != p->m_connectId) + { + event = HGPDTTOOLDB_USEREVENT_CONFLICT; + } + + if (0 != event) + { + HGBase_EnterLock(p->m_lock); + p->m_valid = HGFALSE; + HGBase_LeaveLock(p->m_lock); + + if (NULL != p->m_func) + p->m_func((HGPdtToolDbUserMgr)p, event, p->m_param); + break; + } + + HGBase_WaitEventTimeout(p->m_event, 1000); + } +} + void HGPdtToolDbUserMgrImpl::RemoveDevice(class HGPdtToolDbDeviceImpl* deviceImpl) { std::list::iterator iter; @@ -953,6 +1105,75 @@ std::string HGPdtToolDbUserMgrImpl::GetAuthString(MYSQL* sql, const HGChar* pwd) return authString; } +int HGPdtToolDbUserMgrImpl::GetConnectId(MYSQL* sql) +{ + assert(NULL != sql); + + int connId = -1; + char sqlCmd[1024]; + sprintf(sqlCmd, "select connection_id();"); + int ret = mysql_query(sql, sqlCmd); + if (0 == ret) + { + MYSQL_RES* sqlRes = mysql_use_result(sql); + if (NULL != sqlRes) + { + MYSQL_ROW row = mysql_fetch_row(sqlRes); + if (NULL != row && NULL != row[0]) + connId = atoi(row[0]); + mysql_free_result(sqlRes); + } + } + + return connId; +} + +bool HGPdtToolDbUserMgrImpl::SetUserLoginInfo(MYSQL* sql, const HGChar* userName, int connectId, const std::string& takeUserName) +{ + assert(NULL != sql); + assert(NULL != userName && 0 != *userName); + assert(-1 != connectId); + assert(!takeUserName.empty()); + + char sqlCmd[1024]; + sprintf(sqlCmd, "update user_list set connect_id = %d, take_user = '%s' where user = '%s';", + connectId, takeUserName.c_str(), userName); + int ret = mysql_query(sql, sqlCmd); + return (0 == ret) ? true : false; +} + +bool HGPdtToolDbUserMgrImpl::GetUserLoginInfo(MYSQL* sql, const HGChar* userName, int& connectId, std::string& takeUserName) +{ + assert(NULL != sql); + assert(NULL != userName && 0 != *userName); + connectId = -1; + takeUserName.clear(); + + char sqlCmd[1024]; + sprintf(sqlCmd, "select connect_id, take_user from user_list where user = '%s';", userName); + int ret = mysql_query(sql, sqlCmd); + if (0 != ret) + { + return false; + } + + MYSQL_RES* sqlRes = mysql_use_result(sql); + if (NULL != sqlRes) + { + MYSQL_ROW row = mysql_fetch_row(sqlRes); + if (NULL != row) + { + assert(NULL != row[0] && NULL != row[1]); + connectId = atoi(row[0]); + takeUserName = row[1]; + } + + mysql_free_result(sqlRes); + } + + return true; +} + int HGPdtToolDbUserMgrImpl::CreateFileTable(MYSQL* sql) { assert(NULL != sql); @@ -1109,6 +1330,14 @@ HGPdtToolDbDeviceImpl::~HGPdtToolDbDeviceImpl() HGResult HGPdtToolDbDeviceImpl::GetCurrEntry(HGUInt* entryName) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + if (NULL == entryName) { return HGBASE_ERR_INVALIDARG; @@ -1143,6 +1372,14 @@ HGResult HGPdtToolDbDeviceImpl::GetCurrEntry(HGUInt* entryName) HGResult HGPdtToolDbDeviceImpl::SetCurrEntry(HGUInt entryName) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + if (0 != entryName && 0xFFFFFFFF != entryName) { const HGChar* entryNameStr = GetEntryNameStr(entryName); @@ -1161,6 +1398,14 @@ HGResult HGPdtToolDbDeviceImpl::SetCurrEntry(HGUInt entryName) HGResult HGPdtToolDbDeviceImpl::GetEntryStatus(HGUInt entryName, HGUInt* entryStatus) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + if (NULL == entryStatus) { return HGBASE_ERR_INVALIDARG; @@ -1202,6 +1447,14 @@ HGResult HGPdtToolDbDeviceImpl::GetEntryStatus(HGUInt entryName, HGUInt* entrySt HGResult HGPdtToolDbDeviceImpl::SetEntryStatus(HGUInt entryName, HGUInt entryStatus) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + if (entryStatus > HGPDTTOOLDB_ENTRYSTATUS_PASS) { return HGBASE_ERR_INVALIDARG; @@ -1248,6 +1501,14 @@ HGResult HGPdtToolDbDeviceImpl::SetEntryStatus(HGUInt entryName, HGUInt entrySta HGResult HGPdtToolDbDeviceImpl::GetEntryExcepDesc(HGUInt entryName, HGChar* excepDesc, HGUInt maxLen) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + if (NULL == excepDesc || 0 == maxLen) { return HGBASE_ERR_INVALIDARG; @@ -1301,6 +1562,14 @@ HGResult HGPdtToolDbDeviceImpl::GetEntryExcepDesc(HGUInt entryName, HGChar* exce HGResult HGPdtToolDbDeviceImpl::SetEntryExcepDesc(HGUInt entryName, const HGChar* excepDesc) { + HGBase_EnterLock(m_userMgr->m_lock); + HGBool valid = m_userMgr->m_valid; + HGBase_LeaveLock(m_userMgr->m_lock); + if (NULL == m_userMgr->m_sql || !valid) + { + return HGBASE_ERR_FAIL; + } + const HGChar* entryNameStr = GetEntryNameStr(entryName); const HGChar* tableName = GetDescTableName(entryName); if (NULL == entryNameStr || NULL == tableName) diff --git a/db/HGPdtToolDb/HGPdtToolDbImpl.hpp b/db/HGPdtToolDb/HGPdtToolDbImpl.hpp index 8f4cf0e..66e2eda 100644 --- a/db/HGPdtToolDb/HGPdtToolDbImpl.hpp +++ b/db/HGPdtToolDb/HGPdtToolDbImpl.hpp @@ -3,6 +3,10 @@ #include "base/HGDef.h" #include "base/HGBaseErr.h" +#include "base/HGLock.h" +#include "base/HGEvent.h" +#include "base/HGThread.h" +#include "HGPdtToolDb.h" #include "mysql.h" #include #include @@ -14,10 +18,12 @@ public: HGPdtToolDbUserMgrImpl(); ~HGPdtToolDbUserMgrImpl(); - HGResult Create(const HGChar* host, HGUShort port, const HGChar* userName, const HGChar* pwd); + HGResult Create(const HGChar* host, HGUShort port, const HGChar* userName, const HGChar* pwd, + HGPdtToolDbUserEventFunc func, HGPointer param); HGResult Destroy(); HGResult GetUserType(HGUInt* userType); HGResult GetUserName(HGChar* userName, HGUInt maxLen); + HGResult RefuseUser(HGChar* userName); HGResult GetUserList(HGChar** userNameList, HGUInt maxLen, HGUInt *count); static HGResult ReleaseUserList(HGChar** userNameList, HGUInt count); HGResult CreateUser(const HGChar* userName, const HGChar* defPwd); @@ -32,11 +38,15 @@ public: HGResult OpenDevice(const HGChar* sn, class HGPdtToolDbDeviceImpl **deviceImpl); private: + static void HGAPI ThreadFunc(HGThread thread, HGPointer param); void RemoveDevice(class HGPdtToolDbDeviceImpl* deviceImpl); static const HGChar* GetEntryNameCnStr(HGUInt entryName); static std::string GetPassword(MYSQL* sql, const HGChar* userName); static std::string GetAuthString(MYSQL* sql, const HGChar* pwd); + static int GetConnectId(MYSQL* sql); + static bool SetUserLoginInfo(MYSQL* sql, const HGChar* userName, int connectId, const std::string& takeUserName); + static bool GetUserLoginInfo(MYSQL* sql, const HGChar* userName, int &connectId, std::string &takeUserName); int CreateFileTable(MYSQL* sql); int CreateMainTestTable(MYSQL *sql); @@ -53,6 +63,16 @@ private: private: MYSQL* m_sql; std::string m_userName; + int m_connectId; + HGPdtToolDbUserEventFunc m_func; + HGPointer m_param; + HGBool m_valid; + + HGLock m_lock; + HGEvent m_event; + HGBool m_stopThread; + HGThread m_thread; + std::list m_deviceList; }; diff --git a/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp b/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp index 0403a89..bcb00d0 100644 --- a/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp +++ b/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp @@ -5,12 +5,14 @@ int main() { HGPdtToolDbUserMgr userMgr = NULL; - HGPdtToolDb_CreateUserMgr("127.0.0.1", 3306, "root", "123456", &userMgr); + HGPdtToolDb_CreateUserMgr("127.0.0.1", 3306, "root", "123456", NULL, NULL, &userMgr); if (NULL != userMgr) { - HGPdtToolDb_UploadFile(userMgr, "G100", "D:\\config.json"); + Sleep(30 * 1000); - HGPdtToolDb_DownloadFile(userMgr, "G100", "D:\\123.txt"); + //HGPdtToolDb_UploadFile(userMgr, "G100", "D:\\config.json"); + + //HGPdtToolDb_DownloadFile(userMgr, "G100", "D:\\123.txt"); HGPdtToolDbDevice device = NULL; HGPdtToolDb_OpenDevice(userMgr, "G123456", &device); diff --git a/db/database_cfg.txt b/db/database_cfg.txt index a9b7a8a..147cdf8 100644 --- a/db/database_cfg.txt +++ b/db/database_cfg.txt @@ -3,6 +3,6 @@ 3.create user 'huago'@'%' identified by 'huago'; 4.grant all privileges on huago_production_tool.* to 'huago'@'%'; 5.use huago_production_tool; -6.create table user_list (user varchar(20) not null primary key, password text); +6.create table user_list (user varchar(20) not null primary key, password text, connect_id int, take_user text); 7.insert into user_list (user, password) values ('root', password('123456')); 8.create table root_config (config_key varchar(40) not null primary key, config_value text); \ No newline at end of file