Fossil

Check-in [35fbf4995d]
Login

Check-in [35fbf4995d]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Automatically purge older chat messages using the chat-keep-count and chat-keep-days settings to determine which messages to delete.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 35fbf4995d7064e3e3d422985149b4a525a9e8c46008d2b740071042df6cf09e
User & Date: drh 2020-12-24 19:15:23.479
Context
2020-12-24
19:28
A valid /chat-ping request should set the Access-Control-Allow-Origin in the reply header, to avoid client-side errors. ... (check-in: ffb40fd894 user: drh tags: trunk)
19:15
Automatically purge older chat messages using the chat-keep-count and chat-keep-days settings to determine which messages to delete. ... (check-in: 35fbf4995d user: drh tags: trunk)
19:00
Show the number of chat messages and the amount of storage space used by chat on the /stat page. ... (check-in: 4da6a4cce0 user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/chat.c.
215
216
217
218
219
220
221

























222
223
224
225
226
227
228
229
230
231
232
233
234
235
236


237
238
239
240
241
242
243
static void chat_create_tables(void){
  if( !db_table_exists("repository","chat") ){
    db_multi_exec(zChatSchema1/*works-like:""*/);
  }else if( !db_table_has_column("repository","chat","mdel") ){
    db_multi_exec("ALTER TABLE chat ADD COLUMN mdel INT");
  }
}


























/*
** WEBPAGE: chat-send
**
** This page receives (via XHR) a new chat-message and/or a new file
** to be entered into the chat history.
*/
void chat_send_webpage(void){
  int nByte;
  const char *zMsg;
  login_check_credentials();
  if( !g.perm.Chat ) return;
  chat_create_tables();
  nByte = atoi(PD("file:bytes",0));
  zMsg = PD("msg","");


  if( nByte==0 ){
    if( zMsg[0] ){
      db_multi_exec(
        "INSERT INTO chat(mtime,xfrom,xmsg)"
        "VALUES(julianday('now'),%Q,%Q)",
        g.zLogin, zMsg
      );







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>















>
>







215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
static void chat_create_tables(void){
  if( !db_table_exists("repository","chat") ){
    db_multi_exec(zChatSchema1/*works-like:""*/);
  }else if( !db_table_has_column("repository","chat","mdel") ){
    db_multi_exec("ALTER TABLE chat ADD COLUMN mdel INT");
  }
}

/*
** Delete old content from the chat table.
*/
static void chat_purge(void){
   int mxCnt = db_get_int("chat-keep-count",50);
   double mxDays = atof(db_get("chat-keep-days","7"));
   double rAge;
   int msgid;
   rAge = db_double(0.0, "SELECT julianday('now')-mtime FROM chat"
                         " ORDER BY msgid LIMIT 1");
   if( rAge>mxDays ){
     msgid = db_int(0, "SELECT msgid FROM chat"
                       " ORDER BY msgid DESC LIMIT 1 OFFSET %d", mxCnt);
     if( msgid>0 ){
       Stmt s;
       db_prepare(&s, 
             "DELETE FROM chat WHERE mtime<julianday('now')-:mxage"
             " AND msgid<%d", msgid);
       db_bind_double(&s, ":mxage", mxDays);
       db_step(&s);
       db_finalize(&s);
     }
   }
}

/*
** WEBPAGE: chat-send
**
** This page receives (via XHR) a new chat-message and/or a new file
** to be entered into the chat history.
*/
void chat_send_webpage(void){
  int nByte;
  const char *zMsg;
  login_check_credentials();
  if( !g.perm.Chat ) return;
  chat_create_tables();
  nByte = atoi(PD("file:bytes",0));
  zMsg = PD("msg","");
  db_begin_write();
  chat_purge();
  if( nByte==0 ){
    if( zMsg[0] ){
      db_multi_exec(
        "INSERT INTO chat(mtime,xfrom,xmsg)"
        "VALUES(julianday('now'),%Q,%Q)",
        g.zLogin, zMsg
      );
252
253
254
255
256
257
258

259
260
261
262
263
264
265
        PD("file:mimetype","application/octet-stream"));
    blob_init(&b, P("file"), nByte);
    db_bind_blob(&q, ":file", &b);
    db_step(&q);
    db_finalize(&q);
    blob_reset(&b);
  }

}

/*
** This routine receives raw (user-entered) message text and transforms
** it into HTML that is safe to insert using innerHTML.
**
**    *   HTML in the original text is escaped.







>







279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
        PD("file:mimetype","application/octet-stream"));
    blob_init(&b, P("file"), nByte);
    db_bind_blob(&q, ":file", &b);
    db_step(&q);
    db_finalize(&q);
    blob_reset(&b);
  }
  db_commit_transaction();
}

/*
** This routine receives raw (user-entered) message text and transforms
** it into HTML that is safe to insert using innerHTML.
**
**    *   HTML in the original text is escaped.
406
407
408
409
410
411
412





413
414
415
416
417
418
419
  int msgid = atoi(PD("name","0"));
  Stmt q1;
  login_check_credentials();
  if( !g.perm.Chat ) return;
  chat_create_tables();
  cgi_set_content_type("text/json");
  dataVersion = db_int64(0, "PRAGMA data_version");





  if( msgid<0 ){
    msgid = db_int(0,
        "SELECT msgid FROM chat WHERE mdel IS NOT true"
        " ORDER BY msgid DESC LIMIT 1 OFFSET %d", -msgid);
  }
  db_prepare(&q1,
    "SELECT msgid, datetime(mtime), xfrom, xmsg, length(file),"







>
>
>
>
>







434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  int msgid = atoi(PD("name","0"));
  Stmt q1;
  login_check_credentials();
  if( !g.perm.Chat ) return;
  chat_create_tables();
  cgi_set_content_type("text/json");
  dataVersion = db_int64(0, "PRAGMA data_version");
  if( msgid<=0 ){
    db_begin_write();
    chat_purge();
    db_commit_transaction();
  }
  if( msgid<0 ){
    msgid = db_int(0,
        "SELECT msgid FROM chat WHERE mdel IS NOT true"
        " ORDER BY msgid DESC LIMIT 1 OFFSET %d", -msgid);
  }
  db_prepare(&q1,
    "SELECT msgid, datetime(mtime), xfrom, xmsg, length(file),"