| 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 |
|
|
| 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))); |
| 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), ", |
| 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 |
{ |
{ |
| 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 |
{ |
{ |
| 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 |
{ |
{ |
| 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 |
{ |
{ |
| 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)--; |
| 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; |
| 508 |
return -3; |
return -3; |
| 509 |
} |
} |
| 510 |
|
|
| 511 |
// acquire lock of section |
if (get_section_info(p_section, p_snames[i], NULL, NULL) < 0) |
|
if (section_list_rd_lock(p_section) < 0) |
|
|
{ |
|
|
log_error("section_list_rd_lock(sid = %d) error\n", p_section->sid); |
|
|
return -4; |
|
|
} |
|
|
|
|
|
memcpy(p_snames[i], p_section->sname, sizeof(p_snames[i])); |
|
|
|
|
|
// release lock of section |
|
|
if (section_list_rd_unlock(p_section) < 0) |
|
| 512 |
{ |
{ |
| 513 |
log_error("section_list_rd_unlock(sid = %d) error\n", p_section->sid); |
log_error("get_section_info(sid=%d) error\n", p_section->sid); |
| 514 |
return -4; |
return -4; |
| 515 |
} |
} |
| 516 |
} |
} |