| 119 |
|
|
| 120 |
int user_list_load(MYSQL *db, USER_LIST *p_list) |
int user_list_load(MYSQL *db, USER_LIST *p_list) |
| 121 |
{ |
{ |
| 122 |
|
USER_INFO_INDEX_UID index_uid[BBS_max_user_count]; |
| 123 |
MYSQL_RES *rs = NULL; |
MYSQL_RES *rs = NULL; |
| 124 |
MYSQL_ROW row; |
MYSQL_ROW row; |
| 125 |
char sql[SQL_BUFFER_LEN]; |
char sql[SQL_BUFFER_LEN]; |
| 178 |
p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9])); |
p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9])); |
| 179 |
|
|
| 180 |
// index |
// index |
| 181 |
p_list->index_uid[i].uid = p_list->users[i].uid; |
index_uid[i].uid = p_list->users[i].uid; |
| 182 |
p_list->index_uid[i].id = i; |
index_uid[i].id = i; |
| 183 |
|
|
| 184 |
i++; |
i++; |
| 185 |
if (i >= BBS_max_user_count) |
if (i >= BBS_max_user_count) |
| 194 |
// Sort index |
// Sort index |
| 195 |
if (i != p_list->user_count || p_list->users[i - 1].uid != last_uid) // Count of users changed |
if (i != p_list->user_count || p_list->users[i - 1].uid != last_uid) // Count of users changed |
| 196 |
{ |
{ |
| 197 |
qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp); |
qsort(index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp); |
| 198 |
|
memcpy(p_list->index_uid, index_uid, sizeof(USER_INFO_INDEX_UID) * (size_t)i); |
| 199 |
|
|
| 200 |
#ifdef _DEBUG |
#ifdef _DEBUG |
| 201 |
log_error("Rebuild index of %d users, last_uid=%d\n", i, p_list->users[i - 1].uid); |
log_error("Rebuild index of %d users, last_uid=%d\n", i, p_list->users[i - 1].uid); |
| 202 |
#endif |
#endif |
| 256 |
strncpy(p_list->users[i].session_id, row[0], sizeof(p_list->users[i].session_id) - 1); |
strncpy(p_list->users[i].session_id, row[0], sizeof(p_list->users[i].session_id) - 1); |
| 257 |
p_list->users[i].session_id[sizeof(p_list->users[i].session_id) - 1] = '\0'; |
p_list->users[i].session_id[sizeof(p_list->users[i].session_id) - 1] = '\0'; |
| 258 |
|
|
| 259 |
if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) < 0) |
if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) <= 0) |
|
{ |
|
|
log_error("query_user_info(%d) error\n", atoi(row[1])); |
|
|
continue; |
|
|
} |
|
|
else if (ret == 0) // skip Guest |
|
| 260 |
{ |
{ |
| 261 |
|
log_error("query_user_info_by_uid(%d) error\n", atoi(row[1])); |
| 262 |
continue; |
continue; |
| 263 |
} |
} |
| 264 |
|
|
| 513 |
ret = -2; |
ret = -2; |
| 514 |
goto cleanup; |
goto cleanup; |
| 515 |
} |
} |
|
|
|
|
// No online user, no need to swap lists |
|
|
if (p_user_list_pool->p_online_current->user_count == 0 && p_user_list_pool->p_online_new->user_count == 0) |
|
|
{ |
|
|
goto cleanup; |
|
|
} |
|
| 516 |
} |
} |
| 517 |
else |
else |
| 518 |
{ |
{ |
| 724 |
return -1; |
return -1; |
| 725 |
} |
} |
| 726 |
|
|
| 727 |
|
*p_user_count = 0; |
| 728 |
|
*p_page_count = 0; |
| 729 |
|
|
| 730 |
// acquire lock of user list |
// acquire lock of user list |
| 731 |
if (user_list_rd_lock(p_user_list_pool->semid) < 0) |
if (user_list_rd_lock(p_user_list_pool->semid) < 0) |
| 732 |
{ |
{ |
| 780 |
return -1; |
return -1; |
| 781 |
} |
} |
| 782 |
|
|
| 783 |
|
*p_user_count = 0; |
| 784 |
|
*p_page_count = 0; |
| 785 |
|
|
| 786 |
// acquire lock of user list |
// acquire lock of user list |
| 787 |
if (user_list_rd_lock(p_user_list_pool->semid) < 0) |
if (user_list_rd_lock(p_user_list_pool->semid) < 0) |
| 788 |
{ |
{ |
| 880 |
return -2; |
return -2; |
| 881 |
} |
} |
| 882 |
|
|
| 883 |
|
if (p_user_list_pool->p_current->index_uid[0].uid != 1) |
| 884 |
|
{ |
| 885 |
|
log_error("Incorrect index\n"); |
| 886 |
|
} |
| 887 |
|
|
| 888 |
left = 0; |
left = 0; |
| 889 |
right = p_user_list_pool->p_current->user_count - 1; |
right = p_user_list_pool->p_current->user_count - 1; |
| 890 |
|
|
| 909 |
if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found |
if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found |
| 910 |
{ |
{ |
| 911 |
id = p_user_list_pool->p_current->index_uid[left].id; |
id = p_user_list_pool->p_current->index_uid[left].id; |
| 912 |
if ((ret = query_user_info(id, p_user)) <= 0) |
*p_user = p_user_list_pool->p_current->users[id]; |
| 913 |
{ |
ret = 1; |
|
log_error("query_user_info(id=%d) error: %d\n", id, ret); |
|
|
} |
|
|
else |
|
|
{ |
|
|
ret = 1; |
|
|
} |
|
| 914 |
} |
} |
| 915 |
|
|
| 916 |
// release lock of user list |
// release lock of user list |
| 1022 |
uid == p_user_list_pool->p_online_current->index_uid[id].uid; |
uid == p_user_list_pool->p_online_current->index_uid[id].uid; |
| 1023 |
id++, i++) |
id++, i++) |
| 1024 |
{ |
{ |
| 1025 |
if ((ret = query_user_online_info(id, &(p_users[i]))) <= 0) |
p_users[i] = p_user_list_pool->p_online_current->users[id]; |
| 1026 |
{ |
log_error("Debug: i=%d id=%d users[i].id=%d\n", i, id, p_users[i].id); |
|
log_error("query_user_info(id=%d) error: %d\n", id, ret); |
|
|
ret = -3; |
|
|
break; |
|
|
} |
|
| 1027 |
} |
} |
| 1028 |
|
|
| 1029 |
if (ret > 0 && i > 0) |
if (i > 0) |
| 1030 |
{ |
{ |
| 1031 |
*p_user_cnt = i; |
*p_user_cnt = i; |
| 1032 |
ret = 1; |
ret = 1; |