]> jfr.im git - irc/quakenet/newserv.git/commitdiff
CHANSERV: batch up channel stat updates.
authorChris Porter <redacted>
Sun, 1 Sep 2013 23:33:59 +0000 (00:33 +0100)
committerChris Porter <redacted>
Sun, 1 Sep 2013 23:33:59 +0000 (00:33 +0100)
--HG--
branch : chanserv-live

chanserv/chanserv.c
chanserv/chanserv.h
chanserv/chanservdb_updates.c

index f8cc9bc15493e4cdeb5e347fbf79a7a0e2307f82..08ad07bd251a166b94e4a3edb92cf7fa40a65f10 100644 (file)
@@ -84,6 +84,7 @@ void chanservfinishinit(int hooknum, void *arg) {
   
   /* Schedule the dumps */
   schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL);
+  schedulerecurring(time(NULL)+5,0,5,csdb_flushchannelcounters,NULL);
 
   chanserv_init_status = CS_INIT_NOUSER;
 
@@ -126,6 +127,8 @@ void chanserv_finalinit() {
 }
 
 void _fini() {
+  csdb_flushchannelcounters(NULL);
+
   dbfreeid(q9dbid);
 
   deleteallschedules(cs_hourlyfunc);
@@ -133,6 +136,7 @@ void _fini() {
   deleteallschedules(chanservreguser);
   deleteallschedules(chanservdumpstuff);
   deleteallschedules(chanservdgline);
+  deleteallschedules(csdb_flushchannelcounters);
 
   if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) {
     int i;
index 83e5551c5830d1241a3cb3d23e5556819dbbb0de..ad00d5fec18f206b5904fd383576f3e60630bb82 100644 (file)
@@ -817,6 +817,7 @@ void csdb_updateban(regchan *rcp, regban *rbp);
 char *csdb_gethelpstr(char *command, int language);
 void csdb_createmail(reguser *rup, int type);
 void csdb_dohelp(nick *np, Command *cmd);
+void csdb_flushchannelcounters(void *arg);
 
 #define q9asyncquery(handler, tag, format, ...) dbasyncqueryi(q9dbid, handler, tag, format , ##__VA_ARGS__)
 #define q9a_asyncquery(handler, tag, format, ...) dbasyncqueryi(q9adbid, handler, tag, format , ##__VA_ARGS__)
index 3403dbe057a34695a877fd326c24b37616775f36..5c19fccf3d1a848a26954945242df2b510e40636 100644 (file)
@@ -92,8 +92,33 @@ void csdb_updatechannel(regchan *rcp) {
                  escwelcome,esctopic,esckey,escreason,esccomment,(intmax_t)rcp->ltimestamp,rcp->ID);
 }
 
+#define CHANNELCOUNTER_BUFSIZE 512
+#define CHANNELCOUNTER_MAX 512
+
+static int channelcounter_count = 0;
+static char channelcounter_bufs[CHANNELCOUNTER_MAX][CHANNELCOUNTER_BUFSIZE];
+
+void csdb_flushchannelcounters(void *arg) {
+  int i;
+
+  if(!channelcounter_count)
+    return;
+
+  dbquery("BEGIN TRANSACTION;");
+
+  for(i=0;i<channelcounter_count;i++)
+    dbquery("%s", channelcounter_bufs[i]);
+
+  dbquery("COMMIT;");
+
+  channelcounter_count = 0;
+}
+
 void csdb_updatechannelcounters(regchan *rcp) {
-  dbquery("UPDATE chanserv.channels SET "
+  if(channelcounter_count == CHANNELCOUNTER_MAX)
+    csdb_flushchannelcounters(NULL);
+
+  snprintf(channelcounter_bufs[channelcounter_count], CHANNELCOUNTER_BUFSIZE - 1, "UPDATE chanserv.channels SET "
                  "lastactive=%lu, totaljoins=%u,"
                  "tripjoins=%u, maxusers=%u, tripusers=%u "
                  "WHERE ID=%u",
@@ -101,6 +126,8 @@ void csdb_updatechannelcounters(regchan *rcp) {
                  rcp->totaljoins,rcp->tripjoins,
                  rcp->maxusers,rcp->tripusers,
                  rcp->ID);
+
+  channelcounter_count++;
 }
 
 void csdb_updatechanneltimestamp(regchan *rcp) {