diff --git a/db/HGPdtToolDb/HGPdtToolDb.cpp b/db/HGPdtToolDb/HGPdtToolDb.cpp index 987f07e..065f327 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.cpp +++ b/db/HGPdtToolDb/HGPdtToolDb.cpp @@ -122,6 +122,28 @@ HGResult HGAPI HGPdtToolDb_ModifyPassword(HGPdtToolDbUserMgr userMgr, const HGCh return userMgrImpl->ModifyPassword(oldPwd, newPwd); } +HGResult HGAPI HGPdtToolDb_UploadFile(HGPdtToolDbUserMgr userMgr, const HGChar* tag, const HGChar* fileName) +{ + if (NULL == userMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGPdtToolDbUserMgrImpl* userMgrImpl = (HGPdtToolDbUserMgrImpl*)userMgr; + return userMgrImpl->UploadFile(tag, fileName); +} + +HGResult HGAPI HGPdtToolDb_DownloadFile(HGPdtToolDbUserMgr userMgr, const HGChar* tag, const HGChar* fileName) +{ + if (NULL == userMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGPdtToolDbUserMgrImpl* userMgrImpl = (HGPdtToolDbUserMgrImpl*)userMgr; + return userMgrImpl->DownloadFile(tag, fileName); +} + HGResult HGAPI HGPdtToolDb_Export(HGPdtToolDbUserMgr userMgr, const HGChar* xlsPath) { if (NULL == userMgr) diff --git a/db/HGPdtToolDb/HGPdtToolDb.def b/db/HGPdtToolDb/HGPdtToolDb.def index 9ab1649..5057f4e 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.def +++ b/db/HGPdtToolDb/HGPdtToolDb.def @@ -12,6 +12,8 @@ HGPdtToolDb_CreateUser HGPdtToolDb_DestroyUser HGPdtToolDb_SetPassword HGPdtToolDb_ModifyPassword +HGPdtToolDb_UploadFile +HGPdtToolDb_DownloadFile HGPdtToolDb_Export HGPdtToolDb_GetUserConfig HGPdtToolDb_SetUserConfig diff --git a/db/HGPdtToolDb/HGPdtToolDb.h b/db/HGPdtToolDb/HGPdtToolDb.h index 6717fcd..25225fb 100644 --- a/db/HGPdtToolDb/HGPdtToolDb.h +++ b/db/HGPdtToolDb/HGPdtToolDb.h @@ -126,6 +126,12 @@ HGEXPORT HGResult HGAPI HGPdtToolDb_SetPassword(HGPdtToolDbUserMgr userMgr, cons /* 修改本账户的密码 */ HGEXPORT HGResult HGAPI HGPdtToolDb_ModifyPassword(HGPdtToolDbUserMgr userMgr, const HGChar* oldPwd, const HGChar* newPwd); +/* 上传/更新文件,需要管理员账户才能调用 */ +HGEXPORT HGResult HGAPI HGPdtToolDb_UploadFile(HGPdtToolDbUserMgr userMgr, const HGChar *tag, const HGChar *fileName); + +/* 下载文件 */ +HGEXPORT HGResult HGAPI HGPdtToolDb_DownloadFile(HGPdtToolDbUserMgr userMgr, const HGChar* tag, const HGChar* fileName); + /* 导出所有设备测试信息到XLS文件 */ HGEXPORT HGResult HGAPI HGPdtToolDb_Export(HGPdtToolDbUserMgr userMgr, const HGChar *xlsPath); diff --git a/db/HGPdtToolDb/HGPdtToolDbImpl.cpp b/db/HGPdtToolDb/HGPdtToolDbImpl.cpp index 1ea875e..08d4022 100644 --- a/db/HGPdtToolDb/HGPdtToolDbImpl.cpp +++ b/db/HGPdtToolDb/HGPdtToolDbImpl.cpp @@ -151,7 +151,8 @@ HGResult HGPdtToolDbUserMgrImpl::Create(const HGChar* host, HGUShort port, const return HGPDTTOOLDB_ERR_WRONG_PASSWORD; } - if (0 != CreateMainTestTable(sql) || 0 != CreateInitInspTestTable(sql) || 0 != CreateInitInspDescTable(sql) + if (0 != CreateFileTable(sql) || 0 != CreateMainTestTable(sql) + || 0 != CreateInitInspTestTable(sql) || 0 != CreateInitInspDescTable(sql) || 0 != CreateImgInspTestTable(sql) || 0 != CreateImgInspDescTable(sql) || 0 != CreatePreInspTestTable(sql) || 0 != CreatePreInspDescTable(sql)) { @@ -445,6 +446,172 @@ HGResult HGPdtToolDbUserMgrImpl::ModifyPassword(const HGChar* oldPwd, const HGCh return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL; } +HGResult HGPdtToolDbUserMgrImpl::UploadFile(const HGChar* tag, const HGChar* fileName) +{ + if (NULL == m_sql) + { + return HGBASE_ERR_FAIL; + } + + if (NULL == tag || 0 == *tag || NULL == fileName || 0 == *fileName) + { + return HGBASE_ERR_INVALIDARG; + } + + HGUInt userType = 0; + GetUserType(&userType); + if (HGPDTTOOLDB_USERTYPE_ROOT != userType) + { + return HGBASE_ERR_ACCESSDENIED; + } + + FILE* file = fopen(fileName, "rb"); + if (NULL == file) + { + return HGBASE_ERR_FILENOTEXIST; + } + + fseek(file, 0, SEEK_END); + unsigned long fileSize = ftell(file); + fseek(file, 0, SEEK_SET); + if (fileSize <= 0) + { + fclose(file); + return HGBASE_ERR_FILEERROR; + } + + void* fileData = malloc(fileSize); + if (NULL == fileData) + { + fclose(file); + return HGBASE_ERR_OUTOFMEMORY; + } + + if (fileSize != fread(fileData, 1, fileSize, file)) + { + free(fileData); + fclose(file); + return HGBASE_ERR_FAIL; + } + + HGResult res = HGBASE_ERR_FAIL; + MYSQL_STMT *stmt = mysql_stmt_init(m_sql); + assert(NULL != stmt); + + char sqlCmd[1024] = {0}; + sprintf(sqlCmd, "insert into file_list (tag, file_data) values ('%s', ?);", tag); + int ret = mysql_stmt_prepare(stmt, sqlCmd, strlen(sqlCmd)); + assert(0 == ret); + + MYSQL_BIND bnd = {0}; + bnd.buffer_type = MYSQL_TYPE_BLOB; + bnd.buffer = fileData; + bnd.buffer_length = fileSize; + ret = mysql_stmt_bind_param(stmt, &bnd); + assert(0 == ret); + + ret = mysql_stmt_execute(stmt); + if (0 == ret) + { + res = HGBASE_ERR_OK; + } + else + { + if (1062 == mysql_stmt_errno(stmt)) + { + sprintf(sqlCmd, "update file_list set file_data = ? where tag = '%s';", tag); + ret = mysql_stmt_prepare(stmt, sqlCmd, strlen(sqlCmd)); + assert(0 == ret); + + MYSQL_BIND bnd = {0}; + bnd.buffer_type = MYSQL_TYPE_BLOB; + bnd.buffer = fileData; + bnd.buffer_length = fileSize; + ret = mysql_stmt_bind_param(stmt, &bnd); + assert(0 == ret); + + ret = mysql_stmt_execute(stmt); + if (0 == ret) + { + res = HGBASE_ERR_OK; + } + } + } + + mysql_stmt_close(stmt); + free(fileData); + fclose(file); + return res; +} + +HGResult HGPdtToolDbUserMgrImpl::DownloadFile(const HGChar* tag, const HGChar* fileName) +{ + if (NULL == m_sql) + { + return HGBASE_ERR_FAIL; + } + + if (NULL == tag || 0 == *tag || NULL == fileName || 0 == *fileName) + { + return HGBASE_ERR_INVALIDARG; + } + + HGResult res = HGBASE_ERR_FAIL; + MYSQL_STMT* stmt = mysql_stmt_init(m_sql); + assert(NULL != stmt); + + char sqlCmd[1024] = {0}; + sprintf(sqlCmd, "select file_data from file_list where tag = '%s';", tag); + int ret = mysql_stmt_prepare(stmt, sqlCmd, strlen(sqlCmd)); + assert(0 == ret); + + unsigned long readLength = 0; + MYSQL_BIND bnd = {0}; + bnd.buffer_type = MYSQL_TYPE_BLOB; + bnd.length = &readLength; + ret = mysql_stmt_bind_result(stmt, &bnd); + assert(0 == ret); + + ret = mysql_stmt_execute(stmt); + assert(0 == ret); + mysql_stmt_fetch(stmt); + + if (readLength > 0) + { + bnd.buffer = malloc(readLength); + if (NULL != bnd.buffer) + { + bnd.buffer_length = readLength; + ret = mysql_stmt_fetch_column(stmt, &bnd, 0, 0); + assert(0 == ret); + + FILE* file = fopen(fileName, "wb"); + if (NULL != file) + { + if (readLength == fwrite(bnd.buffer, 1, bnd.buffer_length, file)) + { + ret = HGBASE_ERR_OK; + } + + fclose(file); + } + else + { + res = HGBASE_ERR_ACCESSDENIED; + } + + free(bnd.buffer); + } + else + { + res = HGBASE_ERR_OUTOFMEMORY; + } + } + + mysql_stmt_close(stmt); + return res; +} + HGResult HGPdtToolDbUserMgrImpl::Export(const HGChar* xlsPath) { if (NULL == m_sql) @@ -786,6 +953,16 @@ std::string HGPdtToolDbUserMgrImpl::GetAuthString(MYSQL* sql, const HGChar* pwd) return authString; } +int HGPdtToolDbUserMgrImpl::CreateFileTable(MYSQL* sql) +{ + assert(NULL != sql); + + std::string cmd = "create table if not exists file_list (tag varchar(20) not null primary key"; + cmd += ", file_data blob"; + cmd += ");"; + return mysql_query(sql, cmd.c_str()); +} + int HGPdtToolDbUserMgrImpl::CreateMainTestTable(MYSQL* sql) { assert(NULL != sql); diff --git a/db/HGPdtToolDb/HGPdtToolDbImpl.hpp b/db/HGPdtToolDb/HGPdtToolDbImpl.hpp index 614bfc5..8f4cf0e 100644 --- a/db/HGPdtToolDb/HGPdtToolDbImpl.hpp +++ b/db/HGPdtToolDb/HGPdtToolDbImpl.hpp @@ -24,6 +24,8 @@ public: HGResult DestroyUser(const HGChar* userName); HGResult SetPassword(const HGChar* userName, const HGChar* pwd); HGResult ModifyPassword(const HGChar* oldPwd, const HGChar* newPwd); + HGResult UploadFile(const HGChar* tag, const HGChar* fileName); + HGResult DownloadFile(const HGChar* tag, const HGChar* fileName); HGResult Export(const HGChar* xlsPath); HGResult GetConfig(const HGChar *key, HGChar *value, HGUInt maxLen); HGResult SetConfig(const HGChar* key, const HGChar *value); @@ -36,6 +38,7 @@ private: static std::string GetPassword(MYSQL* sql, const HGChar* userName); static std::string GetAuthString(MYSQL* sql, const HGChar* pwd); + int CreateFileTable(MYSQL* sql); int CreateMainTestTable(MYSQL *sql); int CreateInitInspTestTable(MYSQL* sql); int CreateInitInspDescTable(MYSQL* sql); diff --git a/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp b/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp index 6b9eb37..0403a89 100644 --- a/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp +++ b/db/HGPdtToolDbTest/HGPdtToolDbTest.cpp @@ -8,15 +8,9 @@ int main() HGPdtToolDb_CreateUserMgr("127.0.0.1", 3306, "root", "123456", &userMgr); if (NULL != userMgr) { - HGChar* name[256]; - HGUInt count; - HGPdtToolDb_GetUserList(userMgr, name, 256, &count); + HGPdtToolDb_UploadFile(userMgr, "G100", "D:\\config.json"); - HGPdtToolDb_DestroyUser(userMgr, "kkk"); - - //HGPdtToolDb_CreateUser(userMgr, "huago", "123456"); - //HGPdtToolDb_ModifyPassword(userMgr, "1234", "123456"); - //HGPdtToolDb_SetPassword(userMgr, "huago", "654321"); + HGPdtToolDb_DownloadFile(userMgr, "G100", "D:\\123.txt"); HGPdtToolDbDevice device = NULL; HGPdtToolDb_OpenDevice(userMgr, "G123456", &device);