/[LeafOK_CVS]/lbbs/src/article_favor.c
ViewVC logotype

Diff of /lbbs/src/article_favor.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.1 by sysadm, Wed Oct 15 00:45:52 2025 UTC Revision 1.2 by sysadm, Wed Oct 15 02:25:13 2025 UTC
# Line 41  int article_favor_load(int uid, ARTICLE_ Line 41  int article_favor_load(int uid, ARTICLE_
41          if (uid == 0)          if (uid == 0)
42          {          {
43                  p_favor->aid_base_cnt = 0;                  p_favor->aid_base_cnt = 0;
                 p_favor->aid_base = NULL;  
44    
45                  if (!keep_inc)                  if (!keep_inc)
46                  {                  {
# Line 66  int article_favor_load(int uid, ARTICLE_ Line 65  int article_favor_load(int uid, ARTICLE_
65                  log_error("Query article_favorite error: %s\n", mysql_error(db));                  log_error("Query article_favorite error: %s\n", mysql_error(db));
66                  return -3;                  return -3;
67          }          }
68          if ((rs = mysql_store_result(db)) == NULL)          if ((rs = mysql_use_result(db)) == NULL)
69          {          {
70                  log_error("Get article_favorite data failed\n");                  log_error("Get article_favorite data failed\n");
71                  return -3;                  return -3;
72          }          }
73    
74          p_favor->aid_base_cnt = 0;          p_favor->aid_base_cnt = 0;
         p_favor->aid_base = malloc(sizeof(int32_t) * mysql_num_rows(rs));  
         if (p_favor->aid_base == NULL)  
         {  
                 log_error("malloc(INT32 * %d) error: OOM\n", mysql_num_rows(rs));  
                 mysql_free_result(rs);  
                 mysql_close(db);  
                 return -4;  
         }  
75    
76          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
77          {          {
78                  p_favor->aid_base[(p_favor->aid_base_cnt)++] = atoi(row[0]);                  p_favor->aid_base[p_favor->aid_base_cnt] = atoi(row[0]);
79                    (p_favor->aid_base_cnt)++;
80                    if (p_favor->aid_base_cnt >= MAX_FAVOR_AID_BASE_CNT)
81                    {
82                            log_error("Too many article_favorite records for uid=%d\n",
83                                              uid);
84                            break;
85                    }
86          }          }
87          mysql_free_result(rs);          mysql_free_result(rs);
88    
# Line 108  int article_favor_unload(ARTICLE_FAVOR * Line 106  int article_favor_unload(ARTICLE_FAVOR *
106                  return -1;                  return -1;
107          }          }
108    
109          if (p_favor->aid_base != NULL)          p_favor->aid_base_cnt = 0;
         {  
                 free(p_favor->aid_base);  
                 p_favor->aid_base = NULL;  
                 p_favor->aid_base_cnt = 0;  
         }  
110    
111          return 0;          return 0;
112  }  }
# Line 232  int article_favor_save_inc(const ARTICLE Line 225  int article_favor_save_inc(const ARTICLE
225    
226  int article_favor_merge_inc(ARTICLE_FAVOR *p_favor)  int article_favor_merge_inc(ARTICLE_FAVOR *p_favor)
227  {  {
228          int32_t *aid_new;          int32_t aid_new[MAX_FAVOR_AID_BASE_CNT];
         int aid_new_cnt;  
229          int i, j, k;          int i, j, k;
230    
231          if (p_favor == NULL)          if (p_favor == NULL)
# Line 247  int article_favor_merge_inc(ARTICLE_FAVO Line 239  int article_favor_merge_inc(ARTICLE_FAVO
239                  return 0;                  return 0;
240          }          }
241    
242          aid_new_cnt = p_favor->aid_base_cnt + p_favor->aid_inc_cnt;          for (i = 0, j = 0, k = 0; i < p_favor->aid_base_cnt && j < p_favor->aid_inc_cnt && k < MAX_FAVOR_AID_BASE_CNT;)
   
         aid_new = malloc(sizeof(int32_t) * (size_t)aid_new_cnt);  
         if (aid_new == NULL)  
         {  
                 log_error("malloc(INT32 * %d) error: OOM\n", aid_new_cnt);  
                 return -2;  
         }  
   
         for (i = 0, j = 0, k = 0; i < p_favor->aid_base_cnt && j < p_favor->aid_inc_cnt;)  
243          {          {
244                  if (p_favor->aid_base[i] == p_favor->aid_inc[j]) // XOR - discard duplicate pair                  if (p_favor->aid_base[i] == p_favor->aid_inc[j]) // XOR - discard duplicate pair
245                  {                  {
# Line 273  int article_favor_merge_inc(ARTICLE_FAVO Line 256  int article_favor_merge_inc(ARTICLE_FAVO
256                  }                  }
257          }          }
258    
259          memcpy(aid_new + k, p_favor->aid_base + i, sizeof(int32_t) * (size_t)(p_favor->aid_base_cnt - i));          while (i < p_favor->aid_base_cnt && k < MAX_FAVOR_AID_BASE_CNT)
260          k += (p_favor->aid_base_cnt - i);          {
261          memcpy(aid_new + k, p_favor->aid_inc + j, sizeof(int32_t) * (size_t)(p_favor->aid_inc_cnt - j));                  aid_new[k++] = p_favor->aid_base[i++];
262          k += (p_favor->aid_inc_cnt - j);          }
263            if (i < p_favor->aid_base_cnt)
264            {
265                    log_error("Too many base aids, %d will be discarded\n", p_favor->aid_base_cnt - i);
266            }
267    
268          free(p_favor->aid_base);          while (j < p_favor->aid_inc_cnt && k < MAX_FAVOR_AID_BASE_CNT)
269          p_favor->aid_base = aid_new;          {
270          p_favor->aid_base_cnt = k;                  aid_new[k++] = p_favor->aid_inc[j++];
271            }
272            if (j < p_favor->aid_inc_cnt)
273            {
274                    log_error("Too many inc aids, %d will be discarded\n", p_favor->aid_inc_cnt - j);
275            }
276    
277            memcpy(p_favor->aid_base, aid_new, sizeof(int32_t) * (size_t)k);
278    
279            p_favor->aid_base_cnt = k;
280          p_favor->aid_inc_cnt = 0;          p_favor->aid_inc_cnt = 0;
281    
282          return 0;          return 0;


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1