/[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.3 by sysadm, Wed Oct 15 03:02:17 2025 UTC
# Line 20  Line 20 
20  #include "log.h"  #include "log.h"
21  #include <stdlib.h>  #include <stdlib.h>
22  #include <string.h>  #include <string.h>
23    #include <sys/param.h>
24    
25  ARTICLE_FAVOR BBS_article_favor;  ARTICLE_FAVOR BBS_article_favor;
26    
# Line 41  int article_favor_load(int uid, ARTICLE_ Line 42  int article_favor_load(int uid, ARTICLE_
42          if (uid == 0)          if (uid == 0)
43          {          {
44                  p_favor->aid_base_cnt = 0;                  p_favor->aid_base_cnt = 0;
                 p_favor->aid_base = NULL;  
45    
46                  if (!keep_inc)                  if (!keep_inc)
47                  {                  {
# Line 66  int article_favor_load(int uid, ARTICLE_ Line 66  int article_favor_load(int uid, ARTICLE_
66                  log_error("Query article_favorite error: %s\n", mysql_error(db));                  log_error("Query article_favorite error: %s\n", mysql_error(db));
67                  return -3;                  return -3;
68          }          }
69          if ((rs = mysql_store_result(db)) == NULL)          if ((rs = mysql_use_result(db)) == NULL)
70          {          {
71                  log_error("Get article_favorite data failed\n");                  log_error("Get article_favorite data failed\n");
72                  return -3;                  return -3;
73          }          }
74    
75          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;  
         }  
76    
77          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
78          {          {
79                  p_favor->aid_base[(p_favor->aid_base_cnt)++] = atoi(row[0]);                  p_favor->aid_base[p_favor->aid_base_cnt] = atoi(row[0]);
80                    (p_favor->aid_base_cnt)++;
81                    if (p_favor->aid_base_cnt >= MAX_FAVOR_AID_BASE_CNT)
82                    {
83                            log_error("Too many article_favorite records for uid=%d\n",
84                                              uid);
85                            break;
86                    }
87          }          }
88          mysql_free_result(rs);          mysql_free_result(rs);
89    
# Line 108  int article_favor_unload(ARTICLE_FAVOR * Line 107  int article_favor_unload(ARTICLE_FAVOR *
107                  return -1;                  return -1;
108          }          }
109    
110          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;  
         }  
111    
112          return 0;          return 0;
113  }  }
# Line 232  int article_favor_save_inc(const ARTICLE Line 226  int article_favor_save_inc(const ARTICLE
226    
227  int article_favor_merge_inc(ARTICLE_FAVOR *p_favor)  int article_favor_merge_inc(ARTICLE_FAVOR *p_favor)
228  {  {
229          int32_t *aid_new;          int32_t aid_new[MAX_FAVOR_AID_BASE_CNT];
         int aid_new_cnt;  
230          int i, j, k;          int i, j, k;
231            int len;
232    
233          if (p_favor == NULL)          if (p_favor == NULL)
234          {          {
# Line 247  int article_favor_merge_inc(ARTICLE_FAVO Line 241  int article_favor_merge_inc(ARTICLE_FAVO
241                  return 0;                  return 0;
242          }          }
243    
244          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;)  
245          {          {
246                  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
247                  {                  {
# Line 273  int article_favor_merge_inc(ARTICLE_FAVO Line 258  int article_favor_merge_inc(ARTICLE_FAVO
258                  }                  }
259          }          }
260    
261          memcpy(aid_new + k, p_favor->aid_base + i, sizeof(int32_t) * (size_t)(p_favor->aid_base_cnt - i));          len = MIN(p_favor->aid_base_cnt - i, MAX_FAVOR_AID_BASE_CNT - k);
262          k += (p_favor->aid_base_cnt - i);          if (len > 0)
263          memcpy(aid_new + k, p_favor->aid_inc + j, sizeof(int32_t) * (size_t)(p_favor->aid_inc_cnt - j));          {
264          k += (p_favor->aid_inc_cnt - j);                  memcpy(aid_new + k, p_favor->aid_base + i,
265                               sizeof(int32_t) * (size_t)len);
266                    i += len;
267                    k += len;
268            }
269            if (i < p_favor->aid_base_cnt)
270            {
271                    log_error("Too many base aids, %d will be discarded\n", p_favor->aid_base_cnt - i);
272            }
273    
274          free(p_favor->aid_base);          len = MIN(p_favor->aid_inc_cnt - j, MAX_FAVOR_AID_BASE_CNT - k);
275          p_favor->aid_base = aid_new;          if (len > 0)
276          p_favor->aid_base_cnt = k;          {
277                    memcpy(aid_new + k, p_favor->aid_inc + j,
278                               sizeof(int32_t) * (size_t)len);
279                    j += len;
280                    k += len;
281            }
282            if (j < p_favor->aid_inc_cnt)
283            {
284                    log_error("Too many inc aids, %d will be discarded\n", p_favor->aid_inc_cnt - j);
285            }
286    
287            memcpy(p_favor->aid_base, aid_new, sizeof(int32_t) * (size_t)k);
288    
289            p_favor->aid_base_cnt = k;
290          p_favor->aid_inc_cnt = 0;          p_favor->aid_inc_cnt = 0;
291    
292          return 0;          return 0;
# Line 393  int article_favor_set(int32_t aid, ARTIC Line 398  int article_favor_set(int32_t aid, ARTIC
398    
399          if (aid == p_favor->aid_inc[left] && p_favor->aid_inc_cnt > 0) // Unset          if (aid == p_favor->aid_inc[left] && p_favor->aid_inc_cnt > 0) // Unset
400          {          {
401                  for (i = left; i < p_favor->aid_inc_cnt - 1; i++)                  if (p_favor->aid_inc_cnt > left + 1)
402                  {                  {
403                          p_favor->aid_inc[i] = p_favor->aid_inc[i + 1];                          memmove(p_favor->aid_inc + left,
404                                            p_favor->aid_inc + left + 1,
405                                            sizeof(int32_t) * (size_t)(p_favor->aid_inc_cnt - left - 1));
406                  }                  }
407    
408                  (p_favor->aid_inc_cnt)--;                  (p_favor->aid_inc_cnt)--;
# Line 429  int article_favor_set(int32_t aid, ARTIC Line 436  int article_favor_set(int32_t aid, ARTIC
436                  right = left + 1;                  right = left + 1;
437          }          }
438    
439          for (i = p_favor->aid_inc_cnt - 1; i >= right; i--)          if (p_favor->aid_inc_cnt > right)
440          {          {
441                  p_favor->aid_inc[i + 1] = p_favor->aid_inc[i];                  memmove(p_favor->aid_inc + right + 1,
442                                    p_favor->aid_inc + right,
443                                    sizeof(int32_t) * (size_t)(p_favor->aid_inc_cnt - right));
444          }          }
445    
446          p_favor->aid_inc[right] = aid;          p_favor->aid_inc[right] = aid;


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

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