/[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.2 by sysadm, Wed Oct 15 02:25:13 2025 UTC Revision 1.5 by sysadm, Fri Oct 24 02:07:01 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 147  int article_favor_save_inc(const ARTICLE Line 148  int article_favor_save_inc(const ARTICLE
148                           "DELETE FROM article_favorite WHERE UID = %d AND AID IN (",                           "DELETE FROM article_favorite WHERE UID = %d AND AID IN (",
149                           p_favor->uid);                           p_favor->uid);
150    
151          for (i = 0, j = 0; i < p_favor->aid_base_cnt && j < p_favor->aid_inc_cnt;)          for (i = 0, j = 0; j < p_favor->aid_inc_cnt;)
152          {          {
153                  if (p_favor->aid_base[i] == p_favor->aid_inc[j]) // XOR - delete record                  if (i < p_favor->aid_base_cnt && p_favor->aid_base[i] == p_favor->aid_inc[j]) // XOR - delete record
154                  {                  {
155                          snprintf(tuple_tmp, sizeof(tuple_tmp), "%d, ", p_favor->aid_inc[j]);                          snprintf(tuple_tmp, sizeof(tuple_tmp), "%d, ", p_favor->aid_inc[j]);
156                          strncat(sql_del, tuple_tmp, sizeof(sql_del) - 1 - strnlen(sql_del, sizeof(sql_del)));                          strncat(sql_del, tuple_tmp, sizeof(sql_del) - 1 - strnlen(sql_del, sizeof(sql_del)));
# Line 158  int article_favor_save_inc(const ARTICLE Line 159  int article_favor_save_inc(const ARTICLE
159                          i++;                          i++;
160                          j++;                          j++;
161                  }                  }
162                  else if (p_favor->aid_base[i] < p_favor->aid_inc[j]) // skip existing record                  else if (i < p_favor->aid_base_cnt && p_favor->aid_base[i] < p_favor->aid_inc[j]) // skip existing record
163                  {                  {
164                          i++;                          i++;
165                  }                  }
166                  else // if (p_favor->aid_base[i] > p_favor->aid_inc[j])                  else // if (i >= p_favor->aid_base_cnt || p_favor->aid_base[i] > p_favor->aid_inc[j])
167                  {                  {
168                          snprintf(tuple_tmp, sizeof(tuple_tmp),                          snprintf(tuple_tmp, sizeof(tuple_tmp),
169                                           "(%d, %d), ",                                           "(%d, %d), ",
# Line 227  int article_favor_merge_inc(ARTICLE_FAVO Line 228  int article_favor_merge_inc(ARTICLE_FAVO
228  {  {
229          int32_t aid_new[MAX_FAVOR_AID_BASE_CNT];          int32_t aid_new[MAX_FAVOR_AID_BASE_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 256  int article_favor_merge_inc(ARTICLE_FAVO Line 258  int article_favor_merge_inc(ARTICLE_FAVO
258                  }                  }
259          }          }
260    
261          while (i < p_favor->aid_base_cnt && k < MAX_FAVOR_AID_BASE_CNT)          len = MIN(p_favor->aid_base_cnt - i, MAX_FAVOR_AID_BASE_CNT - k);
262            if (len > 0)
263          {          {
264                  aid_new[k++] = p_favor->aid_base[i++];                  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)          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);                  log_error("Too many base aids, %d will be discarded\n", p_favor->aid_base_cnt - i);
272          }          }
273    
274          while (j < p_favor->aid_inc_cnt && k < MAX_FAVOR_AID_BASE_CNT)          len = MIN(p_favor->aid_inc_cnt - j, MAX_FAVOR_AID_BASE_CNT - k);
275            if (len > 0)
276          {          {
277                  aid_new[k++] = p_favor->aid_inc[j++];                  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)          if (j < p_favor->aid_inc_cnt)
283          {          {
# Line 311  int article_favor_check(int32_t aid, con Line 321  int article_favor_check(int32_t aid, con
321                          mid = (left + right) / 2;                          mid = (left + right) / 2;
322                          if (aid < (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))                          if (aid < (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))
323                          {                          {
324                                  right = mid;                                  right = mid - 1;
325                          }                          }
326                          else if (aid > (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))                          else if (aid > (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))
327                          {                          {
# Line 362  int article_favor_set(int32_t aid, ARTIC Line 372  int article_favor_set(int32_t aid, ARTIC
372                          mid = (left + right) / 2;                          mid = (left + right) / 2;
373                          if (aid < (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))                          if (aid < (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))
374                          {                          {
375                                  right = mid;                                  right = mid - 1;
376                          }                          }
377                          else if (aid > (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))                          else if (aid > (i == 0 ? p_favor->aid_base[mid] : p_favor->aid_inc[mid]))
378                          {                          {
# Line 388  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 424  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