/[LeafOK_CVS]/lbbs/src/user_list.c
ViewVC logotype

Diff of /lbbs/src/user_list.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.7 by sysadm, Wed Oct 22 05:50:13 2025 UTC Revision 1.8 by sysadm, Wed Oct 22 07:16:48 2025 UTC
# Line 93  static int user_list_rw_lock(int semid); Line 93  static int user_list_rw_lock(int semid);
93  static int user_list_load(MYSQL *db, USER_LIST *p_list);  static int user_list_load(MYSQL *db, USER_LIST *p_list);
94  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_list);  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_list);
95    
96    static int user_info_index_uid_comp(const void *ptr1, const void *ptr2)
97    {
98            const USER_INFO_INDEX_UID *p1 = ptr1;
99            const USER_INFO_INDEX_UID *p2 = ptr2;
100    
101            if (p1->uid < p2->uid)
102            {
103                    return -1;
104            }
105            else if (p1->uid > p2->uid)
106            {
107                    return 1;
108            }
109            return 0;
110    }
111    
112  int user_list_load(MYSQL *db, USER_LIST *p_list)  int user_list_load(MYSQL *db, USER_LIST *p_list)
113  {  {
114          MYSQL_RES *rs = NULL;          MYSQL_RES *rs = NULL;
# Line 112  int user_list_load(MYSQL *db, USER_LIST Line 128  int user_list_load(MYSQL *db, USER_LIST
128                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "
129                           "FROM user_list INNER JOIN user_pubinfo ON user_list.UID = user_pubinfo.UID "                           "FROM user_list INNER JOIN user_pubinfo ON user_list.UID = user_pubinfo.UID "
130                           "INNER JOIN user_reginfo ON user_list.UID = user_reginfo.UID "                           "INNER JOIN user_reginfo ON user_list.UID = user_reginfo.UID "
131                           "WHERE enable ORDER BY UID");                           "WHERE enable ORDER BY username");
132    
133          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
134          {          {
# Line 131  int user_list_load(MYSQL *db, USER_LIST Line 147  int user_list_load(MYSQL *db, USER_LIST
147          i = 0;          i = 0;
148          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
149          {          {
150                    // record
151                    p_list->users[i].id = i;
152                  p_list->users[i].uid = atoi(row[0]);                  p_list->users[i].uid = atoi(row[0]);
153                  strncpy(p_list->users[i].username, row[1], sizeof(p_list->users[i].username) - 1);                  strncpy(p_list->users[i].username, row[1], sizeof(p_list->users[i].username) - 1);
154                  p_list->users[i].username[sizeof(p_list->users[i].username) - 1] = '\0';                  p_list->users[i].username[sizeof(p_list->users[i].username) - 1] = '\0';
# Line 144  int user_list_load(MYSQL *db, USER_LIST Line 162  int user_list_load(MYSQL *db, USER_LIST
162                  p_list->users[i].last_login_dt = (row[8] == NULL ? 0 : atol(row[8]));                  p_list->users[i].last_login_dt = (row[8] == NULL ? 0 : atol(row[8]));
163                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));
164    
165                    // index
166                    p_list->index_uid[i].uid = p_list->users[i].uid;
167                    p_list->index_uid[i].id = i;
168    
169                  i++;                  i++;
170                  if (i >= BBS_max_user_count)                  if (i >= BBS_max_user_count)
171                  {                  {
# Line 156  int user_list_load(MYSQL *db, USER_LIST Line 178  int user_list_load(MYSQL *db, USER_LIST
178    
179          p_list->user_count = i;          p_list->user_count = i;
180    
181            // Sort index
182            qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
183    
184  #ifdef _DEBUG  #ifdef _DEBUG
185          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d users\n", p_list->user_count);
186  #endif  #endif
# Line 204  int user_online_list_load(MYSQL *db, USE Line 229  int user_online_list_load(MYSQL *db, USE
229          i = 0;          i = 0;
230          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
231          {          {
232                    p_list->users[i].id = i;
233                  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);
   
234                  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';
235                  if ((ret = query_user_info(atoi(row[1]), &(p_list->users[i].user_info))) < 0)  
236                    if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) < 0)
237                  {                  {
238                          log_error("query_user_info(%d) error\n", atoi(row[1]));                          log_error("query_user_info(%d) error\n", atoi(row[1]));
239                          continue;                          continue;
240                  }                  }
241                  else if (ret == 0) // Guest                  else if (ret == 0) // Guest
242                  {                  {
243                            p_list->users[i].user_info.id = -1;
244                          p_list->users[i].user_info.uid = 0;                          p_list->users[i].user_info.uid = 0;
245                          strncpy(p_list->users[i].user_info.username, "guest", sizeof(p_list->users[i].user_info.username) - 1);                          strncpy(p_list->users[i].user_info.username, "guest", sizeof(p_list->users[i].user_info.username) - 1);
246                          p_list->users[i].user_info.username[sizeof(p_list->users[i].user_info.username) - 1] = '\0';                          p_list->users[i].user_info.username[sizeof(p_list->users[i].user_info.username) - 1] = '\0';
# Line 764  cleanup: Line 791  cleanup:
791          return ret;          return ret;
792  }  }
793    
794  int query_user_info(int32_t uid, USER_INFO *p_user)  int query_user_info(int32_t id, USER_INFO *p_user)
795    {
796            int ret = 0;
797    
798            if (p_user == NULL)
799            {
800                    log_error("NULL pointer error\n");
801                    return -1;
802            }
803    
804            // acquire lock of user list
805            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
806            {
807                    log_error("user_list_rd_lock() error\n");
808                    return -2;
809            }
810    
811            if (id >= 0 && id < p_user_list_pool->p_current->user_count) // Found
812            {
813                    *p_user = p_user_list_pool->p_current->users[id];
814                    ret = 1;
815            }
816    
817            // release lock of user list
818            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
819            {
820                    log_error("user_list_rd_unlock() error\n");
821                    ret = -1;
822            }
823    
824            return ret;
825    }
826    
827    int query_user_info_by_uid(int32_t uid, USER_INFO *p_user)
828  {  {
829          int left;          int left;
830          int right;          int right;
831          int mid;          int mid;
832            int32_t id;
833          int ret = 0;          int ret = 0;
834    
835          if (p_user == NULL)          if (p_user == NULL)
# Line 790  int query_user_info(int32_t uid, USER_IN Line 851  int query_user_info(int32_t uid, USER_IN
851          while (left < right)          while (left < right)
852          {          {
853                  mid = (left + right) / 2;                  mid = (left + right) / 2;
854                  if (uid < p_user_list_pool->p_current->users[mid].uid)                  if (uid < p_user_list_pool->p_current->index_uid[mid].uid)
855                  {                  {
856                          right = mid;                          right = mid;
857                  }                  }
858                  else if (uid > p_user_list_pool->p_current->users[mid].uid)                  else if (uid > p_user_list_pool->p_current->index_uid[mid].uid)
859                  {                  {
860                          left = mid + 1;                          left = mid + 1;
861                  }                  }
862                  else // if (uid == p_user_list_pool->p_current->users[mid].uid)                  else // if (uid == p_user_list_pool->p_current->index_uid[mid].uid)
863                  {                  {
864                          left = mid;                          left = mid;
865                          break;                          break;
866                  }                  }
867          }          }
868    
869          if (uid == p_user_list_pool->p_current->users[left].uid) // Found          if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found
870            {
871                    id = p_user_list_pool->p_current->index_uid[left].id;
872                    if ((ret = query_user_info(id, p_user)) <= 0)
873                    {
874                            log_error("query_user_info(id=%d) error: %d\n", id, ret);
875                    }
876                    else
877                    {
878                            ret = 1;
879                    }
880            }
881    
882            // release lock of user list
883            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
884            {
885                    log_error("user_list_rd_unlock() error\n");
886                    ret = -1;
887            }
888    
889            return ret;
890    }
891    
892    int query_user_online_info(int32_t id, USER_ONLINE_INFO *p_user)
893    {
894            int ret = 0;
895    
896            if (p_user == NULL)
897            {
898                    log_error("NULL pointer error\n");
899                    return -1;
900            }
901    
902            // acquire lock of user list
903            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
904            {
905                    log_error("user_list_rd_lock() error\n");
906                    return -2;
907            }
908    
909            if (id >= 0 && id < p_user_list_pool->p_online_current->user_count) // Found
910          {          {
911                  *p_user = p_user_list_pool->p_current->users[left];                  *p_user = p_user_list_pool->p_online_current->users[id];
912                  ret = 1;                  ret = 1;
913          }          }
914    


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

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