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

Annotation of /lbbs/src/user_stat.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations)
Fri Dec 19 06:16:27 2025 UTC (2 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.7: +8 -8 lines
Content type: text/x-csrc
Append \n to the end of logging message by log_...()
Remove ending \n from each logging message

1 sysadm 1.4 /* SPDX-License-Identifier: GPL-3.0-or-later */
2     /*
3     * user_stat
4     * - data model and basic operations of user related statistics
5     *
6 sysadm 1.5 * Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com>
7 sysadm 1.4 */
8 sysadm 1.1
9 sysadm 1.6 #ifdef HAVE_CONFIG_H
10     #include "config.h"
11     #endif
12    
13 sysadm 1.1 #include "log.h"
14     #include "section_list.h"
15     #include "user_list.h"
16     #include "user_stat.h"
17    
18     int user_stat_map_init(USER_STAT_MAP *p_map)
19     {
20     if (p_map == NULL)
21     {
22 sysadm 1.8 log_error("NULL pointer error");
23 sysadm 1.1 return -1;
24     }
25    
26     p_map->user_count = 0;
27     p_map->last_uid = -1;
28     p_map->last_article_index = -1;
29    
30     return 0;
31     }
32    
33     int user_stat_map_update(USER_STAT_MAP *p_map)
34     {
35     int32_t uid_list[BBS_max_user_count];
36     int user_cnt = BBS_max_user_count;
37     int article_cnt;
38     int i;
39     ARTICLE *p_article;
40    
41     if (p_map == NULL)
42     {
43 sysadm 1.8 log_error("NULL pointer error");
44 sysadm 1.1 return -1;
45     }
46    
47     // Load uid_list
48     if (get_user_id_list(uid_list, &user_cnt, p_map->last_uid + 1) < 0)
49     {
50 sysadm 1.8 log_error("get_user_id_list(%d, 0) error", user_cnt);
51 sysadm 1.1 return -2;
52     }
53    
54     for (i = 0; i < user_cnt && p_map->user_count + i < BBS_max_user_count; i++)
55     {
56     p_map->stat_list[p_map->user_count + i].uid = uid_list[i];
57     p_map->stat_list[p_map->user_count + i].article_count = 0;
58     }
59    
60     p_map->user_count += i;
61     p_map->last_uid = uid_list[i - 1];
62    
63     // Scan articles
64     article_cnt = article_block_article_count();
65     for (i = p_map->last_article_index + 1; i < article_cnt; i++)
66     {
67     p_article = article_block_find_by_index(i);
68     if (p_article == NULL)
69     {
70 sysadm 1.8 log_error("article_block_find_by_index(index=%d) error", i);
71 sysadm 1.1 break;
72     }
73 sysadm 1.4
74 sysadm 1.2 if (p_article->visible == 0)
75     {
76     continue;
77     }
78 sysadm 1.1
79     if (p_article->uid > p_map->last_uid)
80     {
81 sysadm 1.8 log_debug("uid=%d of article(aid=%d) is greater than last_uid=%d",
82 sysadm 1.1 p_article->uid, p_article->aid, p_map->last_uid);
83 sysadm 1.2 continue;
84 sysadm 1.1 }
85    
86     if (user_stat_article_cnt_inc(p_map, p_article->uid, 1) < 0)
87     {
88 sysadm 1.8 log_error("user_stat_article_cnt_inc(uid=%d, 1) error", p_article->uid);
89 sysadm 1.1 break;
90     }
91     }
92    
93     p_map->last_article_index = i - 1;
94    
95     return 0;
96     }
97    
98     int user_stat_article_cnt_inc(USER_STAT_MAP *p_map, int32_t uid, int n)
99     {
100     int left;
101     int right;
102     int mid;
103    
104     if (p_map == NULL)
105     {
106 sysadm 1.8 log_error("NULL pointer error");
107 sysadm 1.1 return -1;
108     }
109    
110     left = 0;
111     right = p_map->user_count - 1;
112    
113     while (left < right)
114     {
115     mid = (left + right) / 2;
116     if (uid < p_map->stat_list[mid].uid)
117     {
118 sysadm 1.3 right = mid - 1;
119 sysadm 1.1 }
120     else if (uid > p_map->stat_list[mid].uid)
121     {
122     left = mid + 1;
123     }
124     else // if (uid == p_map->stat_list[mid].uid)
125     {
126     left = mid;
127     break;
128     }
129     }
130    
131     if (uid == p_map->stat_list[left].uid) // found
132     {
133     p_map->stat_list[left].article_count += n;
134     return 1;
135     }
136    
137     return 0; // not found
138     }
139    
140     int user_stat_get(USER_STAT_MAP *p_map, int32_t uid, const USER_STAT **pp_stat)
141     {
142     int left;
143     int right;
144     int mid;
145    
146     if (p_map == NULL)
147     {
148 sysadm 1.8 log_error("NULL pointer error");
149 sysadm 1.1 return -1;
150     }
151    
152     left = 0;
153     right = p_map->user_count - 1;
154    
155     while (left < right)
156     {
157     mid = (left + right) / 2;
158     if (uid < p_map->stat_list[mid].uid)
159     {
160 sysadm 1.3 right = mid - 1;
161 sysadm 1.1 }
162     else if (uid > p_map->stat_list[mid].uid)
163     {
164     left = mid + 1;
165     }
166     else // if (uid == p_map->stat_list[mid].uid)
167     {
168     left = mid;
169     break;
170     }
171     }
172    
173     if (uid == p_map->stat_list[left].uid) // found
174     {
175     *pp_stat = &(p_map->stat_list[left]);
176     return 1;
177     }
178    
179     // not found
180     *pp_stat = NULL;
181     return 0;
182     }

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