@@ -25,26 +25,26 @@
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The schema for the tables that manage the forum, if forum is
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** enabled.
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char zForumInit[] =
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TABLE repository.forumpost(
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ mpostid INTEGER PRIMARY KEY, -- unique id for each post
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ mpostid INTEGER PRIMARY KEY, -- unique id for each post (local)
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ mposthash TEXT, -- uuid for this post
31 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mthreadid INTEGER, -- thread to which this post belongs
32 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ uname TEXT, -- name of user
33 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mtime REAL, -- julian day number
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ mstatus TEXT, -- status. ('mod','ok')
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ mstatus TEXT, -- status. NULL=ok. 'mod'=pending moderation
35 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mimetype TEXT, -- Mimetype for mbody
36 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ipaddr TEXT, -- IP address of post origin
37 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ inreplyto INT, -- Parent posting
38 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mbody TEXT -- Content of the post
39 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
40 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE INDEX repository.forumpost_x1 ON
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ forumpost(threadid,inreplyto,mtime);
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ CREATE INDEX repository.forumpost_x2 ON
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ forumpost(mtime) WHERE mstatus='mod';
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ forumpost(inreplyto,mtime);
44 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TABLE repository.forumthread(
45 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mthreadid INTEGER PRIMARY KEY,
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ mthreadhash TEXT, -- uuid for this thread
46 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mtitle TEXT, -- Title or subject line
47 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ mtime REAL, -- Most recent update
48 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ npost INT -- Number of posts on this thread
49 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
50 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
@@ -62,49 +62,224 @@
62 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
63 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: forum
64 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** URL: /forum
65 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Query parameters:
66 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** thread=N Show posts from thread N
68 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** item=N Show post N and its replies
69 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
70 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
71 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void forum_page(void){
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int threadId = 0;
73 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int itemId;
74 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
75 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
76 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
77 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
78 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.RdForum ){ login_needed(g.anon.RdForum); return; }
79 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
forum_verify_schema();
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("Forum");
80 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
itemId = atoi(PD("item","0"));
81 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( itemId>0 ){
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- threadId = db_int(0, "SELECT mthreadid FROM forumpost WHERE mpostid=%d",
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- itemId);
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( threadId==0 ) threadId = atoi(PD("thread","0"));
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( threadId>0 ){
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = 0;
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&q,
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT mtitle, npost, mthreadid FROM forumthread"
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " WHERE inreplyto IS NULL ORDER BY mtime DESC LIMIT 40"
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_header("Recent Forum Threads");
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( db_step(&q)==SQLITE_OK ){
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = db_column_int(&q,1);
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int threadid = db_column_int(&q,2);
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zTitle = db_column_text(&q,0);
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i==0 ){
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <ol>
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <li>
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ %z(href("%R/forum?thread=%d",threadid))%h(zTitle)</a><br>
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ %d(n) post%s(n==1?"":"s")</li>
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i ){
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ </ol>
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double rNow = db_double(0.0, "SELECT julianday('now')");
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Show the post given by itemId and all its descendents */
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "WITH RECURSIVE"
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " post(id,uname,mstat,mime,ipaddr,parent,mbody,depth,mtime) AS ("
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT mpostid, uname, mstatus, mimetype, ipaddr, inreplyto, mbody,"
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " 0, 1 FROM forumpost WHERE mpostid=%d"
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " UNION"
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT f.mpostid, f.uname, f.mstatus, f.mimetype, f.ipaddr,"
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " f.inreplyto, f.mbody, p.depth+1 AS xdepth, f.mtime AS xtime"
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM forumpost AS f, post AS p"
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE forumpost.inreplyto=post.id"
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY xdepth DESC, xtime ASC"
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ") SELECT * FROM post;",
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ itemId
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table border=0 class="forumtable">
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int id = db_column_int(&q, 0);
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUser = db_column_text(&q, 1);
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zStat = db_column_text(&q, 2);
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMime = db_column_text(&q, 3);
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zIp = db_column_text(&q, 4);
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDepth = db_column_int(&q, 7);
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double rMTime = db_column_double(&q, 8);
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zAge = db_timespan_name(rNow - rMTime);
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob body;
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <!-- Forum post %d(id) -->
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr>
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td class="forum_margin" width="%d((iDepth-1)*10)" rowspan="3"></td>
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%h(zUser) %z(zAge) ago</td>
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </tr>
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr><td class="forum_body">
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&body, db_column_text(&q,6), db_column_bytes(&q,6));
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wiki_render_by_mimetype(&body, zMime);
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&body);
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </td></tr>
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr><td class="forum_buttons">
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.WrForum ){
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.AdminForum || fossil_strcmp(g.zLogin, zUser)==0 ){
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href='%R/forumedit?item=%d(id)'>Edit</a>
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href='%R/forumedit?replyto=%d(id)'>Reply</a>
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </td></tr>
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If we reach this point, that means the users wants a list of
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** recent threads.
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 0;
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT a.mtitle, a.npost, b.mpostid"
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM forumthread AS a, forumpost AS b "
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE a.mthreadid=b.mthreadid"
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND b.inreplyto IS NULL"
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY a.mtime DESC LIMIT 40"
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.WrForum ){
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_submenu_element("New", "%R/forumedit");
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <h1>Recent Forum Threads</h>
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_OK ){
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = db_column_int(&q,1);
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int itemid = db_column_int(&q,2);
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTitle = db_column_text(&q,0);
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==0 ){
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <ol>
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <li>
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %z(href("%R/forum?item=%d",itemid))%h(zTitle)</a><br>
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %d(n) post%s(n==1?"":"s")</li>
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i ){
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </ol>
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_footer();
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use content in CGI parameters "s" (subject), "b" (body), and
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "m" (mimetype) to create a new forum entry.
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the id of the new forum entry.
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If any problems occur, return 0 and set *pzErr to a description of
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the problem.
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Cases:
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** itemId==0 && parentId==0 Starting a new thread.
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** itemId==0 && parentId>0 New reply to parentId
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** itemId>0 && parentId==0 Edit existing post itemId
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int forum_post(int itemId, int parentId, char **pzErr){
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSubject = 0;
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int threadId;
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double rNow = db_double(0.0, "SELECT julianday('now')");
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( itemId==0 && parentId==0 ){
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Start a new thread. Subject required. */
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_uint64 r1, r2;
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSubject = PT("s");
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zSubject==0 || zSubject[0]==0 ){
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pzErr = "\"Subject\" required to start a new thread";
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_randomness(sizeof(r1), &r1);
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_randomness(sizeof(r2), &r2);
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO forumthread(mthreadhash, mtitle, mtime, npost)"
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES(lower(hex(randomblob(32))),%Q,%!.17g,1)",
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSubject, rNow
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ threadId = db_last_insert_rowid();
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( itemId ){
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE forumpost SET"
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mtime=%!.17g,"
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mimetype=%Q,"
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ipaddr=%Q,"
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mbody=%Q"
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mpostid=%d",
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rNow, PT("m"), P("REMOTE_ADDR"), PT("b"), itemId
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO forumpost(mposthash,mthreadid,uname,mtime,"
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mstatus,mimetype,ipaddr,inreplyto,mbody) VALUES"
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " (lower(hex(randomblob(32))),%d,%Q,%!.17g,%Q,%Q,%Q,NULL,%Q)",
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ threadId,g.zLogin,rNow,NULL,P("m"),P("REMOTE_ADDR"),P("b"));
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ itemId = db_last_insert_rowid();
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zSubject==0 ){
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE forumthread SET mtime=%!.17g"
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mthreadid=(SELECT mthreadid FROM forumpost WHERE mpostid=%d)",
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rNow, itemId
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return itemId;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: forumedit
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Query parameters:
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** replyto=N Enter a reply to forum item N
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** item=N Edit item N
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** s=SUBJECT Subject. New thread only. Omitted for replies
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** b=BODY Body of the post
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** m=MIMETYPE Mimetype for the body of the post
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** x Submit changes
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** p Preview changes
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void forum_reply_page(void){
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int itemId;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int parentId;
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zErr = 0;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_check_credentials();
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zBody;
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMime;
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSub;
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.perm.WrForum ){ login_needed(g.anon.WrForum); return; }
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ forum_verify_schema();
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ itemId = atoi(PD("item","0"));
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ parentId = atoi(PD("replyto","0"));
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("x")!=0 && cgi_csrf_safe(1) ){
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ itemId = forum_post(itemId,parentId,&zErr);
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( itemId ){
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_redirectf("%R/forum?item=%d",itemId);
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("Edit Forum Post");
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <form method="POST">
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( itemId ){
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="hidden" name="item" value="%d(itemId)">
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( parentId ){
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="hidden" name="replyto" value="%d(parentId)">
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("p") ){
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <div class="forumpreview">
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( P("s") ){
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <h1>%h(PT("s"))</h1>
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <div class="forumpreviewbody">
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&x, PT("b"), -1);
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wiki_render_by_mimetype(&x, PT("m"));
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </div>
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </div>
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table border="0" class="forumeditform">
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( itemId==0 && parentId==0 ){
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSub = PT("s");
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </form>
109 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_footer();
110 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
111 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!