Explorar el Código

1、hash表增加防重及容错处理
2、读数据库错误时增加容错处理
3、修改mac地址报警字符串的拼接方式

guohui hace 2 años
padre
commit
df4f1da652

+ 2 - 3
pro/src/app.c

@@ -61,8 +61,7 @@ void* power_thread(void* arg)
     _PowerDSManage_t* _powerDsManageTemp = NULL ;
     dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strPower);       // 查询日志最大点
     dev_search_last_Index(_globalDeviceManager->db, &nSaveTacIndex, strTacPower); // 查询日志最大点
-    _globalDeviceManager->_global_alarmLanguage=create_hash_table(500);
-    InitHashTable(_globalDeviceManager->_global_alarmLanguage);
+    InitHashTable(_globalDeviceManager);
     unsigned int samp_time = _globalDeviceManager->_globalDevInfo.product_samp_time;
     unsigned int usleepTime = samp_time*1000;
     unsigned int sSaveTime = _globalDeviceManager->_globalDevInfo.product_save_time;
@@ -924,7 +923,7 @@ void* power_thread(void* arg)
         //延时
         //usleep(samp_time*1000);
     }
-    free_hash_table(_globalDeviceManager->_global_alarmLanguage);
+    free_hash_table(_globalDeviceManager->alarmTab);
     log_e("Error!!!!!!!!!!!!!!Thread End");
     pthread_exit(NULL);
 }

+ 154 - 126
pro/src/appweb_handle.c

@@ -673,15 +673,17 @@ static void overallStatusMonitoring(void* conn)
             {
                 log_e("serach total voltage err.");
             }
-                    // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pall->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
-                pall->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
-            }
+            else {
+                        // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pall->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
+                    pall->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+                }
 
-            // 返回电压统计
-            ack_str = over_all_total_info_to_json(pall, TOTAL_VOLTAGE_TYPE);
+                // 返回电压统计
+                ack_str = over_all_total_info_to_json(pall, TOTAL_VOLTAGE_TYPE);
+            }
         }
         else
         {
@@ -690,15 +692,17 @@ static void overallStatusMonitoring(void* conn)
             {
                 log_e("serach total voltage err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pall->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
-                pall->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pall->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
+                    pall->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+                }
 
-            // 返回电压统计
-            ack_str = over_all_total_info_to_json(pall, TOTAL_VOLTAGE_TYPE);
+                // 返回电压统计
+                ack_str = over_all_total_info_to_json(pall, TOTAL_VOLTAGE_TYPE);
+            }
         }
     }
     //电流统计
@@ -1444,14 +1448,16 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total power voltage err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
-                pch->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
+                    pch->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+                }
+                // 返回电压统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_VOLTAGE_TYPE);
             }
-            // 返回电压统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_VOLTAGE_TYPE);
         }
         else
         {
@@ -1459,14 +1465,16 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total voltage err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
-                pch->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_voltage.xAxis[i], __globalPowerInfo._total_voltage.xAxis[i]);
+                    pch->_total_voltage.ydata[i] = __globalPowerInfo._total_voltage.ydata[i];
+                }
+                // 返回电压统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_VOLTAGE_TYPE);
             }
-            // 返回电压统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_VOLTAGE_TYPE);
         }
 
     }
@@ -1508,15 +1516,17 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total power current err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_current.xAxis[i], __globalPowerInfo._total_current.xAxis[i]);
-                pch->_total_current.ydata[i] = __globalPowerInfo._total_current.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_current.xAxis[i], __globalPowerInfo._total_current.xAxis[i]);
+                    pch->_total_current.ydata[i] = __globalPowerInfo._total_current.ydata[i];
+                }
 
-            // 返回电流统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_CURRENT_TYPE);
+                // 返回电流统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_CURRENT_TYPE);
+            }
         }
         else
         {
@@ -1525,15 +1535,17 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total current err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_current.xAxis[i], __globalPowerInfo._total_current.xAxis[i]);
-                pch->_total_current.ydata[i] = __globalPowerInfo._total_current.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_current.xAxis[i], __globalPowerInfo._total_current.xAxis[i]);
+                    pch->_total_current.ydata[i] = __globalPowerInfo._total_current.ydata[i];
+                }
 
-            // 返回电流统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_CURRENT_TYPE);
+                // 返回电流统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_CURRENT_TYPE);
+            }
         }
     }
     //功率统计
@@ -1574,15 +1586,17 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total power  err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_power.xAxis[i], __globalPowerInfo._total_power.xAxis[i]);
-                pch->_total_power.ydata[i] = __globalPowerInfo._total_power.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_power.xAxis[i], __globalPowerInfo._total_power.xAxis[i]);
+                    pch->_total_power.ydata[i] = __globalPowerInfo._total_power.ydata[i];
+                }
 
-            // 返回功率统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_TYPE);
+                // 返回功率统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_TYPE);
+            }
         }
         else
         {
@@ -1591,15 +1605,17 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total power err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_power.xAxis[i], __globalPowerInfo._total_power.xAxis[i]);
-                pch->_total_power.ydata[i] = __globalPowerInfo._total_power.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_power.xAxis[i], __globalPowerInfo._total_power.xAxis[i]);
+                    pch->_total_power.ydata[i] = __globalPowerInfo._total_power.ydata[i];
+                }
 
-            // 返回功率统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_TYPE);
+                // 返回功率统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_TYPE);
+            }
         }
     }
     //耗电量统计
@@ -1639,16 +1655,17 @@ static void channelStatusMonitoring(void* conn)
             if (dev_search_time_t_ac_power_info(__globalDeviceManage.db, __globalDeviceManage._globalDevInfo.product_id, product_chn_id, ph_id, TOTAL_POWER_CONS_TYPE, &__globalPowerInfo, _over_chn_pwr_request.start_time, _over_chn_pwr_request.end_time) != 0)
             {
                 log_e("serach total power  err.");
-            }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_consumption.xAxis[i], __globalPowerInfo._total_consumption.xAxis[i]);
-                pch->_total_consumption.ydata[i] = __globalPowerInfo._total_consumption.ydata[i];
-            }
+            } 
+            else {
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_consumption.xAxis[i], __globalPowerInfo._total_consumption.xAxis[i]);
+                    pch->_total_consumption.ydata[i] = __globalPowerInfo._total_consumption.ydata[i];
+                }
 
-            // 返回耗电量统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_CONS_TYPE);
+                // 返回耗电量统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_CONS_TYPE);
+            }
         }
         else
         {
@@ -1657,15 +1674,17 @@ static void channelStatusMonitoring(void* conn)
             {
                 log_e("serach total power consumption err.");
             }
-            // 传值给总管理结构体
-            for (int i = 0; i < TOTAL_COUNT; i++)
-            {
-                strcpy(pch->_total_consumption.xAxis[i], __globalPowerInfo._total_consumption.xAxis[i]);
-                pch->_total_consumption.ydata[i] = __globalPowerInfo._total_consumption.ydata[i];
-            }
+            else {
+                // 传值给总管理结构体
+                for (int i = 0; i < TOTAL_COUNT; i++)
+                {
+                    strcpy(pch->_total_consumption.xAxis[i], __globalPowerInfo._total_consumption.xAxis[i]);
+                    pch->_total_consumption.ydata[i] = __globalPowerInfo._total_consumption.ydata[i];
+                }
 
-            // 返回耗电量统计
-            ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_CONS_TYPE);
+                // 返回耗电量统计
+                ack_str = over_all_total_info_to_json(pch, TOTAL_POWER_CONS_TYPE);
+            }
         }
     }
     else if(strcmp(_over_chn_pwr_request.type,"threeTypeSave")==0)
@@ -2323,20 +2342,21 @@ static void alarmProtect(void *conn)
             __globalDeviceManage._globalDevInfo.product_id,
             0,1,10,
             &_alarm_ack_info,&nAlarmNumber);
-        if(ret!=0)
+        if(ret!=0) {
             log_e("get power alarm error.");
-        //转换参数
-        ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
-
-        //释放资源
-        _AlarmAckInfo* node;
-        _AlarmAckInfo* next;
-        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-        {
-            list_del(&node->list);
-            free(node);
-        } 
+        }
+        else {
+            ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
+            //释放资源
+            _AlarmAckInfo* node;
+            _AlarmAckInfo* next;
+            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+            {
+                list_del(&node->list);
+                free(node);
+            }
+        }
     }
     else if(strcmp(_alarm_request_info.type,"powerAlarmList")==0) //电源告警信息查询
     {
@@ -2347,19 +2367,21 @@ static void alarmProtect(void *conn)
             __globalDeviceManage._globalDevInfo.product_id,
             0,_alarm_request_info.pagenum,_alarm_request_info.pagesize,
             &_alarm_ack_info,&nAlarmNumber);
-        if(ret!=0)
+        if(ret!=0) {
             log_e("get power alarm error.");
-        //转换参数
-        ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
+        }
+        else {
+            ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
-        //释放资源
-        _AlarmAckInfo* node;
-        _AlarmAckInfo* next;
-        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-        {
-            list_del(&node->list);
-            free(node);
-        } 
+            //释放资源
+            _AlarmAckInfo* node;
+            _AlarmAckInfo* next;
+            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+            {
+                list_del(&node->list);
+                free(node);
+            }
+        }
     }
     else if(strcmp(_alarm_request_info.type,"sensorAlarmList")==0) //传感器告警信息查询
     {
@@ -2370,43 +2392,49 @@ static void alarmProtect(void *conn)
             __globalDeviceManage._globalDevInfo.product_id,
             1,_alarm_request_info.pagenum,_alarm_request_info.pagesize,
             &_alarm_ack_info,&nAlarmNumber);
-        if(ret!=0)
+        if(ret!=0) {
             log_e("get sensor alarm error.");
-        //转换参数
-        ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
+        }
+        else {
+            ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
-        //释放资源
-        _AlarmAckInfo* node;
-        _AlarmAckInfo* next;
-        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-        {
-            list_del(&node->list);
-            free(node);
-        } 
+            //释放资源
+            _AlarmAckInfo* node;
+            _AlarmAckInfo* next;
+            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+            {
+                list_del(&node->list);
+                free(node);
+            }
+        }
     }
     else if(strcmp(_alarm_request_info.type,"networAlarmkList")==0) //网络告警信息查询
     {
         //初始化表
         INIT_LIST_HEAD(&_alarm_ack_info.list);
-        //查询数据库
+        
         ret = dev_serarch_all_alarm(__globalDeviceManage.db,
             __globalDeviceManage._globalDevInfo.product_id,
             2,_alarm_request_info.pagenum,_alarm_request_info.pagesize,
             &_alarm_ack_info,&nAlarmNumber);
-        if(ret!=0)
+        if(ret!=0) {
             log_e("get net alarm error.");
-        //转换参数
-        ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
-
-        //释放资源
-        _AlarmAckInfo* node;
-        _AlarmAckInfo* next;
-        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-        {
-            list_del(&node->list);
-            free(node);
-        } 
+        }
+        else {
+            //转换参数
+            printf("___ 1111, %d\n", nAlarmNumber);
+            ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
+            printf("___ 2222, %d\n", nAlarmNumber);
 
+            //释放资源
+            _AlarmAckInfo* node;
+            _AlarmAckInfo* next;
+            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+            {
+                list_del(&node->list);
+                free(node);
+            }
+        }
     }
     else if(strcmp(_alarm_request_info.type,"powerThresholdList")==0)//电源阈值查询
     {

+ 1 - 1
pro/src/common.h

@@ -921,7 +921,7 @@ typedef struct
 
     bool                 ws_isok; //ws准备好
     struct mg_connection *ws_client;   //websocket管理信息
-    HashTable*           _global_alarmLanguage; //全局的报警映射
+    HashTable*           alarmTab; //全局的报警映射
     int                 nTreeACLshow; //三项总数据显示L1=0,L2=1,L3=2
     pthread_t           snmp_agent_thread;//SNMP代理线程
     bool                _ReloadChm_flag; //重新加载端口数据

+ 134 - 37
pro/src/json_handle.c

@@ -2169,6 +2169,7 @@ char *over_all_data_t_ac_to_json(_OverAllPwrAckInfo *_over_all_pwr_back_info,_Ov
         if (dev_search_time_t_ac_power_info(__globalDeviceManage.db, __globalDeviceManage._globalDevInfo.product_id, 0,i,total_type, &__globalPowerInfo,_over_all_sts_monitor->start_time,_over_all_sts_monitor->end_time) != 0)
         {
             log_e("serach total voltage err.");
+            continue;
         }
 
         switch (total_type)
@@ -3075,6 +3076,7 @@ char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAllNumber)
     char temp[8] = {0};
     struct list_head *pos;
     _AlarmAckInfo* _temp;
+
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     // 添加基本键值对
@@ -3084,6 +3086,7 @@ char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAllNumber)
     //循环添加数据
     list_for_each_entry(_temp, &_alarm_ack_info->list, list)
     {
+ #if 1
         cJSON* data_filed = cJSON_CreateObject();
 
         cJSON_AddStringToObject(data_filed,"alarmNumber",_temp->alarmNumber);
@@ -3104,10 +3107,10 @@ char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAllNumber)
 
         cJSON_AddStringToObject(data_filed,"deviceNumber",_temp->deviceNumber);
         cJSON_AddStringToObject(data_filed,"deviceName",_temp->deviceName);  
-        
-        replace_sequences(_temp->alarmContent,__globalDeviceManage._global_alarmLanguage);
+        replace_sequences(_temp->alarmContent, __globalDeviceManage.alarmTab);
         cJSON_AddStringToObject(data_filed,"alarmContent",_temp->alarmContent);
         cJSON_AddItemToObject(data_root_array, "data", data_filed);
+#endif
     }
     //数据总数
     cJSON_AddNumberToObject(root, "total", nAllNumber);     
@@ -3154,7 +3157,7 @@ char* alarm_type_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAlarmNum)
         
         cJSON_AddStringToObject(data_filed,"deviceNumber",_temp->deviceNumber);
         cJSON_AddStringToObject(data_filed,"deviceName",_temp->deviceName);
-        replace_sequences(_temp->alarmContent,__globalDeviceManage._global_alarmLanguage);
+        replace_sequences(_temp->alarmContent,__globalDeviceManage.alarmTab);
         switch (_temp->alarmType)
         {
             case 0:cJSON_AddStringToObject(data_filed,"alarmContent",_temp->alarmContent);break;
@@ -3199,7 +3202,7 @@ char* alarm_ctrl_type_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAlarmNum)
         cJSON* data_filed = cJSON_CreateObject();
         cJSON_AddStringToObject(data_filed,"title",_temp->alarmNumber);
         cJSON_AddStringToObject(data_filed,"operName","");
-        replace_sequences(_temp->alarmContent,__globalDeviceManage._global_alarmLanguage);
+        replace_sequences(_temp->alarmContent,__globalDeviceManage.alarmTab);
         cJSON_AddStringToObject(data_filed,"operLocation",_temp->alarmContent);
         cJSON_AddStringToObject(data_filed,"operTime",_temp->alarmDate);
         // sprintf(temp,"%d",_temp->alarmType);
@@ -5099,44 +5102,138 @@ char* service_userRole_ack_to_json(char* _userName,UserInfo* __UserInfo_t,RoleIn
     return str;
 }
 
-void InitHashTable(HashTable *table)
+int InitHashTable(GlobalDeviceManager *gdm)
 {
-    int nMaxSize=4;
-    insert_Newhash(table,(const char*)language_alarm_Ch[0],language_alarm_Ch,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_V[0],language_alarm_V,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_A[0],language_alarm_A,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_W[0],language_alarm_W,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_P[0],language_alarm_P,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Up[0],language_alarm_Up,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Down[0],language_alarm_Down,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_ctrl_Open[0],language_alarm_ctrl_Open,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_ctrl_Close[0],language_alarm_ctrl_Close,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Ctrl_ALL[0],language_alarm_Ctrl_ALL,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_connect_ERROR[0],language_alarm_connect_ERROR,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Init_Success[0],language_alarm_Init_Success,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_NULL_ERROR[0], language_alarm_NULL_ERROR, nMaxSize);
+    int r,nMaxSize=4;
+    int retry=0,step=100,cnt;
+    HashTable *table=NULL;
+
+    if(gdm==NULL) {
+        return -1;
+    }
+    gdm->alarmTab = NULL;
+
+retry:
+    cnt = step*(retry+1);
+    printf("___ hash table init, retry: %d, table size: %d\n", retry, cnt);
+    table = create_hash_table(cnt);
+    if(table==NULL) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Ch[0],language_alarm_Ch,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_V[0],language_alarm_V,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_A[0],language_alarm_A,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_W[0],language_alarm_W,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_P[0],language_alarm_P,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Up[0],language_alarm_Up,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Down[0],language_alarm_Down,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_ctrl_Open[0],language_alarm_ctrl_Open,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_ctrl_Close[0],language_alarm_ctrl_Close,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Ctrl_ALL[0],language_alarm_Ctrl_ALL,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_connect_ERROR[0],language_alarm_connect_ERROR,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Init_Success[0],language_alarm_Init_Success,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_NULL_ERROR[0], language_alarm_NULL_ERROR, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //13
-    insert_Newhash(table,(const char*)language_temperature[0], language_temperature, nMaxSize);
-    insert_Newhash(table,(const char*)language_humidity[0], language_humidity, nMaxSize);
-    insert_Newhash(table,(const char*)language_atmosphere_gas[0], language_atmosphere_gas, nMaxSize);
-    insert_Newhash(table,(const char*)language_atmosphere_airflow[0], language_atmosphere_airflow, nMaxSize);
-    insert_Newhash(table,(const char*)language_atmosphere_pressure[0], language_atmosphere_pressure, nMaxSize);
+    r = insert_Newhash(table,(const char*)language_temperature[0], language_temperature, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_humidity[0], language_humidity, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_atmosphere_gas[0], language_atmosphere_gas, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_atmosphere_airflow[0], language_atmosphere_airflow, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_atmosphere_pressure[0], language_atmosphere_pressure, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //18
-    insert_Newhash(table,(const char*)language_RS485_install[0], language_RS485_install, nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_RS485_master[0], language_alarm_RS485_master, nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_RS485_slave[0], language_alarm_RS485_slave, nMaxSize);
-    insert_Newhash(table,(const char*)language_NTP_install[0], language_NTP_install, nMaxSize);
+    r = insert_Newhash(table,(const char*)language_RS485_install[0], language_RS485_install, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_RS485_master[0], language_alarm_RS485_master, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_RS485_slave[0], language_alarm_RS485_slave, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_NTP_install[0], language_NTP_install, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //22
-    insert_Newhash(table,(const char*)language_alarm_ctrl_OpenCH[0],language_alarm_ctrl_OpenCH,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_ctrl_CloseCH[0],language_alarm_ctrl_CloseCH,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_ctrl_Alarm[0],language_alarm_ctrl_Alarm,nMaxSize);
+    r = insert_Newhash(table,(const char*)language_alarm_ctrl_OpenCH[0],language_alarm_ctrl_OpenCH,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_ctrl_CloseCH[0],language_alarm_ctrl_CloseCH,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_ctrl_Alarm[0],language_alarm_ctrl_Alarm,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //25
-    insert_Newhash(table,(const char*)language_alarm_Type_Power[0],language_alarm_Type_Power,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Type_Sensor[0],language_alarm_Type_Sensor,nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_Type_Network[0],language_alarm_Type_Network,nMaxSize);
+    r = insert_Newhash(table,(const char*)language_alarm_Type_Power[0],language_alarm_Type_Power,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Type_Sensor[0],language_alarm_Type_Sensor,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_Type_Network[0],language_alarm_Type_Network,nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //28
-    insert_Newhash(table,(const char*)language_alarm_phaseA_lose[0], language_alarm_phaseA_lose, nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_phaseB_lose[0], language_alarm_phaseB_lose, nMaxSize);
-    insert_Newhash(table,(const char*)language_alarm_phaseC_lose[0], language_alarm_phaseC_lose, nMaxSize);
+    r = insert_Newhash(table,(const char*)language_alarm_phaseA_lose[0], language_alarm_phaseA_lose, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_phaseB_lose[0], language_alarm_phaseB_lose, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    r = insert_Newhash(table,(const char*)language_alarm_phaseC_lose[0], language_alarm_phaseC_lose, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
     //31
+    r = insert_Newhash(table,(const char*)language_alarm_MAC_changed[0], language_alarm_MAC_changed, nMaxSize);
+    if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
+
+    gdm->alarmTab = table;
+
+    log_d("___ hash table init OK, table size: %d\n", table->size);
+    return 0;
+
+repeat:
+    retry++;
+    free_hash_table(table);
+    goto retry;
+
+failed:
+    free_hash_table(table);
+    
+
+    return -1;
 }

+ 1 - 1
pro/src/json_handle.h

@@ -605,7 +605,7 @@ char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_
 
 int json_to_switch_language(const char* str);
 
-void InitHashTable(HashTable *table);
+int InitHashTable(GlobalDeviceManager *gdm);
 
 
 int GetRoleIDByUserName(char* _userName,UserInfo* __UserInfo_t);

+ 3 - 3
pro/src/language_common.c

@@ -566,9 +566,9 @@ const char language_alarm_RS485_slave[LANGUAGE_TYPE][LANGUAGE_SIZE] =
 
 const char language_alarm_MAC_changed[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
 {
-    "MAC地址变化, 从 %s 到 %s",
-    "MAC address changed, from %s to %s",
-    "MAC - адрес изменен с% s на% s",
+    "MAC地址变化",
+    "MAC address changed",
+    "MAC - адрес изменен",
     " "
 } ;
 

+ 38 - 11
pro/src/language_hashmap.c

@@ -13,33 +13,60 @@ unsigned int _hash(HashTable *table,const char *key)
 }  
 HashTable *create_hash_table(int size) 
 {  
-    HashTable *table = (HashTable *)malloc(sizeof(HashTable));  
-    table->size = size;  
-    table->ptable = (HashEntry **)malloc(size*sizeof(HashEntry *));  
+    HashTable *table = (HashTable *)malloc(sizeof(HashTable));
+    if(table) {  
+        table->size = size;  
+        table->ptable = (HashEntry **)calloc(1, size*sizeof(HashEntry *));
+        if(table->ptable==NULL) {
+            free(table);
+            return NULL;
+        }
+    }
     return table;  
 }  
   
 // 在哈希表中插入键值对  
-void insert_Newhash(HashTable *table, const char *key, const char value[][64],int valuelens) 
+int insert_Newhash(HashTable *table, const char *key, const char value[][64],int valuelens) 
 {   
-    unsigned int index = _hash(table,key);  
+    unsigned int index = _hash(table,key);
+    
+    if(table->ptable[index]) {
+        printf("hash value is repeat, index: %d, ___%s___, ___%s___\n", index, table->ptable[index]->key, key);
+        return HASH_REPEAT;
+    }
+
     HashEntry *entry = (HashEntry *)malloc(sizeof(HashEntry));  
+    if(entry==NULL) {
+        return HASH_MALLOC_FAIL;
+    }
+
     entry->key = strdup(key);  
-    entry->value=(char**)malloc(sizeof(char*)*valuelens);
+    entry->value = (char**)malloc(sizeof(char*)*valuelens);
+    if(entry->value==NULL) {
+        free(entry);
+        return HASH_MALLOC_FAIL;
+    }
+
     for (int i = 0; i < valuelens; i++)
     {
         entry->value[i] = strdup(value[i]);  
     }   
-    entry->valueLength=valuelens;
+    entry->valueLength = valuelens;
     entry->next = table->ptable[index];  
     table->ptable[index] = entry;
     
-    //printf("___%s, index: %d\n", key, index);
+    //printf("___key: %s, index: %d\n", key, index);
+    return HASH_OK;
 }  
   
 // 在哈希表中查找键对应的值  
 const HashEntry*find_hash(HashTable *table, const char *key) {  
-    unsigned int index = _hash(table,key);  
+    unsigned int index = _hash(table,key);
+    
+    if(index>=table->size) {
+        return NULL;
+    }
+
     HashEntry *entry = table->ptable[index];  
     while (entry && entry->key) {  
         if (strcmp(entry->key, key) == 0) {  
@@ -47,7 +74,7 @@ const HashEntry*find_hash(HashTable *table, const char *key) {
         }  
         entry = entry->next;  
     }  
-    return 0;  
+    return NULL;  
 }  
   
 // 释放哈希表占用的内存  
@@ -80,7 +107,7 @@ void replace_sequences(char *str, HashTable *table) {
             // 去除包裹的`$`符号,并查找替换值  
             char *key = strdup(token + 1); // 跳过开头的`$`  
             key[strlen(key) - 1] = '\0'; // 去除结尾的`$`  
-            const char *replacement; 
+            const char *replacement=NULL; 
             HashEntry* pEnty= (HashEntry*)find_hash(table, key);
             if (pEnty)
             {

+ 8 - 1
pro/src/language_hashmap.h

@@ -4,6 +4,13 @@
 #define MAX_LEN 1024  
 #define DELIMITER "|"
 
+enum {
+    HASH_OK=0,
+    HASH_REPEAT=-1,
+    HASH_OVERFLOW=-2,
+    HASH_MALLOC_FAIL=-3,
+};
+
 typedef struct HashEntry 
 {  
     char *key;  
@@ -25,7 +32,7 @@ unsigned int _hash(HashTable *table,const char *key) ;
 HashTable *create_hash_table(int size);
   
 // 在哈希表中插入键值对  
-void insert_Newhash(HashTable *table, const char *key, const char value[][64],int valuelens);
+int insert_Newhash(HashTable *table, const char *key, const char value[][64],int valuelens);
   
 // 在哈希表中查找键对应的值  
 const HashEntry*find_hash(HashTable *table, const char *key);

+ 8 - 6
pro/src/netswitch.c

@@ -779,6 +779,11 @@ static int sw_save(sqlite3 *db, netswitch_info_t *old, netswitch_info_t *new)
 {
     int i;
     for(i=0; i<SW_PORT_MAX; i++) {
+
+        if(i<SW_PORT_INDEX_START || i>SW_PORT_INDEX_END) {
+            continue;
+        }
+
         if(memcmp(&old->port[i], &new->port[i], sizeof(netswitch_info_t))) {
             dev_switch_update_port(db, &new->port[i]);
             //LOGD("____ i: %d, id: %d\n", i, new->port[i].id);
@@ -792,9 +797,9 @@ static int sw_alarm(netswitch_evts_t *evts, netswitch_info_t *old, netswitch_inf
     int r=-1;
     int i,flag=0;
     time_t now;
-    char temp[200];
+    char temp[400];
     char time_str[100];
-    char alarm_str[2000];
+    char alarm_str[4000];
 
     time(&now);
     strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&now));
@@ -802,13 +807,10 @@ static int sw_alarm(netswitch_evts_t *evts, netswitch_info_t *old, netswitch_inf
     alarm_str[0] = 0;
     for(i=0; i<SW_PORT_MAX; i++) {
         
-        temp[0] = 0;
         if(evts->evt[i].dev) {
             if(evts->evt[i].dev==EVT_MAC_CHG) {
-                char ttt[100];
                 //snprintf(temp, sizeof(temp), "port[%d] mac changed from %s to %s\n", i+1, old->port[i].mac, new->port[i].mac);
-                sprintf(ttt, "$通道$|%d |$%s$", i+1, language_alarm_MAC_changed[0]);
-                sprintf(temp, ttt, old->port[i].mac, new->port[i].mac);
+                sprintf(temp, "|$%s$|$%s$|%d  %s -> %s\n", language_alarm_MAC_changed[0], language_alarm_Ch[0], i+1, old->port[i].mac, new->port[i].mac);
                 strcat(alarm_str, temp);
                 flag = 1;
             }

+ 4 - 1
pro/src/sqlite_handle.c

@@ -2335,7 +2335,8 @@ int dev_serarch_all_alarm(sqlite3* db,
         sqlite3_free_table(pResult);
         return -1 ;
     }
-    //初始化头
+    
+    printf("___ nrow: %d\n", nrow);
     for (size_t i = 1; i <= nrow; i++)
     {
         _AlarmAckInfo* _alarmTemp = (_AlarmAckInfo*)malloc(sizeof( _AlarmAckInfo));
@@ -2344,6 +2345,8 @@ int dev_serarch_all_alarm(sqlite3* db,
             sqlite3_free_table(pResult);
             return -1;
         }
+        memset(_alarmTemp, 0, sizeof(_AlarmAckInfo));
+
         strcpy(_alarmTemp->alarmNumber,pResult[i*ncolumn+0]);
         strcpy(_alarmTemp->alarmDate,pResult[i*ncolumn+1]);
         _alarmTemp->alarmType = atoi(pResult[i*ncolumn+2]);