]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservdb_updates.c
2 * chanservdb_updates.c:
3 * Handle all the update requests for the database.
7 #include "../dbapi/dbapi.h"
8 #include "../core/config.h"
9 #include "../lib/sstring.h"
10 #include "../parser/parser.h"
11 #include "../core/events.h"
18 void csdb_updateauthinfo ( reguser
* rup
) {
19 char eschost
[ 2 * HOSTLEN
+ 1 ];
21 dbescapestring ( eschost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
22 dbquery ( "UPDATE chanserv.users SET lastauth= %l u,lastuserhost=' %s ' WHERE ID= %u " ,
23 rup
-> lastauth
, eschost
, rup
-> ID
);
26 void csdb_updatelastjoin ( regchanuser
* rcup
) {
27 dbquery ( "UPDATE chanserv.chanusers SET usetime= %l u WHERE userID= %u and channelID= %u " ,
28 rcup
-> usetime
, rcup
-> user
-> ID
, rcup
-> chan
-> ID
);
31 void csdb_updatetopic ( regchan
* rcp
) {
32 char esctopic
[ TOPICLEN
* 2 + 5 ];
35 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
39 dbquery ( "UPDATE chanserv.channels SET topic=' %s ' WHERE ID= %u " , esctopic
, rcp
-> ID
);
42 void csdb_updatechannel ( regchan
* rcp
) {
43 char escwelcome
[ WELCOMELEN
* 2 + 1 ];
44 char esctopic
[ TOPICLEN
* 2 + 1 ];
50 dbescapestring ( escname
, rcp
-> index
-> name
-> content
, rcp
-> index
-> name
-> length
);
53 dbescapestring ( escwelcome
, rcp
-> welcome
-> content
,
54 rcp
-> welcome
-> length
);
59 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
64 dbescapestring ( esckey
, rcp
-> key
-> content
, rcp
-> key
-> length
);
68 if ( rcp
-> suspendreason
)
69 dbescapestring ( escreason
, rcp
-> suspendreason
-> content
,
70 rcp
-> suspendreason
-> length
);
75 dbescapestring ( esccomment
, rcp
-> comment
-> content
,
76 rcp
-> comment
-> length
);
80 dbquery ( "UPDATE chanserv.channels SET name=' %s ', flags= %d , forcemodes= %d ,"
81 "denymodes= %d , chanlimit= %d , autolimit= %d , banstyle= %d ,"
82 "lastactive= %l u,statsreset= %l u, banduration= %l u, founder= %u ,"
83 "addedby= %u , suspendby= %u , suspendtime= %l u, chantype= %d , totaljoins= %u ,"
84 "tripjoins= %u , maxusers= %u , tripusers= %u ,"
85 "welcome=' %s ', topic=' %s ', chankey=' %s ', suspendreason=' %s ',"
86 "comment=' %s ', lasttimestamp= %j d WHERE ID= %u " , escname
, rcp
-> flags
, rcp
-> forcemodes
,
87 rcp
-> denymodes
, rcp
-> limit
, rcp
-> autolimit
, rcp
-> banstyle
,
88 rcp
-> lastactive
, rcp
-> statsreset
, rcp
-> banduration
,
89 rcp
-> founder
, rcp
-> addedby
, rcp
-> suspendby
, rcp
-> suspendtime
,
90 rcp
-> chantype
, rcp
-> totaljoins
, rcp
-> tripjoins
,
91 rcp
-> maxusers
, rcp
-> tripusers
,
92 escwelcome
, esctopic
, esckey
, escreason
, esccomment
,( intmax_t ) rcp
-> ltimestamp
, rcp
-> ID
);
95 #define CHANNELCOUNTER_BUFSIZE 512
96 #define CHANNELCOUNTER_MAX 512
98 static int channelcounter_count
= 0 ;
99 static char channelcounter_bufs
[ CHANNELCOUNTER_MAX
][ CHANNELCOUNTER_BUFSIZE
];
101 void csdb_flushchannelcounters ( void * arg
) {
104 if (! channelcounter_count
)
107 dbquery ( "BEGIN TRANSACTION;" );
109 for ( i
= 0 ; i
< channelcounter_count
; i
++)
110 dbquery ( " %s " , channelcounter_bufs
[ i
]);
114 channelcounter_count
= 0 ;
117 void csdb_updatechannelcounters ( regchan
* rcp
) {
118 if ( channelcounter_count
== CHANNELCOUNTER_MAX
)
119 csdb_flushchannelcounters ( NULL
);
121 snprintf ( channelcounter_bufs
[ channelcounter_count
], CHANNELCOUNTER_BUFSIZE
- 1 , "UPDATE chanserv.channels SET "
122 "lastactive= %l u, totaljoins= %u ,"
123 "tripjoins= %u , maxusers= %u , tripusers= %u "
126 rcp
-> totaljoins
, rcp
-> tripjoins
,
127 rcp
-> maxusers
, rcp
-> tripusers
,
130 channelcounter_count
++;
133 void csdb_updatechanneltimestamp ( regchan
* rcp
) {
134 dbquery ( "UPDATE chanserv.channels SET "
135 "lasttimestamp= %j d WHERE ID= %u " ,
136 ( intmax_t ) rcp
-> ltimestamp
, rcp
-> ID
);
139 void csdb_createchannel ( regchan
* rcp
) {
140 char escwelcome
[ WELCOMELEN
* 2 + 1 ];
141 char esctopic
[ TOPICLEN
* 2 + 1 ];
144 char esccomment
[ 510 ];
147 dbescapestring ( escname
, rcp
-> index
-> name
-> content
, rcp
-> index
-> name
-> length
);
150 dbescapestring ( escwelcome
, rcp
-> welcome
-> content
,
151 rcp
-> welcome
-> length
);
156 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
161 dbescapestring ( esckey
, rcp
-> key
-> content
, rcp
-> key
-> length
);
165 if ( rcp
-> suspendreason
)
166 dbescapestring ( escreason
, rcp
-> suspendreason
-> content
,
167 rcp
-> suspendreason
-> length
);
172 dbescapestring ( esccomment
, rcp
-> comment
-> content
,
173 rcp
-> comment
-> length
);
177 dbquery ( "INSERT INTO chanserv.channels (ID, name, flags, forcemodes, denymodes,"
178 "chanlimit, autolimit, banstyle, created, lastactive, statsreset, "
179 "banduration, founder, addedby, suspendby, suspendtime, chantype, totaljoins, tripjoins,"
180 "maxusers, tripusers, welcome, topic, chankey, suspendreason, "
181 "comment, lasttimestamp) VALUES ( %u ,' %s ', %d , %d , %d , %d , %d , %d , %l u, %l u, %l u, %l u, %u ,"
182 " %u , %u , %l u, %d , %u , %u , %u , %u ,' %s ',' %s ',' %s ',' %s ',' %s ', %j d)" ,
183 rcp
-> ID
, escname
, rcp
-> flags
, rcp
-> forcemodes
,
184 rcp
-> denymodes
, rcp
-> limit
, rcp
-> autolimit
, rcp
-> banstyle
, rcp
-> created
,
185 rcp
-> lastactive
, rcp
-> statsreset
, rcp
-> banduration
,
186 rcp
-> founder
, rcp
-> addedby
, rcp
-> suspendby
, rcp
-> suspendtime
,
187 rcp
-> chantype
, rcp
-> totaljoins
, rcp
-> tripjoins
,
188 rcp
-> maxusers
, rcp
-> tripusers
,
189 escwelcome
, esctopic
, esckey
, escreason
, esccomment
,( intmax_t ) rcp
-> ltimestamp
);
192 void csdb_deletechannel ( regchan
* rcp
) {
193 dbquery ( "DELETE FROM chanserv.channels WHERE ID= %u " , rcp
-> ID
);
194 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelID= %u " , rcp
-> ID
);
195 dbquery ( "DELETE FROM chanserv.bans WHERE channelID= %u " , rcp
-> ID
);
198 void csdb_deleteuser ( reguser
* rup
) {
199 dbquery ( "DELETE FROM chanserv.users WHERE ID= %u " , rup
-> ID
);
200 dbquery ( "DELETE FROM chanserv.chanusers WHERE userID= %u " , rup
-> ID
);
203 void csdb_updateuser ( reguser
* rup
) {
204 char escpassword
[ 25 ];
206 char esclastuserhost
[ 160 ];
208 char esccomment
[ 510 ];
210 char esclastemail
[ 210 ];
212 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
215 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
220 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
222 esclastemail
[ 0 ]= '\0' ;
224 if ( rup
-> lastuserhost
)
225 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
227 esclastuserhost
[ 0 ]= '\0' ;
229 if ( rup
-> suspendreason
)
230 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
235 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
240 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
244 dbquery ( "UPDATE chanserv.users SET lastauth= %l u, lastemailchng= %l u, flags= %u ,"
245 "language= %u , suspendby= %u , suspendexp= %l u, suspendtime= %l u, lockuntil= %l u, password=' %s ', email=' %s ',"
246 "lastuserhost=' %s ', suspendreason=' %s ', comment=' %s ', info=' %s ', lastemail=' %s ', lastpasschng= %l u "
248 rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
, rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
,
249 rup
-> suspendtime
, rup
-> lockuntil
, escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
254 void csdb_createuser ( reguser
* rup
) {
255 char escpassword
[ 25 ];
257 char esclastuserhost
[ 160 ];
259 char esccomment
[ 510 ];
260 char escusername
[ 35 ];
262 char esclastemail
[ 210 ];
264 dbescapestring ( escusername
, rup
-> username
, strlen ( rup
-> username
));
265 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
268 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
273 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
275 esclastemail
[ 0 ]= '\0' ;
277 if ( rup
-> lastuserhost
)
278 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
280 esclastuserhost
[ 0 ]= '\0' ;
282 if ( rup
-> suspendreason
)
283 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
288 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
293 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
297 dbquery ( "INSERT INTO chanserv.users (ID, username, created, lastauth, lastemailchng, "
298 "flags, language, suspendby, suspendexp, suspendtime, lockuntil, password, email, lastuserhost, "
299 "suspendreason, comment, info, lastemail, lastpasschng)"
300 "VALUES ( %u ,' %s ', %l u, %l u, %l u, %u , %u , %u , %l u, %l u, %l u,' %s ',' %s ',' %s ',' %s ',' %s ',' %s ',' %s ', %l u)" ,
301 rup
-> ID
, escusername
, rup
-> created
, rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
,
302 rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
, rup
-> suspendtime
, rup
-> lockuntil
,
303 escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
304 rup
-> lastpasschange
);
308 void csdb_updatechanuser ( regchanuser
* rcup
) {
312 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
316 dbquery ( "UPDATE chanserv.chanusers SET flags= %u , changetime= %l u, "
317 "usetime= %l u, info=' %s ' WHERE channelID= %u and userID= %u " ,
318 rcup
-> flags
, rcup
-> changetime
, rcup
-> usetime
, escinfo
, rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
321 void csdb_createchanuser ( regchanuser
* rcup
) {
325 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
329 dbquery ( "INSERT INTO chanserv.chanusers VALUES( %u , %u , %u , %l u, %l u, ' %s ')" ,
330 rcup
-> user
-> ID
, rcup
-> chan
-> ID
, rcup
-> flags
, rcup
-> changetime
,
331 rcup
-> usetime
, escinfo
);
334 void csdb_deletechanuser ( regchanuser
* rcup
) {
335 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelid= %u AND userID= %u " ,
336 rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
339 void csdb_createban ( regchan
* rcp
, regban
* rbp
) {
344 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
345 dbescapestring ( escban
, banstr
, strlen ( banstr
));
348 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
352 dbquery ( "INSERT INTO chanserv.bans (banID, channelID, userID, hostmask, "
353 "expiry, reason) VALUES ( %u , %u , %u ,' %s ', %l u,' %s ')" , rbp
-> ID
, rcp
-> ID
,
354 rbp
-> setby
, escban
, rbp
-> expiry
, escreason
);
357 void csdb_updateban ( regchan
* rcp
, regban
* rbp
) {
362 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
363 dbescapestring ( escban
, banstr
, strlen ( banstr
));
366 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
370 dbquery ( "UPDATE chanserv.bans set channelID= %u , userID= %u , hostmask=' %s ', expiry= %l u, reason=' %s ' "
371 "WHERE banID= %u " , rcp
-> ID
, rbp
-> setby
, escban
, rbp
-> expiry
, escreason
, rbp
-> ID
);
374 void csdb_deleteban ( regban
* rbp
) {
375 dbquery ( "DELETE FROM chanserv.bans WHERE banID= %u " , rbp
-> ID
);
378 void csdb_createmail ( reguser
* rup
, int type
) {
382 if ( type
== QMAIL_NEWEMAIL
) {
384 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
385 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType, prevEmail) "
386 "VALUES ( %u , %u ,' %s ')" , rup
-> ID
, type
, escemail
);
389 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType) VALUES ( %u , %u )" , rup
-> ID
, type
);
392 dbquery ( " %s " , sqlquery
);
395 void csdb_deletemaildomain ( maildomain
* mdp
) {
396 dbquery ( "DELETE FROM chanserv.maildomain WHERE ID= %u " , mdp
-> ID
);
399 void csdb_createmaildomain ( maildomain
* mdp
) {
401 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
403 dbquery ( "INSERT INTO chanserv.maildomain (id, name, domainlimit, actlimit, flags) VALUES( %u , ' %s ', %u , %u , %u )" , mdp
-> ID
, escdomain
, mdp
-> limit
, mdp
-> actlimit
, mdp
-> flags
);
406 void csdb_updatemaildomain ( maildomain
* mdp
) {
408 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
410 dbquery ( "UPDATE chanserv.maildomain SET domainlimit= %u , actlimit= %u , flags= %u , name=' %s ' WHERE ID= %u " , mdp
-> limit
, mdp
-> actlimit
, mdp
-> flags
, escdomain
, mdp
-> ID
);
413 void csdb_chanlevhistory_insert ( regchan
* rcp
, nick
* np
, reguser
* trup
, flag_t oldflags
, flag_t newflags
) {
414 reguser
* rup
= getreguserfromnick ( np
);
416 dbquery ( "INSERT INTO chanserv.chanlevhistory (userID, channelID, targetID, changetime, authtime, "
417 "oldflags, newflags) VALUES ( %u , %u , %u , %l u, %l u, %u , %u )" , rup
-> ID
, rcp
-> ID
, trup
-> ID
, getnettime (), np
-> accountts
,
421 void csdb_accounthistory_insert ( nick
* np
, char * oldpass
, char * newpass
, char * oldemail
, char * newemail
) {
422 reguser
* rup
= getreguserfromnick ( np
);
423 char escoldpass
[ PASSLEN
* 2 + 5 ];
424 char escnewpass
[ PASSLEN
* 2 + 5 ];
425 char escoldemail
[ EMAILLEN
* 2 + 5 ];
426 char escnewemail
[ EMAILLEN
* 2 + 5 ];
428 if (! rup
|| UHasOperPriv ( rup
))
432 dbescapestring ( escoldpass
, oldpass
, CSMIN ( strlen ( oldpass
), PASSLEN
));
437 dbescapestring ( escnewpass
, newpass
, CSMIN ( strlen ( newpass
), PASSLEN
));
442 dbescapestring ( escoldemail
, oldemail
, CSMIN ( strlen ( oldemail
), EMAILLEN
));
446 dbescapestring ( escnewemail
, newemail
, CSMIN ( strlen ( newemail
), EMAILLEN
));
450 dbquery ( "INSERT INTO chanserv.accounthistory (userID, changetime, authtime, oldpassword, newpassword, oldemail, "
451 "newemail) VALUES ( %u , %l u, %l u, ' %s ', ' %s ', ' %s ', ' %s ')" , rup
-> ID
, getnettime (), np
-> accountts
, escoldpass
, escnewpass
,
452 escoldemail
, escnewemail
);
455 void csdb_cleanuphistories ( time_t expire_time
) {
456 Error ( "chanserv" , ERR_INFO
, "Cleaning histories." );
457 dbquery ( "DELETE FROM chanserv.authhistory WHERE disconnecttime < %l u AND disconnecttime <> 0" , expire_time
);
458 dbquery ( "DELETE FROM chanserv.chanlevhistory WHERE authtime < %l u" , expire_time
);
459 dbquery ( "DELETE FROM chanserv.accounthistory WHERE authtime < %l u" , expire_time
);
462 void csdb_deletemaillock ( maillock
* mlp
) {
463 dbquery ( "DELETE FROM chanserv.maillocks WHERE ID= %u " , mlp
-> id
);
466 void csdb_createmaillock ( maillock
* mlp
) {
467 char escpattern
[ 1024 ], escreason
[ 1024 ];
469 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
472 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
476 dbquery ( "INSERT INTO chanserv.maillocks (id, pattern, reason, createdby, created) VALUES( %u , ' %s ', ' %s ', %u , %j d)" ,
477 mlp
-> id
, escpattern
, escreason
, mlp
-> createdby
,( intmax_t ) mlp
-> created
);
480 void csdb_updatemaillock ( maillock
* mlp
) {
481 char escpattern
[ 1024 ], escreason
[ 1024 ];
483 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
486 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
490 dbquery ( "UPDATE chanserv.maillocks SET pattern=' %s ', reason=' %s ', createdby= %u , created= %j d WHERE ID= %u " , escpattern
, escreason
, mlp
-> createdby
, ( intmax_t ) mlp
-> created
, mlp
-> id
);