/[LeafOK_CVS]/lbbs/include/section_list.h
ViewVC logotype

Contents of /lbbs/include/section_list.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (show annotations)
Tue Nov 4 13:49:50 2025 UTC (4 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.31: +7 -15 lines
Content type: text/x-chdr
Update file header information comments

1 /* SPDX-License-Identifier: GPL-3.0-or-later */
2 /*
3 * section_list
4 * - data models and basic operations of section and article
5 *
6 * Copyright (C) 2004-2025 by Leaflet <leaflet@leafok.com>
7 */
8
9 #ifndef _SECTION_LIST_H_
10 #define _SECTION_LIST_H_
11
12 #include "bbs.h"
13 #include "common.h"
14 #include "menu.h"
15 #include <time.h>
16
17 #define BBS_article_title_max_len 160
18 #define BBS_article_limit_per_section 50000
19 #define BBS_article_limit_per_page 20
20
21 #define BBS_ontop_article_limit_per_section 10
22
23 #define ARTICLE_PER_BLOCK 1000
24
25 struct article_t
26 {
27 int32_t aid;
28 int32_t tid;
29 int32_t sid;
30 int32_t cid;
31 int32_t uid;
32 struct article_t *p_prior; // prior article
33 struct article_t *p_next; // next article
34 struct article_t *p_topic_prior; // same topic
35 struct article_t *p_topic_next; // same topic
36 int8_t visible;
37 int8_t excerption;
38 int8_t ontop;
39 int8_t lock;
40 int8_t transship;
41 char username[BBS_username_max_len + 1];
42 char nickname[BBS_nickname_max_len + 1];
43 char title[BBS_article_title_max_len + 1];
44 time_t sub_dt;
45 };
46 typedef struct article_t ARTICLE;
47
48 struct section_list_t
49 {
50 int32_t sid;
51 int32_t class_id;
52 int8_t enable;
53 char sname[BBS_section_name_max_len + 1];
54 char stitle[BBS_section_title_max_len + 1];
55 char master_list[(BBS_username_max_len + 1) * 3 + 1];
56 int read_user_level;
57 int write_user_level;
58 int32_t article_count;
59 int32_t topic_count;
60 int32_t visible_article_count;
61 int32_t visible_topic_count;
62 ARTICLE *p_article_head;
63 ARTICLE *p_article_tail;
64 ARTICLE *p_page_first_article[BBS_article_limit_per_section / BBS_article_limit_per_page];
65 int32_t page_count;
66 int32_t last_page_visible_article_count;
67 ARTICLE *p_ontop_articles[BBS_ontop_article_limit_per_section];
68 int32_t ontop_article_count;
69 MENU_SET ex_menu_set;
70 time_t ex_menu_tm;
71 };
72 typedef struct section_list_t SECTION_LIST;
73
74 struct section_list_pool_t
75 {
76 int shmid;
77 SECTION_LIST sections[BBS_max_section];
78 int section_count;
79 int semid;
80 TRIE_NODE *p_trie_dict_section_by_name;
81 TRIE_NODE *p_trie_dict_section_by_sid;
82 };
83 typedef struct section_list_pool_t SECTION_LIST_POOL;
84
85 extern SECTION_LIST_POOL *p_section_list_pool;
86
87 // article_block_count * ARTICLE_PER_BLOCK should be
88 // no less than BBS_article_limit_per_section * BBS_max_section,
89 // in order to allocate enough memory for blocks
90 extern int article_block_init(const char *filename, int block_count);
91 extern void article_block_cleanup(void);
92
93 extern int set_article_block_shm_readonly(void);
94 extern int detach_article_block_shm(void);
95
96 extern int article_block_reset(void);
97
98 extern ARTICLE *article_block_find_by_aid(int32_t aid);
99 extern ARTICLE *article_block_find_by_index(int index);
100
101 extern int32_t article_block_last_aid(void);
102 extern int article_block_article_count(void);
103
104 extern int article_count_of_topic(int32_t aid);
105
106 extern int section_list_init(const char *filename);
107 extern void section_list_cleanup(void);
108
109 extern int set_section_list_shm_readonly(void);
110 extern int detach_section_list_shm(void);
111
112 extern SECTION_LIST *section_list_create(int32_t sid, const char *sname, const char *stitle, const char *master_list);
113 extern int section_list_update(SECTION_LIST *p_section, const char *sname, const char *stitle, const char *master_list);
114 extern void section_list_reset_articles(SECTION_LIST *p_section);
115 extern SECTION_LIST *section_list_find_by_name(const char *sname);
116 extern SECTION_LIST *section_list_find_by_sid(int32_t sid);
117 extern int get_section_index(SECTION_LIST *p_section);
118
119 // sname could be NULL, or pointer to char[] in size >= sizeof(SECTION_LIST.sname)
120 // stitle could be NULL, or pointer to char[] in size >= sizeof(SECTION_LIST.stitle)
121 // master_list could be NULL, or pointer to char[] in size >= sizeof(SECTION_LIST.master_list)
122 extern int get_section_info(SECTION_LIST *p_section, char *sname, char *stitle, char *master_list);
123
124 extern int section_list_append_article(SECTION_LIST *p_section, const ARTICLE *p_article_src);
125 extern int section_list_set_article_visible(SECTION_LIST *p_section, int32_t aid, int8_t visible);
126
127 extern int section_list_update_article_ontop(SECTION_LIST *p_section, ARTICLE *p_article);
128 extern int section_list_page_count_with_ontop(SECTION_LIST *p_section);
129 extern int section_list_page_article_count_with_ontop(SECTION_LIST *p_section, int32_t page_id);
130
131 // *p_page, *p_offset will be set as page / offset of the article with aid in *p_section (including both visible and invisible articles)
132 // *pp_next will be set as pointer to the next article of the article with aid
133 // *pp_next will be set as head article of the section if the article with aid locates at the tail of the section
134 extern ARTICLE *section_list_find_article_with_offset(SECTION_LIST *p_section, int32_t aid, int32_t *p_page, int32_t *p_offset, ARTICLE **pp_next);
135
136 extern int section_list_calculate_page(SECTION_LIST *p_section, int32_t start_aid);
137 extern int section_list_move_topic(SECTION_LIST *p_section_src, SECTION_LIST *p_section_dest, int32_t aid);
138
139 extern int section_list_try_rd_lock(SECTION_LIST *p_section, int wait_sec);
140 extern int section_list_try_rw_lock(SECTION_LIST *p_section, int wait_sec);
141 extern int section_list_rd_unlock(SECTION_LIST *p_section);
142 extern int section_list_rw_unlock(SECTION_LIST *p_section);
143 extern int section_list_rd_lock(SECTION_LIST *p_section);
144 extern int section_list_rw_lock(SECTION_LIST *p_section);
145
146 #endif //_SECTION_LIST_H_

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