diff --git a/Platform/user/configm/config-server/user_manager_config/user_account_config.c b/Platform/user/configm/config-server/user_manager_config/user_account_config.c index 54afa520d..d52a4f410 100644 --- a/Platform/user/configm/config-server/user_manager_config/user_account_config.c +++ b/Platform/user/configm/config-server/user_manager_config/user_account_config.c @@ -21,6 +21,7 @@ ret_code user_config_chk(uint source, uint *config_type, ret_code ret = RET_OK; cJSON *root, *type_json, *data_json; int fun_type; + //*config_type = CM_CONFIG_SET; if(NULL == input || NULL == input_len || NULL == output || NULL == output_len) { @@ -98,7 +99,7 @@ static ret_code user_config_get_detail_proc(uint source, uint config_type, ret_code ret = RET_OK; char * data_detail = NULL; char * ret_char = NULL; - int group_uuid; + int group_uuid, temp_output_len; /* 解析json串 */ cJSON * root = cJSON_Parse(input); @@ -137,15 +138,16 @@ static ret_code user_config_get_detail_proc(uint source, uint config_type, cJSON_AddStringToObject(ret_root, "data", ""); ret_char = cJSON_PrintUnformatted(ret_root); - memcpy(output, ret_char, strlen(ret_char)+1); - *output_len = strlen(ret_char)+1; + temp_output_len = strlen(ret_char)+1; + memcpy(output, ret_char, temp_output_len); + *output_len = temp_output_len; UCHAR_FREE(data_detail); //释放函数内部申请的内存 UCHAR_FREE(ret_char); cJSON_Delete(ret_root); return ret; } - + /* 查询成功 */ cJSON * list_obj = cJSON_Parse(data_detail); if (NULL == list_obj) @@ -172,8 +174,15 @@ static ret_code user_config_get_detail_proc(uint source, uint config_type, cJSON_AddStringToObject(ret_root, "message", "查询成功"); ret_char = cJSON_PrintUnformatted(ret_root); - memcpy(output, ret_char, strlen(ret_char)+1); - *output_len = strlen(ret_char)+1; + temp_output_len = strlen(ret_char)+1; + if (CM_BUFF_SIZE < temp_output_len) + { + ret = RET_ERR; + }else + { + memcpy(output, ret_char, temp_output_len); + *output_len = temp_output_len; + } cJSON_DetachItemFromObjectCaseSensitive(list_obj,"data"); cJSON_DetachItemFromObjectCaseSensitive(ret_root,"data"); @@ -298,7 +307,7 @@ static ret_code user_config_get_list_proc(uint source, uint config_type, ret_code ret = RET_OK; char * data_list = NULL; char * ret_char = NULL; - int group_uuid; + int group_uuid, temp_output_len; /* 解析json串 */ cJSON * root = cJSON_Parse(input); @@ -396,8 +405,15 @@ static ret_code user_config_get_list_proc(uint source, uint config_type, cJSON_AddStringToObject(ret_root, "message", "查询成功"); ret_char = cJSON_PrintUnformatted(ret_root); - memcpy(output, ret_char, strlen(ret_char)+1); - *output_len = strlen(ret_char)+1; + temp_output_len = strlen(ret_char)+1; + if (CM_BUFF_SIZE < temp_output_len) + { + ret = RET_ERR; + }else + { + memcpy(output, ret_char, strlen(ret_char)+1); + *output_len = strlen(ret_char)+1; + } cJSON_DetachItemFromObjectCaseSensitive(list_obj,"data"); cJSON_DetachItemFromObjectCaseSensitive(ret_root,"data"); @@ -445,7 +461,7 @@ static ret_code user_config_add_proc(uint source, uint config_type, USERLIST *user_account; char *ret_char = NULL; char *temp_begin_time, *temp_end_time, *temp_udesp, *temp_pwd; - int temp_multi, temp_valid; + int temp_multi, temp_valid, temp_output_len; char *message[] = {"新增成功","用户组名不存在","用户名长度不符合","用户名中包含特殊字符","用户名重名","用户数已达到最大(最大用户数100)","数据库操作失败","系统错误"}; /* 解析json串 */ @@ -540,24 +556,31 @@ static ret_code user_config_add_proc(uint source, uint config_type, /* 执行操作 */ usermanager_add_user(uname->valuestring, gname->valuestring, temp_udesp, temp_pwd, temp_multi, temp_valid, temp_begin_time, temp_end_time, &add_user_ret); //新增用户 + cJSON_Delete(root); /* 处理返回结果 */ res = cJSON_CreateObject(); if(!res) { - ret = RET_ERR; - // ASSERT_RET(ret); + ret = RET_SYSERR; return ret; } cJSON_AddNumberToObject(res, "retcode", add_user_ret.result); cJSON_AddStringToObject(res, "message", message[add_user_ret.result]); cJSON_AddStringToObject(res, "data", ""); ret_char = cJSON_PrintUnformatted(res); - memcpy(output, ret_char, strlen(ret_char)+1); - *output_len = strlen(ret_char)+1; + temp_output_len = strlen(ret_char)+1; + + if (CM_BUFF_SIZE < temp_output_len) + { + ret = RET_ERR; + }else + { + memcpy(output, ret_char, temp_output_len); + *output_len = temp_output_len; + } /* 释放内存 */ - cJSON_Delete(root); cJSON_Delete(res); UCHAR_FREE(ret_char); @@ -687,7 +710,8 @@ static ret_code user_config_del_proc(uint source, uint config_type, * "GID": 3, * "uname": "xxx", * "gname": "xxx", -* "resetpwd": 1, +* "resetpwd": 1, //0表示重置密码,1表示不重置密码 +* "passwd": "A31as%4Gb", //默认密码 * "udescription": "xxx", * "multi": 0, * "valid": 0, @@ -699,9 +723,12 @@ static ret_code user_config_del_proc(uint source, uint config_type, * multi, 0:允许多用户登陆、1:只允许单个用户登陆 * valid, 0:永久有效、1:在有效期内有效 * -* output格式:{"result":true} -* true:成功 -* false:失败 +* output格式: +{ + "retcode": 0, + "message": "修改成功", + "data": "" //空 +} */ static ret_code user_config_mod_web_proc(uint source, uint config_type, pointer input, int input_len, @@ -728,7 +755,7 @@ static ret_code user_config_mod_web_proc(uint source, uint config_type, s2j_struct_get_basic_element(input_data, data, int, GID); S2J_STRUCT_GET_STRING_ELEMENT_N(input_data, data, uname,UNAMESIZE); S2J_STRUCT_GET_STRING_ELEMENT_N(input_data, data, gname, GNAMESIZE); - //S2J_STRUCT_GET_STRING_ELEMENT_N(input_data, data, passwd, UPWDSIZE); + S2J_STRUCT_GET_STRING_ELEMENT_N(input_data, data, passwd, UPWDSIZE); S2J_STRUCT_GET_STRING_ELEMENT_N(input_data, data, udescription, UDESIZE); s2j_struct_get_basic_element(input_data, data, int, resetpwd); s2j_struct_get_basic_element(input_data, data, int, multi); @@ -738,6 +765,8 @@ static ret_code user_config_mod_web_proc(uint source, uint config_type, /* 执行操作 */ ret_mod_web = mod_user_web(input_data); + cJSON_Delete(root); + s2j_delete_struct_obj(input_data); /* 处理返回结果 */ ret_json = cJSON_CreateObject(); @@ -747,14 +776,23 @@ static ret_code user_config_mod_web_proc(uint source, uint config_type, //ASSERT_RET(ret); return ret; } - cJSON_AddBoolToObject(ret_json, "result", ret_mod_web); + + if(ret_mod_web) + { + cJSON_AddNumberToObject(ret_json, "retcode", 0); + cJSON_AddStringToObject(ret_json, "message", "修改成功"); + }else + { + cJSON_AddNumberToObject(ret_json, "retcode", 1); + cJSON_AddStringToObject(ret_json, "message", "修改失败"); + } + cJSON_AddStringToObject(ret_json, "data", ""); + ret_char = cJSON_PrintUnformatted(ret_json); memcpy(output, ret_char, strlen(ret_char)+1); - - /* 释放内存 */ - cJSON_Delete(root); + *output_len = strlen(ret_char)+1; + cJSON_Delete(ret_json); - s2j_delete_struct_obj(input_data); UCHAR_FREE(ret_char); return ret; } @@ -847,17 +885,26 @@ static ret_code user_config_mod_line_proc(uint source, uint config_type, /* * 修改用户-移动分组 * iuput格式: -* { -* "type": 6, -* "data": { -* "user_id": 1, -* "group_id": 3 -* } -* } +{ + "type": 6, //6表示移动分组 + "data": { + "user_id": [1, 2, 3], + "batch": { //批量全选 + "all": 0, //0:全选、1:不是全选 + "old_group_id": 2 //全选时的用户组id,0是表示 所有用户组 + }, + "new_group_id": 2 + } +} + * -* output格式:{"result":true} -* true:成功 -* false:失败 +* output格式: +{ + "retcode": 0, + "message": "移动成功", + "data": "" //空 +} + */ static ret_code user_config_move_group_proc(uint source, uint config_type, pointer input, int input_len, @@ -865,8 +912,10 @@ static ret_code user_config_move_group_proc(uint source, uint config_type, { ret_code ret = RET_OK; bool ret_move_group; - cJSON *root, *data, *userid_json, *groupid_json, *ret_json; + cJSON *root, *data, *userid_array_json, *userid_json, *batch_json, *batch_all_json, *old_groupid_json, *new_groupid_json, *ret_json; char *ret_char = NULL; + unsigned short temp_old_groupid = 0; + int id_num = 0; /* 解析json串 */ root = cJSON_Parse(input); @@ -878,40 +927,101 @@ static ret_code user_config_move_group_proc(uint source, uint config_type, cJSON_Delete(root); return ret; } - userid_json = cJSON_GetObjectItem(data, "user_id"); - if(!userid_json) + + new_groupid_json = cJSON_GetObjectItem(data, "new_group_id"); + if(!new_groupid_json) { ret = RET_INPUTERR; - //ASSERT_RET(ret); - cJSON_Delete(root); - return ret; - } - groupid_json = cJSON_GetObjectItem(data, "group_id"); - if(!groupid_json) - { - ret = RET_INPUTERR; - //ASSERT_RET(ret); cJSON_Delete(root); return ret; } - /* 执行操作 */ - ret_move_group = move_user_group(userid_json->valueint, groupid_json->valueint); + batch_json = cJSON_GetObjectItem(data, "batch"); + if(!batch_json) + { + ret = RET_INPUTERR; + cJSON_Delete(root); + return ret; + } + + batch_all_json = cJSON_GetObjectItem(batch_json, "all"); + if(!batch_all_json) + { + ret = RET_INPUTERR; + cJSON_Delete(root); + return ret; + } + + int i = 0; + int a[i]; + + switch (batch_all_json->valueint) + { + case 0: + old_groupid_json = cJSON_GetObjectItem(batch_json, "old_group_id"); + if(!old_groupid_json) + { + ret = RET_INPUTERR; + cJSON_Delete(root); + return ret; + } + temp_old_groupid = old_groupid_json->valueint; + ret_move_group = move_user_group(batch_all_json->valueint, new_groupid_json->valueint, temp_old_groupid, NULL, id_num); + break; + case 1: + userid_array_json = cJSON_GetObjectItem(data, "user_id"); + if(!userid_array_json) + { + ret = RET_INPUTERR; + cJSON_Delete(root); + return ret; + } + id_num = cJSON_GetArraySize(userid_array_json); + if(0 < id_num) + { + unsigned short user_ids[id_num]; + for(int i = 0; i < id_num; i++) + { + userid_json = cJSON_GetArrayItem(userid_array_json, i); + + user_ids[i] = userid_json->valueint; + } + ret_move_group = move_user_group(batch_all_json->valueint, new_groupid_json->valueint, temp_old_groupid, user_ids, id_num); + } + break; + default: + ret = RET_INPUTERR; + return ret; + break; + } + + cJSON_Delete(root); /* 处理返回结果 */ ret_json = cJSON_CreateObject(); if(!ret_json) { - ret = RET_ERR; - //ASSERT_RET(ret); + ret = RET_SYSERR; return ret; } - cJSON_AddBoolToObject(ret_json, "result", ret_move_group); + + if (ret_move_group) + { + cJSON_AddNumberToObject(ret_json, "retcode", 0); + cJSON_AddStringToObject(ret_json, "message", "移动成功"); + cJSON_AddStringToObject(ret_json, "data", ""); + }else + { + cJSON_AddNumberToObject(ret_json, "retcode", 1); + cJSON_AddStringToObject(ret_json, "message", "移动失败"); + cJSON_AddStringToObject(ret_json, "data", ""); + } + ret_char = cJSON_PrintUnformatted(ret_json); memcpy(output, ret_char, strlen(ret_char)+1); + *output_len = strlen(ret_char)+1; /* 释放内存 */ - cJSON_Delete(root); cJSON_Delete(ret_json); UCHAR_FREE(ret_char); diff --git a/Platform/user/configm/config-server/user_manager_config/user_group_config.c b/Platform/user/configm/config-server/user_manager_config/user_group_config.c index 1e1e3e279..38cdfec9b 100644 --- a/Platform/user/configm/config-server/user_manager_config/user_group_config.c +++ b/Platform/user/configm/config-server/user_manager_config/user_group_config.c @@ -14,6 +14,146 @@ ret_code usergroup_config_chk(uint source, uint *config_type, pointer output, int *output_len) { ret_code ret = RET_OK; + cJSON *root, *type_json, *data_json; + int fun_type; + //*config_type = CM_CONFIG_SET; + + if(NULL == input || NULL == input_len || NULL == output || NULL == output_len) + { + ret = RET_INPUTERR; + //ASSERT_RET(ret); + return ret; + } + + if(*input_len < strlen(input)) + { + ret = RET_INPUTERR; + return ret; + } + + root = cJSON_Parse(input); + if(!root) + { + ret = RET_INPUTERR; + return ret; + } + + type_json = cJSON_GetObjectItem(root, "type"); + if(!type_json) + { + cJSON_Delete(root); + ret = RET_INPUTERR; + return ret; + } + + data_json = cJSON_GetObjectItem(root, "data"); + if(!data_json) + { + cJSON_Delete(root); + ret = RET_INPUTERR; + return ret; + } + + cJSON_Delete(root); + return ret; +} + +/* +* 根据用户组名查询用户组uuid-处理 +* iuput格式: +{ + "type": 4, //4:表示获得用户组列表 + "data": "" +} + +* output格式: +{ + "retcode": 0, + "message": "查询成功", + "data": [{ + "gid": 1, + "gname": "用户组01", + "gdescription": "这是用户组01", + "useraccount": 3 + }, + { + "gid": 2, + "gname": "用户组02", + "gdescription": "这是用户组01", + "useraccount": 4 + } + ] +} + +* 0:成功、1:失败 +*/ +static ret_code usergroup_config_get_list_proc(uint source, uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ret_code ret = RET_OK; + char * data_list, * ret_char; + bool ret_get = show_group_list(&data_list); + + cJSON * ret_root = cJSON_CreateObject(); + if (NULL == ret_root) + { + UCHAR_FREE(data_list); + ret = RET_SYSERR; + return ret; + } + + if(!ret_get) + { + cJSON_AddNumberToObject(ret_root, "retcode", 1); + cJSON_AddStringToObject(ret_root, "message", "查询失败"); + cJSON_AddStringToObject(ret_root, "data", ""); + + ret_char = cJSON_PrintUnformatted(ret_root); + memcpy(output, ret_char, strlen(ret_char)+1); + *output_len = strlen(ret_char)+1; + + UCHAR_FREE(data_list); + UCHAR_FREE(ret_char); + cJSON_Delete(ret_root); + return ret; + } + + /* 查询成功 */ + cJSON * list_obj = cJSON_Parse(data_list); + if (NULL == list_obj) + { + UCHAR_FREE(data_list); + cJSON_Delete(ret_root); + ret = RET_SYSERR; + return ret; + } + + cJSON * list_data = cJSON_GetObjectItem(list_obj, "data"); + if (NULL == list_data) + { + UCHAR_FREE(data_list); + cJSON_Delete(ret_root); + cJSON_Delete(list_obj); + ret = RET_SYSERR; + return ret; + } + + cJSON_AddItemToObject(ret_root, "data", list_data); + cJSON_AddNumberToObject(ret_root, "retcode", 0); + cJSON_AddStringToObject(ret_root, "message", "查询成功"); + + ret_char = cJSON_PrintUnformatted(ret_root); + memcpy(output, ret_char, strlen(ret_char)+1); + *output_len = strlen(ret_char)+1; + + cJSON_DetachItemFromObjectCaseSensitive(list_obj,"data"); + cJSON_DetachItemFromObjectCaseSensitive(ret_root,"data"); + UCHAR_FREE(data_list); + UCHAR_FREE(ret_char); + cJSON_Delete(list_obj); + cJSON_Delete(ret_root); + return ret; } @@ -74,7 +214,7 @@ static ret_code usergroup_config_get_uuid_proc(uint source, uint config_type, cJSON * ret_data; cJSON_AddItemToObject(ret_root, "data", ret_data = cJSON_CreateObject()); - cJSON_AddNumberToObject(ret_data, "user_id", group_uuid); + cJSON_AddNumberToObject(ret_data, "group_id", group_uuid); }else { cJSON_AddNumberToObject(ret_root, "retcode", 1); @@ -92,12 +232,93 @@ static ret_code usergroup_config_get_uuid_proc(uint source, uint config_type, return ret; } +/* +* 修改用户组描述-处理 +* input格式: +{ + "type": 2, //2:表示修改用户组描述 + "data": { + "gid": 3, //用户组id + "gdescription": "xxx" + } +} +* output格式: +{ + "retcode": 0, + "message": "修改成功", + "data": "" //空 +} +* 0:成功 +* 1:失败 +*/ +static ret_code usergroup_config_mod_proc(uint source, uint config_type, + pointer input, int input_len, + pointer output, int *output_len) +{ + ret_code ret = RET_OK; + + cJSON * root = cJSON_Parse(input); + cJSON * data = cJSON_GetObjectItem(root, "data"); + cJSON * gid = cJSON_GetObjectItem(data, "gid"); + if(NULL == gid) + { + cJSON_Delete(root); + ret = RET_INPUTERR; + return ret; + } + + cJSON * gdescription = cJSON_GetObjectItem(data, "gdescription"); + if(NULL == gdescription) + { + cJSON_Delete(root); + ret = RET_INPUTERR; + return ret; + } + + int ret_mod = mod_group_desp(gid->valueint, gdescription->valuestring); + cJSON_Delete(root); + + cJSON * ret_root = cJSON_CreateObject(); + if(NULL == ret_root) + { + ret = RET_SYSERR; + return ret; + } + + if(0 == ret_mod) + { + cJSON_AddNumberToObject(ret_root, "retcode", 0); + cJSON_AddStringToObject(ret_root, "message", "修改成功"); + }else + { + cJSON_AddNumberToObject(ret_root, "retcode", 1); + cJSON_AddStringToObject(ret_root, "message", "修改失败"); + } + + cJSON_AddStringToObject(ret_root, "data", ""); + + + char * ret_char = cJSON_PrintUnformatted(ret_root); + memcpy(output, ret_char, strlen(ret_char)+1); + *output_len = strlen(ret_char)+1; + + UCHAR_FREE(ret_char); + cJSON_Delete(ret_root); + + return ret; +} + /* * 新增用户组-处理 * input格式:{"type": 0,"data": {"gname": "xxx","gdescription": "xxx"}} -* output格式:{"result":0} +* output格式: +{ + "retcode": 0, + "message": "新增成功", + "data": "" //空 +} * 0:成功 -* 1/2/3/4/5:失败,1:用户组已满、2:用户组名或描述长度不符合要求、3:用户组名中包含特殊字符、4:用户组名重名、5:数据库操作失败 +* 1/2/3/4/5/6:失败,1:用户组已满、2:用户组名或描述长度不符合要求、3:用户组名中包含特殊字符、4:用户组名重名、5:数据库操作失败、6:系统错误 */ static ret_code usergroup_config_add_proc(uint source, uint config_type, pointer input, int input_len, @@ -108,7 +329,7 @@ static ret_code usergroup_config_add_proc(uint source, uint config_type, cJSON *root, *data, *name, *description, *res; char *des = NULL; char *ret_char = NULL; - char * message[] = {"新增成功","用户组已满(最大用户组数20)","用户组名或描述长度不符合要求","用户组名中包含特殊字符","用户组名重名","数据库操作失败"}; + char * message[] = {"新增成功","用户组已满(最大用户组数20)","用户组名或描述长度不符合要求","用户组名中包含特殊字符","用户组名重名","数据库操作失败","系统错误"}; /* 解析json串 */ root = cJSON_Parse(input); @@ -141,7 +362,7 @@ static ret_code usergroup_config_add_proc(uint source, uint config_type, res = cJSON_CreateObject(); if(!res) { - ret = RET_ERR; + ret = RET_SYSERR; //ASSERT_RET(ret); return ret; } @@ -279,13 +500,6 @@ ret_code usergroup_config_proc(uint source, uint config_type, int fun_type; cJSON *root, *type_json; - if(NULL == input) - { - ret = RET_INPUTERR; - //ASSERT_RET(ret); - return ret; - } - /* 获取对应的函数type */ FUNCTYPE_GET(input, fun_type); @@ -308,6 +522,16 @@ ret_code usergroup_config_proc(uint source, uint config_type, input, input_len, output, output_len); break; + case USERGROUP_CONFIG_MOD: + ret = usergroup_config_mod_proc(source, config_type, + input, input_len, + output, output_len); + break; + case USERGROUP_CONFIG_GET_ALL: + ret = usergroup_config_get_list_proc(source, config_type, + input, input_len, + output, output_len); + break; case USERGROUP_CONFIG_GET_UUID: ret = usergroup_config_get_uuid_proc(source, config_type, input, input_len, diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user.h b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user.h index 48b73f8c1..b6c62ae90 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user.h +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user.h @@ -102,7 +102,7 @@ bool get_user_uuid_by_name(char* UNAME, unsigned short * user_uuid); bool mod_user_line(char* UNAME, const int INTYPE, char* IN); /* 修改用户-移动分组 */ -bool move_user_group(unsigned short user_id, unsigned short group_id); +bool move_user_group(int flag_all, unsigned short new_group_uuid, unsigned short old_group_uuid, unsigned short * user_uuid, int user_uuid_num); /* 删除用户 * id_name:条件,包括用户名、用户ID diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user_group.h b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user_group.h index 2b6d72996..26f6470a8 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user_group.h +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/user_group.h @@ -6,6 +6,9 @@ #define GNAMESIZE (64) #define GDESIZE (64) +#define OFFLINE_USER_BY_GID "offuser_by_groupid_channel" +#define USER_GROUP_DATABASE_ID 12 + #define ADDGROUP_SUCCESS 0 #define ADDGROUP_FAIL_FULL 1 #define ADDGROUP_FAIL_LENGTH 2 @@ -53,13 +56,13 @@ int init_group(); int add_group(char* UGNAME, char* UGDES); /* 修改用户组描述 */ -unsigned short mod_group_desp(char* UGNAME, char* UGDES); +unsigned short mod_group_desp(int group_uuid, char* UGDES); /* 获得用户组个数 */ unsigned short get_group_count(); /* 查询用户组列表 */ -bool show_group_list(USERGROUP* UGLIST); +bool show_group_list(char ** group_list); /* 根据用户组名查询用户组 */ bool find_group_by_name(char* UGNAME, USERGROUP* UGRES); @@ -79,5 +82,8 @@ unsigned short del_group_by_name(GROUP_DEL* UGNAME); /* 强制下线用户-按用户组ID */ void offline_force_by_groupid(char *groupid); +/*解析用户组id的json字符串 --> 用户组id*/ +unsigned short id_json2int(char * gid, char * para_name); + #endif diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c index f41ca3bf7..2f7102986 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c @@ -10,6 +10,7 @@ #include "redisMq.h" #include "database.h" #include "cjson/cJSON.h" +#include "s2j/s2j.h" //#include "sg/user/user_manager/user_auth.h" extern ARRAY g_user_index_head; @@ -277,31 +278,34 @@ void get_user_by_id(unsigned short ID, USERLIST* ulist) bool mod_user_web(USERLIST* ulist) { void *moduser_web_hdbc; - USERLIST temp_user; + int ret_release; time_t cur_time; - char *temp_begin_time, *temp_end_time, *temp_pwd; + char *temp_begin_time, *temp_end_time, *temp_pwd, *temp_udes, *temp_user_json; + /* 可以修改的数据:用户组ID、描述、密码、公用账号、永久有效、有效期开始时间、有效期结束时间 */ if (NULL == ulist || INVALID_INDEX == ulist->ID || INVALID_INDEX == ulist->GID) { return false; } - /* 校验描述长度 */ - if (NULL != ulist->udescription) + /* 数据校验 */ + if (NULL == ulist->gname || NULL == ulist->uname) { - if (UDESIZE < strlen(ulist->udescription)) - { - return false; - } + return false; } - - get_user_by_id(ulist->ID, &temp_user); - - if(0 == ulist->resetpwd) + + if (NULL == ulist->udescription) { - temp_pwd = "12345678"; - }else{ - temp_pwd = temp_user.passwd; + temp_udes = ""; + }else + { + temp_udes = ulist->udescription; + } + + /* 校验描述长度 */ + if (UDESIZE < strlen(temp_udes)) + { + return false; } if(1 == ulist->valid) @@ -313,44 +317,138 @@ bool mod_user_web(USERLIST* ulist) temp_end_time = ""; } + if(0 == ulist->resetpwd) + { + if(NULL == ulist->passwd) + { + return false; + } + temp_pwd = ulist->passwd; + } + + //get_user_by_id(ulist->ID, &temp_user); + + /* 获取修改前的数据 - 这里的temp_user_json需要释放 */ + bool ret_getuser = get_user_detail_by_user_uuid(ulist->ID, &temp_user_json); + if (!ret_getuser) + { + UCHAR_FREE(temp_user_json); + return false; + } + + /* 这里的 ret_root 需要释放 */ + cJSON * ret_root = cJSON_Parse(temp_user_json); + if(NULL == ret_root) + { + UCHAR_FREE(temp_user_json); + return false; + } + cJSON * ret_data = cJSON_GetObjectItem(ret_root, "data"); + if(NULL == ret_data) + { + cJSON_Delete(ret_root); + UCHAR_FREE(temp_user_json); + return false; + } + int ret_data_num = cJSON_GetArraySize(ret_data); + if (1 != ret_data_num) + { + cJSON_Delete(ret_root); + UCHAR_FREE(temp_user_json); + return false; + } + cJSON * ret_user = cJSON_GetArrayItem(ret_data, 0); + if(NULL == ret_user) + { + cJSON_Delete(ret_root); + UCHAR_FREE(temp_user_json); + return false; + } + + /* json序列化到obj - 这里的 temp_user 需要释放*/ + s2j_create_struct_obj(temp_user, USERLIST); + s2j_struct_get_basic_element(temp_user, ret_user, int, ID); + s2j_struct_get_basic_element(temp_user, ret_user, int, GID); + s2j_struct_get_basic_element(temp_user, ret_user, int, multi); + s2j_struct_get_basic_element(temp_user, ret_user, int, valid); + s2j_struct_get_basic_element(temp_user, ret_user, string, uname); + s2j_struct_get_basic_element(temp_user, ret_user, string, gname); +// s2j_struct_get_basic_element(temp_user, ret_user, string, passwd); + s2j_struct_get_basic_element(temp_user, ret_user, string, udescription); + s2j_struct_get_basic_element(temp_user, ret_user, string, valid_begin_time); + s2j_struct_get_basic_element(temp_user, ret_user, string, valid_end_time); + + cJSON_Delete(ret_root); + UCHAR_FREE(temp_user_json); + /* 连接数据库,更新user表 */ moduser_web_hdbc = connect_database(USER_ACCOUNT_DATABASE_ID); if(NULL == moduser_web_hdbc) { - /* 记录日志 */ + s2j_delete_struct_obj(temp_user); return false; } - char* moduser_web_sql = "UPDATE `user_account` SET group_id = ?,udescription = ?, password = ?, multi_player = ?, valid_always = ?, valid_begin_time = ?, valid_end_time = ? WHERE id = ?"; - int ret_moduser_web = update_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc, DB_OP_UPDATE, USER_TABLE, moduser_web_sql, 8, - DB_DATA_INT_TYPE, sizeof(ulist->GID), ulist->GID, - DB_DATA_STRING_TYPE, strlen(ulist->udescription)+1, ulist->udescription, - DB_DATA_STRING_TYPE, strlen(temp_pwd)+1, temp_pwd, - DB_DATA_INT_TYPE, sizeof(ulist->multi), ulist->multi, - DB_DATA_INT_TYPE, sizeof(ulist->valid), ulist->valid, - DB_DATA_STRING_TYPE, strlen(temp_begin_time)+1, temp_begin_time, - DB_DATA_STRING_TYPE, strlen(temp_end_time)+1, temp_end_time, - DB_DATA_INT_TYPE, sizeof(ulist->ID), ulist->ID); - int ret_release = disconnect_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc); //ret_release记录日志 + + unsigned short user_id = get_userid_by_name(ulist->uname, moduser_web_hdbc); + unsigned short group_id = get_groupid_by_name(ulist->gname, moduser_web_hdbc); + if(INVALID_INDEX == user_id || INVALID_INDEX == group_id) + { + s2j_delete_struct_obj(temp_user); + ret_release = disconnect_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc); //ret_release记录日志 + return false; + } + + char * moduser_web_sql; + int ret_moduser_web; + if (0 == ulist->resetpwd) + { + moduser_web_sql = "UPDATE `user_account` SET group_id = (SELECT user_group.id FROM user_group WHERE user_group.uuid = ?),\ + udescription = ?, password = ?, multi_player = ?, valid_always = ?, valid_begin_time = ?, valid_end_time = ? WHERE uuid = ?"; + ret_moduser_web = update_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc, DB_OP_UPDATE, USER_TABLE, moduser_web_sql, 8, + DB_DATA_INT_TYPE, sizeof(ulist->GID), ulist->GID, + DB_DATA_STRING_TYPE, strlen(temp_udes)+1, temp_udes, + DB_DATA_STRING_TYPE, strlen(temp_pwd)+1, temp_pwd, + DB_DATA_INT_TYPE, sizeof(ulist->multi), ulist->multi, + DB_DATA_INT_TYPE, sizeof(ulist->valid), ulist->valid, + DB_DATA_STRING_TYPE, strlen(temp_begin_time)+1, temp_begin_time, + DB_DATA_STRING_TYPE, strlen(temp_end_time)+1, temp_end_time, + DB_DATA_INT_TYPE, sizeof(ulist->ID), ulist->ID); + }else + { + moduser_web_sql = "UPDATE `user_account` SET group_id = (SELECT user_group.id FROM user_group WHERE user_group.uuid = ?),\ + udescription = ?, multi_player = ?, valid_always = ?, valid_begin_time = ?, valid_end_time = ? WHERE uuid = ?"; + ret_moduser_web = update_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc, DB_OP_UPDATE, USER_TABLE, moduser_web_sql, 7, + DB_DATA_INT_TYPE, sizeof(ulist->GID), ulist->GID, + DB_DATA_STRING_TYPE, strlen(temp_udes)+1, temp_udes, + DB_DATA_INT_TYPE, sizeof(ulist->multi), ulist->multi, + DB_DATA_INT_TYPE, sizeof(ulist->valid), ulist->valid, + DB_DATA_STRING_TYPE, strlen(temp_begin_time)+1, temp_begin_time, + DB_DATA_STRING_TYPE, strlen(temp_end_time)+1, temp_end_time, + DB_DATA_INT_TYPE, sizeof(ulist->ID), ulist->ID); + } + + ret_release = disconnect_database(USER_ACCOUNT_DATABASE_ID, moduser_web_hdbc); //ret_release记录日志 if(DB_RET_OK != ret_moduser_web) { + s2j_delete_struct_obj(temp_user); return false; } + /* 更新内存数据 */ - strcpy(g_user_table[ulist->ID].udescription, ulist->udescription); + strcpy(g_user_table[user_id].udescription, temp_udes); if(0 == ulist->resetpwd) { - strcpy(g_user_table[ulist->ID].passwd, "12345678"); + strcpy(g_user_table[user_id].passwd, ulist->passwd); } - g_user_table[ulist->ID].GID = ulist->GID; - g_user_table[ulist->ID].multi_valid = MULTI_SET(g_user_table[ulist->ID].multi_valid, ulist->multi); - g_user_table[ulist->ID].multi_valid = VALID_SET(g_user_table[ulist->ID].multi_valid, ulist->valid); + g_user_table[user_id].GID = group_id; + g_user_table[user_id].multi_valid = MULTI_SET(g_user_table[user_id].multi_valid, ulist->multi); + g_user_table[user_id].multi_valid = VALID_SET(g_user_table[user_id].multi_valid, ulist->valid); /* 更新有效日期时间 */ if (1 == ulist->valid) { //if(判断是否符合格式) - STRING2TIME_T(ulist->valid_begin_time, g_user_table[ulist->ID].valid_begin_time); - STRING2TIME_T(ulist->valid_end_time, g_user_table[ulist->ID].valid_end_time); - //return true; + STRING2TIME_T(ulist->valid_begin_time, g_user_table[user_id].valid_begin_time); + STRING2TIME_T(ulist->valid_end_time, g_user_table[user_id].valid_end_time); } /* 查询该用户是否有在线IP */ @@ -363,35 +461,33 @@ bool mod_user_web(USERLIST* ulist) // } /* 用户组发生改变,策略重查 */ - if (temp_user.GID != ulist->GID) + if (temp_user->GID != ulist->GID) { /* 策略重查*/ + printf("修改了用户组-策略重查 .\n"); } /* 密码发生改变,下线用户 */ if (0 == ulist->resetpwd) { - /* 下线用户,return */ - offline_force_one_user(ulist->ID); + offline_force_one_user(user_id); return true; } /* 公用账号改为单用户登陆,下线用户 */ - if (1 == ulist->multi && 0 == temp_user.multi) + if (1 == ulist->multi && 0 == temp_user->multi) { - /* 下线用户,return */ - offline_force_one_user(ulist->ID); + offline_force_one_user(user_id); return true; } /* 当前时间不在有效期内,下线用户 */ - if (1 == VALID_GET(g_user_table[ulist->ID].multi_valid)) + if (1 == ulist->valid) { cur_time = time(NULL); - if (cur_time < g_user_table[ulist->ID].valid_begin_time || cur_time > g_user_table[ulist->ID].valid_end_time) + if (cur_time < g_user_table[user_id].valid_begin_time || cur_time > g_user_table[user_id].valid_end_time) { - /* 下线用户,return */ - offline_force_one_user(ulist->ID); + offline_force_one_user(user_id); return true; } } @@ -516,43 +612,7 @@ unsigned short get_userid_by_name(char* uname, void* hdbc) } ARRAYJSON2INT(uid, "id", &ID_temp); -/* cJSON *root = cJSON_Parse(uid); - if(!root) - { - return ID_temp; - } - cJSON *id_list = cJSON_GetObjectItem(root, "data"); - if(!id_list) - { - cJSON_Delete(root); - return ID_temp; - } - - int id_list_size = cJSON_GetArraySize(id_list); - if(1 != id_list_size) - { - cJSON_Delete(root); - return ID_temp; - } - - cJSON *id_obj = cJSON_GetArrayItem(id_list, 0); - if(!id_obj) - { - cJSON_Delete(root); - return ID_temp; - } - - cJSON *id_json = cJSON_GetObjectItem(id_obj, "id"); - if(!id_json) - { - cJSON_Delete(root); - return ID_temp; - } - - ID_temp = id_json->valueint; - cJSON_Delete(root); -*/ return ID_temp; } @@ -599,20 +659,168 @@ bool mod_user_line(char* uname, const int intype, char* in) } /* 修改用户-移动分组 */ -bool move_user_group(unsigned short user_id, unsigned short group_id) +bool move_user_group(int flag_all, unsigned short new_group_uuid, unsigned short old_group_uuid, unsigned short * user_uuid, int user_uuid_num) { - if(user_id != g_user_table[user_id].ID || group_id != g_group_table[group_id].ID) + void * moveug_hdbc,* selectgid_hdbc;; + char * moveug_sql; + char * selectuid_sql; + char * ret_userids; + bool root_all = false; + int ret_sql, ret_discon, sql_num; + unsigned short temp_userids[USER_INDEX_MAX] = {0}; + unsigned short temp_groupid, temp_userid; + + if (INVALID_INDEX == new_group_uuid || (0 != flag_all && 1 != flag_all)) { return false; } - g_user_table[user_id].GID = group_id; + //连接数据库 + moveug_hdbc = connect_database(USER_ACCOUNT_DATABASE_ID); //更新用户表 + if (NULL == moveug_hdbc || NULL == selectgid_hdbc) + { + return false; + } - /* 连接数据库,修改user表中的用户组id */ - /* UPDATE `user` u SET u.group_id = WHERE u.id = ; */ + //根据新组的uuid获取新组的id + temp_groupid = get_groupid_by_uuid(new_group_uuid, moveug_hdbc); + if (INVALID_INDEX == temp_groupid) + { + return false; + } + + // char * ret_new_groupid_json = select_datebase_by_number(USER_GROUP_DATABASE_ID, selectgid_hdbc, USER_GROUP_TABLE, "SELECT id FROM `user_group` WHERE uuid = ?", + // 1, 0, &sql_num, 1, + // DB_DATA_INT_TYPE, sizeof(new_group_uuid), new_group_uuid); + // if (0 == sql_num || NULL == ret_new_groupid_json) + // { + // ret_discon = disconnect_database(USER_GROUP_DATABASE_ID, selectgid_hdbc); + // return false; + // } + // ARRAYJSON2INT(ret_new_groupid_json, "id", &temp_groupid); + //temp_groupid = id_json2int(temp_test01, "id"); + + //按照group_uuid移动 + if (0 == flag_all || NULL ==user_uuid) + { + if (0 == old_group_uuid) + { + moveug_sql = "UPDATE `user_account` SET group_id = ?"; + root_all = true; + }else + { + moveug_sql = "UPDATE `user_account` \ + SET group_id = ? \ + WHERE group_id = ( \ + SELECT \ + user_group.id \ + FROM \ + user_group \ + WHERE \ + user_group.uuid = ? \ + )"; + selectuid_sql = "SELECT id FROM `user_account` WHERE group_id = (SELECT user_group.id FROM user_group WHERE user_group.uuid = ?)"; + + ret_userids = select_datebase_by_number(USER_ACCOUNT_DATABASE_ID, moveug_hdbc, USER_TABLE, selectuid_sql, 1, 0, &sql_num, 1, + DB_DATA_INT_TYPE, sizeof(old_group_uuid), old_group_uuid); + //解析ret_userids --> temp_userids + if(0 == sql_num || NULL == ret_userids) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + + cJSON * ret_root_json = cJSON_Parse(ret_userids); + if (NULL == ret_root_json) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + + cJSON * ret_data_json = cJSON_GetObjectItem(ret_root_json, "data"); + if(NULL == ret_data_json) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + + int ret_data_num = cJSON_GetArraySize(ret_data_json); + + for (int i = 0; i < ret_data_num; i++) + { + cJSON * ret_id_json = cJSON_GetArrayItem(ret_data_json, i); + if (NULL == ret_id_json) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + temp_userids[ret_id_json->valueint] = ret_id_json->valueint; + } + } + + ret_sql = update_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc, DB_OP_UPDATE, USER_TABLE, moveug_sql, 2, + DB_DATA_INT_TYPE, sizeof(temp_groupid), temp_groupid, + DB_DATA_INT_TYPE, sizeof(old_group_uuid), old_group_uuid); + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + if (DB_RET_OK != ret_sql) + { + return false; + } + } + + //按user_uuid移动 + if (1 == flag_all) + { + if (NULL == user_uuid) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + + moveug_sql = "UPDATE user_account SET user_account.group_id = ? WHERE user_account.uuid = ?"; + selectuid_sql = "SELECT id FROM `user_account` WHERE uuid = ?"; + for (int i = 0; i < user_uuid_num; i++) + { + unsigned short temp_uesr_uuid = 0; + ret_userids = select_datebase_by_number(USER_ACCOUNT_DATABASE_ID, moveug_hdbc, USER_TABLE, selectuid_sql, 1, 0, &sql_num, 1, + DB_DATA_INT_TYPE, sizeof(user_uuid[i]), user_uuid[i]); + if(0 == sql_num || NULL ==ret_userids) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + ARRAYJSON2INT(ret_userids, "id", &temp_userid); + temp_userids[temp_userid] = temp_userid; + + temp_uesr_uuid = user_uuid[i]; + ret_sql = update_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc, DB_OP_UPDATE, USER_TABLE, moveug_sql, 2, + DB_DATA_INT_TYPE, sizeof(temp_groupid), temp_groupid, + DB_DATA_INT_TYPE, sizeof(temp_uesr_uuid), temp_uesr_uuid); + if(DB_RET_OK != ret_sql) + { + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + return false; + } + } + ret_discon = disconnect_database(USER_ACCOUNT_DATABASE_ID, moveug_hdbc); + } + + //修改内存 + for (int i = 0; i < USER_INDEX_MAX; i++) + { + if (root_all) + { + g_user_table[i].GID = temp_groupid; + }else if(INVALID_INDEX != temp_userids[i]) + { + g_user_table[i].GID = temp_groupid; + } + } + /* 发送消息(用户id - 用户组id)到策略模块,重查策略 */ - + printf("发送消息给策略模块,重查策略. new_group_id:%d .\n", temp_groupid); + return true; } diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c index b34ca50f4..0ca31dfb2 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c @@ -10,9 +10,6 @@ #include "database.h" #include "cjson/cJSON.h" -#define OFFLINE_USER_BY_GID "offuser_by_groupid_channel" -#define USER_GROUP_DATABASE_ID 12 - extern ARRAY g_group_index_head; extern ARRAY g_user_index_head; extern USERACCOUNT g_user_table[]; @@ -35,6 +32,7 @@ int init_group() int add_group(char* name, char* description) { void *addgroup_hdbc; + int ret_release; if (NULL == name) { return ADDGROUP_ERROR; @@ -90,7 +88,7 @@ int add_group(char* name, char* description) if(DB_RET_OK != ret_addgroup) { free_index(&g_group_index_head, ID); - disconnect_database(USER_GROUP_DATABASE_ID, addgroup_hdbc); // ret_release记录日志 + ret_release = disconnect_database(USER_GROUP_DATABASE_ID, addgroup_hdbc); // ret_release记录日志 return ADDGROUP_FAIL_DATABASE; } @@ -99,18 +97,20 @@ int add_group(char* name, char* description) strcpy(g_group_table[ID].gname, name); strcpy(g_group_table[ID].gdescription, description); - int ret_release = disconnect_database(USER_GROUP_DATABASE_ID, addgroup_hdbc); // ret_release记录日志 + ret_release = disconnect_database(USER_GROUP_DATABASE_ID, addgroup_hdbc); // ret_release记录日志 return ADDGROUP_SUCCESS; } /* 修改用户组描述 */ -unsigned short mod_group_desp(char* gname, char* gdesp) +unsigned short mod_group_desp(int group_uuid, char* gdesp) { void *modgroup_hdbc; - if(NULL == gname || NULL ==gdesp) + int ret_release; + int num; + if(NULL == gdesp) { - return MODGROUP_FAIL_INPUT; + gdesp = ""; } /* 连接数据库 */ @@ -121,28 +121,28 @@ unsigned short mod_group_desp(char* gname, char* gdesp) return MODGROUP_FAIL_DATABASE; } - unsigned short gid = get_groupid_by_name(gname, mod_group_desp); - if(INVALID_INDEX == gid) + unsigned short group_id = get_groupid_by_uuid(group_uuid, modgroup_hdbc); + if(INVALID_INDEX == group_id) { - return MODGROUP_FAIL_NOTEXIST; + ret_release = disconnect_database(USER_GROUP_DATABASE_ID, modgroup_hdbc); //ret_release记录日志 + return MODGROUP_FAIL_INPUT; } /* 修改数据库 */ - char *modgroup_sql = "UPDATE user_group SET gdescription = ? WHERE gname = ? "; + char *modgroup_sql = "UPDATE user_group SET gdescription = ? WHERE uuid = ? "; int ret_modgroup = update_database(1, modgroup_hdbc, DB_OP_UPDATE, USER_GROUP_TABLE, modgroup_sql, 2, DB_DATA_STRING_TYPE, strlen(gdesp), gdesp, - DB_DATA_STRING_TYPE, strlen(gname), gname); + DB_DATA_INT_TYPE, sizeof(group_uuid), group_uuid); + ret_release = disconnect_database(USER_GROUP_DATABASE_ID, modgroup_hdbc); //ret_release记录日志 + if(DB_RET_OK != ret_modgroup) { return MODGROUP_FAIL_DATABASE; } /* 修改内存 */ - strcpy(g_group_table[gid].gdescription, gdesp); + strcpy(g_group_table[group_id].gdescription, gdesp); - /* 释放数据库连接 */ - int ret_release = disconnect_database(USER_GROUP_DATABASE_ID, modgroup_hdbc); //ret_release记录日志 - return MODGROUP_SUCCESS; } @@ -192,38 +192,75 @@ unsigned short get_group_count() } /* 查询用户组列表 */ -bool show_group_list(USERGROUP* grouplist) +bool show_group_list(char ** group_list) { - if (NULL == grouplist) + void * getglist_hdbc; + int num; + if (NULL == group_list) { return false; } - /* 内存查询数据 */ - int j = 0; - for (int i = 0; i < GROUP_INDEX_MAX; i++) + getglist_hdbc = connect_database(USER_GROUP_DATABASE_ID); + if (NULL == getglist_hdbc) { - if (g_group_table[i].ID != 0) - { - grouplist[j].ID = g_group_table[i].ID; - strcpy(grouplist[j].gname, g_group_table[i].gname); - strcpy(grouplist[j].gdescription, g_group_table[i].gdescription); - j++; - } + return false; } - /* 连接数据库,查询表user_group列表 */ - /* SELECT UG.id, UG.gname, UG.gdescription FROM user_group UG */ + char * select_sql = "SELECT\ + user_group.uuid gid,\ + user_group.gname,\ + user_group.gdescription,\ + IFNULL(t1.count1, 0) useraccount\ + FROM\ + user_group\ + LEFT JOIN (\ + SELECT\ + user_account.group_id,\ + COUNT(*) count1\ + FROM\ + user_account\ + GROUP BY\ + user_account.group_id\ + ) t1 ON user_group.id = t1.group_id\ + ORDER BY\ + user_group.uuid"; + char * glist = select_datebase_by_number(USER_ACCOUNT_DATABASE_ID, getglist_hdbc, USER_GROUP_TABLE, select_sql, 1, 0, &num, 0); + + if (0 == num || NULL == glist) //查询结果为空 + { + cJSON * root = cJSON_CreateObject(); + cJSON * array; + if(!root) + { + return false; + } + + cJSON_AddItemToObject(root, "data", array = cJSON_CreateArray()); + /*{"data":[]}*/ + *group_list = cJSON_Print(root); //在函数外面释放 + + return true; + } + + char * point = (char*)malloc(strlen(glist)+1); + if(NULL == point) + { + return false; + } + memset(point, 0, strlen(glist)+1); + memcpy(point, glist, strlen(glist)+1); + *group_list = point; //在函数外面释放 return true; } /*解析用户组id的json字符串 --> 用户组id*/ -unsigned short id_json2int(char * gid) +unsigned short id_json2int(char * gid, char * para_name) { unsigned short GID_temp = INVALID_INDEX; - if (NULL == gid) + if (NULL == gid || NULL ==para_name) { return GID_temp; } @@ -255,14 +292,15 @@ unsigned short id_json2int(char * gid) return GID_temp; } - cJSON *gid_json = cJSON_GetObjectItem(id_obj, "id"); + cJSON *gid_json = cJSON_GetObjectItem(id_obj, para_name); if(!gid_json) { cJSON_Delete(root); return GID_temp; } GID_temp = gid_json->valueint; - + cJSON_Delete(root); + return GID_temp; } @@ -318,7 +356,7 @@ bool get_group_uuid_by_name(char* gname, unsigned short * group_uuid) /* 删除数据连接 */ discon = disconnect_database(USER_GROUP_DATABASE_ID, ghdbc); //discon记录日志 - if(0 == num) + if(0 == num || NULL == gid) { *group_uuid = INVALID_INDEX; return true; @@ -360,42 +398,6 @@ unsigned short get_groupid_by_name(char* gname, void* hdbc) ARRAYJSON2INT(gid, "id", &GID_temp); -/* cJSON *root = cJSON_Parse(gid); - if(!root) - { - return GID_temp; - } - - cJSON *id_list = cJSON_GetObjectItem(root, "data"); - if(!id_list) - { - cJSON_Delete(root); - return GID_temp; - } - - int id_list_size = cJSON_GetArraySize(id_list); - if(1 != id_list_size) - { - cJSON_Delete(root); - return GID_temp; - } - - cJSON *id_obj = cJSON_GetArrayItem(id_list, 0); - if(!id_obj) - { - cJSON_Delete(root); - return GID_temp; - } - - cJSON *gid_json = cJSON_GetObjectItem(id_obj, "id"); - if(!gid_json) - { - cJSON_Delete(root); - return GID_temp; - } - GID_temp = gid_json->valueint; - cJSON_Delete(root); -*/ return GID_temp; } diff --git a/Platform/user/database/database.c b/Platform/user/database/database.c index 4fee34266..c619ca937 100644 --- a/Platform/user/database/database.c +++ b/Platform/user/database/database.c @@ -219,7 +219,7 @@ int update_database(int module_id, void * db_handle, int op_type, char * tabl return DB_RET_PARAM_ERR; } - SQLAllocHandle(SQL_HANDLE_STMT, db_handle, &hstmt); + ret = SQLAllocHandle(SQL_HANDLE_STMT, db_handle, &hstmt); if ((SQL_INVALID_HANDLE == ret) || (SQL_ERROR == ret)) { return DB_RET_ERR; diff --git a/Product/user/user_manager/usermanager-test/test_usermanager.c b/Product/user/user_manager/usermanager-test/test_usermanager.c index 2c44f80cc..6ec8dc1ca 100644 --- a/Product/user/user_manager/usermanager-test/test_usermanager.c +++ b/Product/user/user_manager/usermanager-test/test_usermanager.c @@ -123,87 +123,118 @@ extern USERACCOUNT g_user_table[USER_INDEX_MAX]; // } -void offline_force(char *userid) -{ - bool ret = redisPubInit(); - if (!ret) - { - printf("Init failed.\n"); - return; - } - - ret = redisPubConnect(); - if (!ret) - { - printf("connect failed."); - return; - } - - // while (true) - // { - // redisPublish(OFFLINE_USER_BY_UID, userid); - // sleep(1); - // } - redisPublish(OFFLINE_USER_BY_UID, userid); - //sleep(1); - redisPubDisconnect(); - redisPubUninit(); - return; -} - -int main1(void) -{ - - offline_force("111"); - offline_force("222"); - offline_force("333"); - return 0; -} - -void test_func_recv(struct RecvMsg_t *mmsg) -{ - if (mmsg->msg) - { - printf("%s,%d,%llu,%s,%d\n", __FUNCTION__, __LINE__, pthread_self(), mmsg->msg, mmsg->len); - freeMsg(mmsg); - } -} - - -void sub_example() -{ - bool ret = redisSubInit(8); - if (!ret) - { - printf("Init failed.\n"); - return; - } - redisRegisterChannelFunc("offuser_by_userid_channel",test_func_recv); - - - ret = redisSubConnect(); - if (!ret) - { - printf("Connect failed.\n"); - return; - } - redisSubscriber("offuser_by_userid_channel"); - - while (true) - { - sleep(1); - } - - redisSubDisconnect(); - redisSubUninit(); - - return; - -} int main(void) { -/* + char * testin; //input + char testout[2000]; //output + ret_code ret_pro; //执行结果 + int outlen = 1; //out数据长度 + + printf("************************************start*******************************************\n"); + printf("初始化用户组:%d\n", init_group()); + printf("初始化用户:%d\n", init_user()); + + printf("************************************新增 group*******************************************\n"); + testin = "{\"type\": 0,\"data\": {\"gname\": \"group01\",\"gdescription\": \"描述group01\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"gname\": \"group02\",\"gdescription\": \"描述group02\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"gname\": \"group03\",\"gdescription\": \"描述group03\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"gname\": \"group04\",\"gdescription\": \"描述group04\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"gname\": \"group05\",\"gdescription\": \"描述group05\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"gname\": \"group06\",\"gdescription\": \"描述group06\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************查询 group 列表*******************************************\n"); + testin = "{\"type\": 4,\"data\": \"\"}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************group name -> group uuid*******************************************\n"); + testin = "{\"type\": 7,\"data\": {\"gname\":\"group04\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************修改 group 描述*******************************************\n"); + testin = "{\"type\": 2,\"data\": {\"gid\": 938,\"gdescription\": \"修改用户组的描述\"}}"; + ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************新增 user*******************************************\n"); + testin = "{\"type\": 0,\"data\": {\"uname\": \"user01\",\"gname\": \"group01\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"uname\": \"user00\",\"gname\": \"group01\",\"udesp\": \"用户描述\",\"pwd\": \"A31as%4Gb\",\"multi\":0,\"valid\":1, \"valid_begin_time\": \"2013-07-04 15:04:23\",\"valid_end_time\": \"2020-07-04 15:04:23\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"uname\": \"user02\",\"gname\": \"group02\",\"pwd\": \"123456\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"uname\": \"user03\",\"gname\": \"group03\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + testin = "{\"type\": 0,\"data\": {\"uname\": \"user04\",\"gname\": \"group04\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************修改 user web*******************************************\n"); + testin = "{\"type\": 2,\"data\": {\"ID\":3,\"GID\":938,\"resetpwd\":0,\"uname\": \"user02\",\"gname\": \"group01\",\"udescription\": \"修改用户描述\",\"passwd\": \"A31as%4Gb\",\"multi\":0,\"valid\":1, \"valid_begin_time\": \"2013-07-04 15:04:23\",\"valid_end_time\": \"2020-07-04 15:04:23\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************查询 user list*******************************************\n"); + testin = "{\"type\": 4,\"data\":{\"group_id\": 0, \"user_name\": \"3\",\"page_start\": 1,\"page_counts\": 20}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************user name -> user uuid*******************************************\n"); + testin = "{\"type\": 7,\"data\":{\"uname\": \"user03\"}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************user uuid -> user 详情*******************************************\n"); + testin = "{\"type\": 3,\"data\":{\"user_id\": 2}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + + printf("\n************************************移动分组*******************************************\n"); + testin = "{\"type\": 6,\"data\":{\"user_id\": [2],\"batch\":{\"all\":1,\"old_group_id\":0},\"new_group_id\":927}}"; + ret_pro = user_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + +} + +int main2(void) +{ + int ID = 1; int GID_temp = 2; char *uname = "xiaoming"; @@ -233,7 +264,7 @@ int main(void) // DB_DATA_STRING_TYPE, strlen(valid_end_time)+1,valid_end_time); // printf("ret_adduser = %d .\n",ret_adduser); - +/* char * aa = "户"; int len = strlen(aa)+strlen("*")*2+1; char user_name_para[len]; @@ -245,23 +276,67 @@ int main(void) int rett = create_database_table(1, adduser_hdbc, "ctest", "create table ctest ( id bigint, fl double, dt character(10), status character(7))"); - retptr1 = select_datebase_by_number(1, adduser_hdbc, "user_account", "SELECT * FROM `user_account` WHERE user_name LIKE ?", 1, 0, &num1, 1, - DB_DATA_STRING_TYPE, 20, user_name_para); + retptr1 = select_datebase_by_number(1, adduser_hdbc, "user_account", "SELECT id FROM `user_account` WHERE user_name LIKE ?", 1, 0, &num1, 2, + DB_DATA_STRING_TYPE, 20, user_name_para, + DB_DATA_STRING_TYPE, 20, aa); //printf("长度:%d \n",strlen(retptr1)); - disconnect_database(USER_ACCOUNT_DATABASE_ID, adduser_hdbc); - printf("%d\n",rett); - printf("user = %s\n", retptr1); + char * moveug_sql = "UPDATE `user_account` \ + SET group_id = ( \ + SELECT \ + user_group.id \ + FROM \ + user_group \ + WHERE \ + user_group.uuid = ? \ + ) \ + WHERE \ + uuid = ?"; + int new_group_uuid = 712; + int user_uuid[1] = {3}; + unsigned short *user_uuid_1 = user_uuid; + int temp_i = 0; + rett = update_database(1, adduser_hdbc, DB_OP_UPDATE, USER_TABLE, moveug_sql, 2, + DB_DATA_INT_TYPE, sizeof(new_group_uuid), new_group_uuid, + DB_DATA_INT_TYPE, sizeof(user_uuid_1[temp_i]), user_uuid_1[temp_i]); + + printf("更新用户组id结果:%d\n",rett); + + //printf("user = %s\n", retptr1); + + char * sele_sql = "SELECT \ + user_group.uuid gid,\ + user_group.gname,\ + user_group.gdescription,\ + IFNULL(t1.count1, 0) useraccount\ + FROM\ + user_group\ + LEFT JOIN (\ + SELECT\ + user_account.group_id,\ + COUNT(*) count1\ + FROM\ + user_account\ + GROUP BY\ + user_account.group_id\ + ) t1 ON user_group.id = t1.group_id\ + ORDER BY\ + user_group.uuid"; + + retptr1 = select_datebase_by_number(1, adduser_hdbc, "user_account", sele_sql, 1, 0, &num1, 0); + //printf("user = %s\n", retptr1); + disconnect_database(USER_ACCOUNT_DATABASE_ID, adduser_hdbc); return 0; */ - + +int outsize; char output7[5000]; - char *testin7 = "{\"type\": 4,\"data\":{\"group_id\": 693, \"user_name\": \"户0\",\"page_start\": 1,\"page_counts\": 10}}"; + char *testin7 = "{\"type\": 4,\"data\":{\"group_id\": 0, \"user_name\": \"\",\"page_start\": 1,\"page_counts\": 20}}"; int a7 = 1; ret_code c7 = user_config_proc(1, 1, testin7, strlen(testin7)+1, output7, &a7); - +outsize = strlen(output7); printf("*******************************************************************************\n"); - printf("这里是个测试第7次结果,查询:%d\n", c7); + printf("这里是个测试第7次结果,查询用户列表,查询结果:%d\n", c7); printf("%s\n", output7); printf("*******************************************************************************\n"); @@ -271,7 +346,7 @@ int main(void) ret_code c8 = user_config_proc(1, 1, testin8, strlen(testin8)+1, output8, &a8); printf("*******************************************************************************\n"); - printf("这里是个测试第8次结果,查询:%d\n", c8); + printf("这里是个测试第8次结果,根据用户名->用户uuid,查询结果:%d\n", c8); printf("%s\n", output8); printf("*******************************************************************************\n"); @@ -282,7 +357,7 @@ int main(void) ret_code c9 = usergroup_config_proc(1, 1, testin9, strlen(testin9)+1, output9, &a9); printf("*******************************************************************************\n"); - printf("这里是个测试第9次结果,查询:%d\n", c9); + printf("这里是个测试第9次结果,根据用户组名->用户组uuid,查询结果:%d\n", c9); printf("%s\n", output9); printf("*******************************************************************************\n"); @@ -292,10 +367,49 @@ int main(void) ret_code c10 = user_config_proc(1, 1, testin10, strlen(testin10)+1, output10, &a10); printf("*******************************************************************************\n"); - printf("这里是个测试第10次结果,查询:%d\n", c10); + printf("这里是个测试第10次结果,根据用户uuid->用户详情,查询结果:%d\n", c10); printf("%s\n", output10); printf("*******************************************************************************\n"); + char output11[200]; + char *testin11 = "{\"type\": 6,\"data\":{\"user_id\": [3,4,5],\"batch\":{\"all\":1,\"old_group_id\":0},\"new_group_id\":717}}"; + int a11 = 1; + ret_code c11 = user_config_proc(1, 1, testin11, strlen(testin11)+1, output11, &a11); + + printf("*******************************************************************************\n"); + printf("这里是个测试第11次结果,移动分组,结果:%d\n", c11); + printf("%s\n", output11); + printf("*******************************************************************************\n"); + + char output12[2000]; + char *testin12 = "{\"type\": 4,\"data\":\"\"}"; + int a12 = 1; + ret_code c12 = usergroup_config_proc(1, 1, testin12, strlen(testin12)+1, output12, &a12); +outsize = strlen(output12); + printf("*******************************************************************************\n"); + printf("这里是个测试第12次结果,用户组列表,查询结果:%d\n", c12); + printf("%s\n", output12); + printf("*******************************************************************************\n"); + + char output13[100]; + char *testin13 = "{\"type\":2,\"data\":{\"ID\":4,\"GID\":811,\"uname\":\"用户06\",\"gname\":\"aaa03\",\"resetpwd\":1,\"passwd\":\"A31as%4Gb\",\ + \"udescription\":\"测试修改描述\",\"multi\":1,\"valid\":1,\"valid_begin_time\":\"2018-01-01 00:00:00\",\"valid_end_time\":\"2019-01-01 00:00:00\"}}"; + int a13 = 1; + ret_code c13 = user_config_proc(1, 1, testin13, strlen(testin13)+1, output13, &a13); + printf("*******************************************************************************\n"); + printf("这里是个测试第13次结果,修改用户,结果:%d\n", c13); + printf("%s\n", output13); + printf("*******************************************************************************\n"); + + char output14[100]; + char *testin14 = "{\"type\": 2,\"data\":{\"gid\":835,\"gdescription\":\"111\"}}"; + int a14 = 1; + ret_code c14 = usergroup_config_proc(1, 1, testin14, strlen(testin14)+1, output14, &a14); + printf("*******************************************************************************\n"); + printf("这里是个测试第14次结果,修改用户组描述,结果:%d\n", c14); + printf("%s\n", output14); + printf("*******************************************************************************\n"); + return 0; @@ -317,35 +431,35 @@ int main(void) //USERGROUP U[22] = { 0 }; int gsize = get_group_count(); - USERGROUP* U; - U = (USERGROUP*)malloc(sizeof(USERGROUP) * gsize); - if (NULL == U) - { - printf("shibaile"); - } + // USERGROUP* U; + // U = (USERGROUP*)malloc(sizeof(USERGROUP) * gsize); + // if (NULL == U) + // { + // printf("shibaile"); + // } - show_group_list(U); - for (int i = 0; i < gsize; i++) - { - printf("第 %d 用户组 ID : %d, NAME: %s, 描述:%s \n", i, U[i].ID, U[i].gname, U[i].gdescription); - } + //show_group_list(U); + // for (int i = 0; i < gsize; i++) + // { + // printf("第 %d 用户组 ID : %d, NAME: %s, 描述:%s \n", i, U[i].ID, U[i].gname, U[i].gdescription); + // } // char* name1 = { "aaa18" }; // printf("删除一个组:%s, %d\n", name1, del_group_by_name(name1)); // printf("删除一个组:%s, %d\n", "aaa03", del_group_by_name("aaa03")); // printf("删除一个组:%s, %d\n", "aaaa03", del_group_by_name("aaaa03")); - printf("增加一个用户组:%d\n", add_group("aaa30", "就爱看九分阿道夫就卡了阿道夫阿道夫就")); - printf("增加一个用户组:%d\n", add_group("aaa31", "描述31")); - printf("增加一个用户组:%d\n", add_group("aaa32", "描述31")); - printf("增加一个用户组:%d\n", add_group("aaa13", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa14", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa15", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa16", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa17", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa18", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa18", "描述04")); - printf("增加一个用户组:%d\n", add_group("aaa20", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa30", "就爱看九分阿道夫就卡了阿道夫阿道夫就")); + // printf("增加一个用户组:%d\n", add_group("aaa31", "描述31")); + // printf("增加一个用户组:%d\n", add_group("aaa32", "描述31")); + // printf("增加一个用户组:%d\n", add_group("aaa13", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa14", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa15", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa16", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa17", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa18", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa18", "描述04")); + // printf("增加一个用户组:%d\n", add_group("aaa20", "描述04")); //printf("增加一个用户组:%d\n", add_group("aaa21", "描述04")); char *testgroupin = "{\"type\": 0,\"data\": {\"gname\": \"aaa21\",\"gdescription\": \"xxx\"}}"; @@ -373,18 +487,18 @@ int main(void) gsize = get_group_count(); - USERGROUP* U1; - U1 = (USERGROUP*)malloc(sizeof(USERGROUP) * gsize); - if (NULL == U1) - { - printf("shibaile"); - } + // USERGROUP* U1; + // U1 = (USERGROUP*)malloc(sizeof(USERGROUP) * gsize); + // if (NULL == U1) + // { + // printf("shibaile"); + // } - show_group_list(U1); - for (int i = 0; i < gsize; i++) - { - printf("第 %d 用户组 ID : %d, NAME: %s, 描述:%s \n", i, U1[i].ID, U1[i].gname, U1[i].gdescription); - } + //show_group_list(U1); + // for (int i = 0; i < gsize; i++) + // { + // printf("第 %d 用户组 ID : %d, NAME: %s, 描述:%s \n", i, U1[i].ID, U1[i].gname, U1[i].gdescription); + // } @@ -413,7 +527,7 @@ int main(void) USERADD* addUserResullt; addUserResullt = (USERADD*)malloc(sizeof(USERADD)); - printf("sizeof(USERADD): %d\n",sizeof(USERADD)); + printf("sizeof(USERADD): %ld\n",sizeof(USERADD)); memset(addUserResullt, 0, sizeof(USERADD)); if (NULL == addUserResullt) @@ -691,7 +805,7 @@ int main(void) DB_DATA_INT_TYPE, 8, 2); printf("num_sql = %d \n", num_sql); - printf("test_hdbc = %s \n", test_hdbc); + printf("test_hdbc = %p \n", test_hdbc); //printf("ret_sql = %s \n",ret_sql); /* 创建table, 其中列类型包括长整形、浮点型、字符串 */