| 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 |
{ |
{ |
| 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 |
|
|
| 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 |
} |
} |
| 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) |
| 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 |
{ |
{ |
| 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; |