数据库账户实现防止重复登录功能

This commit is contained in:
luoliangyi 2022-12-15 15:13:21 +08:00
parent b9efee3bf4
commit 557df34598
8 changed files with 340 additions and 24 deletions

View File

@ -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)

View File

@ -6,6 +6,7 @@ HGPdtToolDb_CreateUserMgr
HGPdtToolDb_DestroyUserMgr
HGPdtToolDb_GetUserType
HGPdtToolDb_GetUserName
HGPdtToolDb_RefuseUser
HGPdtToolDb_GetUserList
HGPdtToolDb_ReleaseUserList
HGPdtToolDb_CreateUser

View File

@ -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);

View File

@ -111,8 +111,8 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGPdtToolDb.def</ModuleDefinitionFile>
<AdditionalDependencies>libmysql.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>../lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>libmysql.lib;HGBase.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>../lib/x86;../../../sdk/lib/win/x86/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

View File

@ -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<class HGPdtToolDbDeviceImpl*>::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)

View File

@ -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 <string>
#include <list>
@ -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<class HGPdtToolDbDeviceImpl*> m_deviceList;
};

View File

@ -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);

View File

@ -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);