]> jfr.im git - irc/quakenet/newserv.git/blobdiff - a4stats/a4stats_db.c
CHANSERV: don't delete the last user/channel to prevent id reuse
[irc/quakenet/newserv.git] / a4stats / a4stats_db.c
index 4376dd7916407a610217a4221629ad9b7d420e4f..af7ae917af4e1f89d9884abcf946d180f3f666f2 100644 (file)
@@ -151,56 +151,6 @@ static void a4stats_delete_dci(db_callback_info *dci) {
   free(dci);
 }
 
-static void a4stats_fetch_user_cb(const struct DBAPIResult *result, void *uarg) {
-  db_callback_info *dci = uarg;
-  time_t seen = 0, quotereset = 0;
-
-  if (result) {
-    if (result->success) {
-      while (result->next(result)) {
-        seen = (result->get(result, 0)) ? (time_t)strtoul(result->get(result, 0), NULL, 10) : 0;
-        quotereset = (result->get(result, 1)) ? (time_t)strtoul(result->get(result, 1), NULL, 10) : 0;
-      }
-    }
-
-    result->clear(result);
-  }
-
-  if (dci->interp) {
-    lua_vpcall(dci->interp, dci->callback, "llR", (long)seen, (long)quotereset, dci->uarg_index);
-    luaL_unref(dci->interp, LUA_REGISTRYINDEX, dci->uarg_index);
-  }
-
-  a4stats_delete_dci(dci);
-}
-
-static int a4stats_lua_fetch_user(lua_State *ps) {
-  const char *account, *callback;
-  unsigned long channelid, accountid;
-  db_callback_info *dci;
-
-  if (!lua_islong(ps, 1) || !lua_isstring(ps, 2) || !lua_isnumber(ps, 3) || !lua_isstring(ps, 4))
-    LUA_RETURN(ps, LUA_FAIL);
-
-  channelid = lua_tonumber(ps, 1);
-  account = lua_tostring(ps, 2);
-  accountid = lua_tonumber(ps, 3);
-  callback = lua_tostring(ps, 4);
-
-  dci = malloc(sizeof(*dci));
-  dci->interp = ps;
-
-  strncpy(dci->callback, callback, sizeof(dci->callback));
-  dci->callback[sizeof(dci->callback) - 1] = '\0';
-
-  lua_pushvalue(ps, 5);
-  dci->uarg_index = luaL_ref(ps, LUA_REGISTRYINDEX);
-
-  a4statsdb->query(a4statsdb, a4stats_fetch_user_cb, dci, "SELECT seen, quotereset FROM ? WHERE channelid = ? AND (accountid != 0 AND accountid = ? OR accountid = 0 AND account = ?)", "TUUs", "users", channelid, accountid, account);
-
-  LUA_RETURN(ps, LUA_OK);
-}
-
 typedef struct user_update_info {
   int stage;
   char *update;
@@ -530,6 +480,20 @@ static int a4stats_lua_disable_channel(lua_State *ps) {
   LUA_RETURN(ps, LUA_OK);
 }
 
+static int a4stats_lua_set_privacy(lua_State *ps) {
+  const char *channel;
+  unsigned long privacy;
+
+  if (!lua_isstring(ps, 1) || !lua_isnumber(ps, 2))
+    LUA_RETURN(ps, LUA_FAIL);
+
+  channel = lua_tostring(ps, 1);
+  privacy = lua_tonumber(ps, 2);
+
+  a4statsdb->squery(a4statsdb, "UPDATE ? SET privacy = ? WHERE name = ?", "TUs", "channels", privacy, channel);
+  LUA_RETURN(ps, LUA_OK);
+}
+
 static int a4stats_lua_add_kick(lua_State *ps) {
   unsigned long channelid, kickerid, victimid;
   const char *kicker, *victim, *reason;
@@ -568,20 +532,32 @@ static int a4stats_lua_add_topic(lua_State *ps) {
   LUA_RETURN(ps, LUA_OK);
 }
 
+static int a4stats_lua_db_begin(lua_State *ps) {
+  a4statsdb->query(a4statsdb, NULL, NULL, "BEGIN TRANSACTION", "");
+  LUA_RETURN(ps, LUA_OK);
+}
+
+static int a4stats_lua_db_commit(lua_State *ps) {
+  a4statsdb->query(a4statsdb, NULL, NULL, "COMMIT TRANSACTION", "");
+  LUA_RETURN(ps, LUA_OK);
+}
+
 static void a4stats_hook_loadscript(int hooknum, void *arg) {
   void **args = arg;
   lua_State *l = args[1];
 
   lua_register(l, "a4_enable_channel", a4stats_lua_enable_channel);
   lua_register(l, "a4_disable_channel", a4stats_lua_disable_channel);
+  lua_register(l, "a4_set_privacy", a4stats_lua_set_privacy);
   lua_register(l, "a4_fetch_channels", a4stats_lua_fetch_channels);
   lua_register(l, "a4_add_kick", a4stats_lua_add_kick);
   lua_register(l, "a4_add_topic", a4stats_lua_add_topic);
   lua_register(l, "a4_add_line", a4stats_lua_add_line);
-  lua_register(l, "a4_fetch_user", a4stats_lua_fetch_user);
   lua_register(l, "a4_update_user", a4stats_lua_update_user);
   lua_register(l, "a4_update_relation", a4stats_lua_update_relation);
   lua_register(l, "a4_escape_string", a4stats_lua_escape_string);
+  lua_register(l, "a4_db_begin", a4stats_lua_db_begin);
+  lua_register(l, "a4_db_commit", a4stats_lua_db_commit);
 }
 
 #define lua_unregister(L, n) (lua_pushnil(L), lua_setglobal(L, n))
@@ -627,6 +603,7 @@ void _fini(void) {
 
     lua_unregister(l->l, "a4_enable_channel");
     lua_unregister(l->l, "a4_disable_channel");
+    lua_unregister(l->l, "a4_set_privacy");
     lua_unregister(l->l, "a4_fetch_channels");
     lua_unregister(l->l, "a4_add_kick");
     lua_unregister(l->l, "a4_add_topic");
@@ -635,6 +612,8 @@ void _fini(void) {
     lua_unregister(l->l, "a4_update_user");
     lua_unregister(l->l, "a4_update_relation");
     lua_unregister(l->l, "a4_escape_string");
+    lua_unregister(l->l, "a4_db_begin");
+    lua_unregister(l->l, "a4_db_commit");
   }
 
   deregisterhook(HOOK_LUA_LOADSCRIPT, a4stats_hook_loadscript);