]>
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"
19 void csdb_updateauthinfo ( reguser
* rup
) {
20 char eschost
[ 2 * HOSTLEN
+ 1 ];
22 dbescapestring ( eschost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
23 dbquery ( "UPDATE chanserv.users SET lastauth= %l u,lastuserhost=' %s ' WHERE ID= %u " ,
24 rup
-> lastauth
, eschost
, rup
-> ID
);
27 void csdb_updatelastjoin ( regchanuser
* rcup
) {
28 dbquery ( "UPDATE chanserv.chanusers SET usetime= %l u WHERE userID= %u and channelID= %u " ,
29 rcup
-> usetime
, rcup
-> user
-> ID
, rcup
-> chan
-> ID
);
32 void csdb_updatetopic ( regchan
* rcp
) {
33 char esctopic
[ TOPICLEN
* 2 + 5 ];
36 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
40 dbquery ( "UPDATE chanserv.channels SET topic=' %s ' WHERE ID= %u " , esctopic
, rcp
-> ID
);
43 void csdb_updatechannel ( regchan
* rcp
) {
44 char escwelcome
[ WELCOMELEN
* 2 + 1 ];
45 char esctopic
[ TOPICLEN
* 2 + 1 ];
51 dbescapestring ( escname
, rcp
-> index
-> name
-> content
, rcp
-> index
-> name
-> length
);
54 dbescapestring ( escwelcome
, rcp
-> welcome
-> content
,
55 rcp
-> welcome
-> length
);
60 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
65 dbescapestring ( esckey
, rcp
-> key
-> content
, rcp
-> key
-> length
);
69 if ( rcp
-> suspendreason
)
70 dbescapestring ( escreason
, rcp
-> suspendreason
-> content
,
71 rcp
-> suspendreason
-> length
);
76 dbescapestring ( esccomment
, rcp
-> comment
-> content
,
77 rcp
-> comment
-> length
);
81 dbquery ( "UPDATE chanserv.channels SET name=' %s ', flags= %d , forcemodes= %d ,"
82 "denymodes= %d , chanlimit= %d , autolimit= %d , banstyle= %d ,"
83 "lastactive= %l u,statsreset= %l u, banduration= %l u, founder= %u ,"
84 "addedby= %u , suspendby= %u , suspendtime= %l u, chantype= %d , totaljoins= %u ,"
85 "tripjoins= %u , maxusers= %u , tripusers= %u ,"
86 "welcome=' %s ', topic=' %s ', chankey=' %s ', suspendreason=' %s ',"
87 "comment=' %s ', lasttimestamp= %j d WHERE ID= %u " , escname
, rcp
-> flags
, rcp
-> forcemodes
,
88 rcp
-> denymodes
, rcp
-> limit
, rcp
-> autolimit
, rcp
-> banstyle
,
89 rcp
-> lastactive
, rcp
-> statsreset
, rcp
-> banduration
,
90 rcp
-> founder
, rcp
-> addedby
, rcp
-> suspendby
, rcp
-> suspendtime
,
91 rcp
-> chantype
, rcp
-> totaljoins
, rcp
-> tripjoins
,
92 rcp
-> maxusers
, rcp
-> tripusers
,
93 escwelcome
, esctopic
, esckey
, escreason
, esccomment
,( intmax_t ) rcp
-> ltimestamp
, rcp
-> ID
);
96 #define CHANNELCOUNTER_BUFSIZE 512
97 #define CHANNELCOUNTER_MAX 512
99 static int channelcounter_count
= 0 ;
100 static char channelcounter_bufs
[ CHANNELCOUNTER_MAX
][ CHANNELCOUNTER_BUFSIZE
];
102 void csdb_flushchannelcounters ( void * arg
) {
105 if (! channelcounter_count
)
108 dbquery ( "BEGIN TRANSACTION;" );
110 for ( i
= 0 ; i
< channelcounter_count
; i
++)
111 dbquery ( " %s " , channelcounter_bufs
[ i
]);
115 channelcounter_count
= 0 ;
118 void csdb_updatechannelcounters ( regchan
* rcp
) {
119 if ( channelcounter_count
== CHANNELCOUNTER_MAX
)
120 csdb_flushchannelcounters ( NULL
);
122 snprintf ( channelcounter_bufs
[ channelcounter_count
], CHANNELCOUNTER_BUFSIZE
- 1 , "UPDATE chanserv.channels SET "
123 "lastactive= %l u, totaljoins= %u ,"
124 "tripjoins= %u , maxusers= %u , tripusers= %u "
127 rcp
-> totaljoins
, rcp
-> tripjoins
,
128 rcp
-> maxusers
, rcp
-> tripusers
,
131 channelcounter_count
++;
134 void csdb_updatechanneltimestamp ( regchan
* rcp
) {
135 dbquery ( "UPDATE chanserv.channels SET "
136 "lasttimestamp= %j d WHERE ID= %u " ,
137 ( intmax_t ) rcp
-> ltimestamp
, rcp
-> ID
);
140 void csdb_createchannel ( regchan
* rcp
) {
141 char escwelcome
[ WELCOMELEN
* 2 + 1 ];
142 char esctopic
[ TOPICLEN
* 2 + 1 ];
145 char esccomment
[ 510 ];
148 dbescapestring ( escname
, rcp
-> index
-> name
-> content
, rcp
-> index
-> name
-> length
);
151 dbescapestring ( escwelcome
, rcp
-> welcome
-> content
,
152 rcp
-> welcome
-> length
);
157 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
162 dbescapestring ( esckey
, rcp
-> key
-> content
, rcp
-> key
-> length
);
166 if ( rcp
-> suspendreason
)
167 dbescapestring ( escreason
, rcp
-> suspendreason
-> content
,
168 rcp
-> suspendreason
-> length
);
173 dbescapestring ( esccomment
, rcp
-> comment
-> content
,
174 rcp
-> comment
-> length
);
178 dbquery ( "INSERT INTO chanserv.channels (ID, name, flags, forcemodes, denymodes,"
179 "chanlimit, autolimit, banstyle, created, lastactive, statsreset, "
180 "banduration, founder, addedby, suspendby, suspendtime, chantype, totaljoins, tripjoins,"
181 "maxusers, tripusers, welcome, topic, chankey, suspendreason, "
182 "comment, lasttimestamp) VALUES ( %u ,' %s ', %d , %d , %d , %d , %d , %d , %l u, %l u, %l u, %l u, %u ,"
183 " %u , %u , %l u, %d , %u , %u , %u , %u ,' %s ',' %s ',' %s ',' %s ',' %s ', %j d)" ,
184 rcp
-> ID
, escname
, rcp
-> flags
, rcp
-> forcemodes
,
185 rcp
-> denymodes
, rcp
-> limit
, rcp
-> autolimit
, rcp
-> banstyle
, rcp
-> created
,
186 rcp
-> lastactive
, rcp
-> statsreset
, rcp
-> banduration
,
187 rcp
-> founder
, rcp
-> addedby
, rcp
-> suspendby
, rcp
-> suspendtime
,
188 rcp
-> chantype
, rcp
-> totaljoins
, rcp
-> tripjoins
,
189 rcp
-> maxusers
, rcp
-> tripusers
,
190 escwelcome
, esctopic
, esckey
, escreason
, esccomment
,( intmax_t ) rcp
-> ltimestamp
);
193 void csdb_deletechannel ( regchan
* rcp
) {
194 dbquery ( "DELETE FROM chanserv.channels WHERE ID= %u " , rcp
-> ID
);
195 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelID= %u " , rcp
-> ID
);
196 dbquery ( "DELETE FROM chanserv.bans WHERE channelID= %u " , rcp
-> ID
);
199 void csdb_deleteuser ( reguser
* rup
) {
200 dbquery ( "DELETE FROM chanserv.users WHERE ID= %u " , rup
-> ID
);
201 dbquery ( "DELETE FROM chanserv.chanusers WHERE userID= %u " , rup
-> ID
);
204 void csdb_updateuser ( reguser
* rup
) {
205 char escpassword
[ 25 ];
207 char esclastuserhost
[ 160 ];
209 char esccomment
[ 510 ];
211 char esclastemail
[ 210 ];
213 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
216 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
221 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
223 esclastemail
[ 0 ]= '\0' ;
225 if ( rup
-> lastuserhost
)
226 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
228 esclastuserhost
[ 0 ]= '\0' ;
230 if ( rup
-> suspendreason
)
231 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
236 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
241 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
245 dbquery ( "UPDATE chanserv.users SET lastauth= %l u, lastemailchng= %l u, flags= %u ,"
246 "language= %u , suspendby= %u , suspendexp= %l u, suspendtime= %l u, lockuntil= %l u, password=' %s ', email=' %s ',"
247 "lastuserhost=' %s ', suspendreason=' %s ', comment=' %s ', info=' %s ', lastemail=' %s ', lastpasschng= %l u "
249 rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
, rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
,
250 rup
-> suspendtime
, rup
-> lockuntil
, escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
255 void csdb_createuser ( reguser
* rup
) {
256 char escpassword
[ 25 ];
258 char esclastuserhost
[ 160 ];
260 char esccomment
[ 510 ];
261 char escusername
[ 35 ];
263 char esclastemail
[ 210 ];
265 dbescapestring ( escusername
, rup
-> username
, strlen ( rup
-> username
));
266 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
269 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
274 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
276 esclastemail
[ 0 ]= '\0' ;
278 if ( rup
-> lastuserhost
)
279 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
281 esclastuserhost
[ 0 ]= '\0' ;
283 if ( rup
-> suspendreason
)
284 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
289 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
294 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
298 dbquery ( "INSERT INTO chanserv.users (ID, username, created, lastauth, lastemailchng, "
299 "flags, language, suspendby, suspendexp, suspendtime, lockuntil, password, email, lastuserhost, "
300 "suspendreason, comment, info, lastemail, lastpasschng)"
301 "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)" ,
302 rup
-> ID
, escusername
, rup
-> created
, rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
,
303 rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
, rup
-> suspendtime
, rup
-> lockuntil
,
304 escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
305 rup
-> lastpasschange
);
309 void csdb_updatechanuser ( regchanuser
* rcup
) {
313 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
317 dbquery ( "UPDATE chanserv.chanusers SET flags= %u , changetime= %l u, "
318 "usetime= %l u, info=' %s ' WHERE channelID= %u and userID= %u " ,
319 rcup
-> flags
, rcup
-> changetime
, rcup
-> usetime
, escinfo
, rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
322 void csdb_createchanuser ( regchanuser
* rcup
) {
326 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
330 dbquery ( "INSERT INTO chanserv.chanusers VALUES( %u , %u , %u , %l u, %l u, ' %s ')" ,
331 rcup
-> user
-> ID
, rcup
-> chan
-> ID
, rcup
-> flags
, rcup
-> changetime
,
332 rcup
-> usetime
, escinfo
);
335 void csdb_deletechanuser ( regchanuser
* rcup
) {
336 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelid= %u AND userID= %u " ,
337 rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
340 void csdb_createban ( regchan
* rcp
, regban
* rbp
) {
345 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
346 dbescapestring ( escban
, banstr
, strlen ( banstr
));
349 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
353 dbquery ( "INSERT INTO chanserv.bans (banID, channelID, userID, hostmask, "
354 "expiry, reason) VALUES ( %u , %u , %u ,' %s ', %l u,' %s ')" , rbp
-> ID
, rcp
-> ID
,
355 rbp
-> setby
, escban
, rbp
-> expiry
, escreason
);
358 void csdb_updateban ( regchan
* rcp
, regban
* rbp
) {
363 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
364 dbescapestring ( escban
, banstr
, strlen ( banstr
));
367 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
371 dbquery ( "UPDATE chanserv.bans set channelID= %u , userID= %u , hostmask=' %s ', expiry= %l u, reason=' %s ' "
372 "WHERE banID= %u " , rcp
-> ID
, rbp
-> setby
, escban
, rbp
-> expiry
, escreason
, rbp
-> ID
);
375 void csdb_deleteban ( regban
* rbp
) {
376 dbquery ( "DELETE FROM chanserv.bans WHERE banID= %u " , rbp
-> ID
);
379 void csdb_createmail ( reguser
* rup
, int type
) {
383 if ( type
== QMAIL_NEWEMAIL
) {
385 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
386 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType, prevEmail) "
387 "VALUES ( %u , %u ,' %s ')" , rup
-> ID
, type
, escemail
);
390 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType) VALUES ( %u , %u )" , rup
-> ID
, type
);
393 dbquery ( " %s " , sqlquery
);
396 void csdb_deletemaildomain ( maildomain
* mdp
) {
397 dbquery ( "DELETE FROM chanserv.maildomain WHERE ID= %u " , mdp
-> ID
);
400 void csdb_createmaildomain ( maildomain
* mdp
) {
402 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
404 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
);
407 void csdb_updatemaildomain ( maildomain
* mdp
) {
409 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
411 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
);
414 void csdb_chanlevhistory_insert ( regchan
* rcp
, nick
* np
, reguser
* trup
, flag_t oldflags
, flag_t newflags
) {
415 reguser
* rup
= getreguserfromnick ( np
);
418 dbquery ( "INSERT INTO chanserv.chanlevhistory (userID, channelID, targetID, changetime, authtime, "
419 "oldflags, newflags) VALUES ( %u , %u , %u , %l u, %l u, %u , %u )" , rup
-> ID
, rcp
-> ID
, trup
-> ID
, getnettime (), np
-> accountts
,
423 void csdb_accounthistory_insert ( nick
* np
, char * oldpass
, char * newpass
, char * oldemail
, char * newemail
) {
424 reguser
* rup
= getreguserfromnick ( np
);
425 char escoldpass
[ PASSLEN
* 2 + 5 ];
426 char escnewpass
[ PASSLEN
* 2 + 5 ];
427 char escoldemail
[ EMAILLEN
* 2 + 5 ];
428 char escnewemail
[ EMAILLEN
* 2 + 5 ];
430 if (! rup
|| UHasOperPriv ( rup
))
434 dbescapestring ( escoldpass
, oldpass
, CSMIN ( strlen ( oldpass
), PASSLEN
));
439 dbescapestring ( escnewpass
, newpass
, CSMIN ( strlen ( newpass
), PASSLEN
));
444 dbescapestring ( escoldemail
, oldemail
, CSMIN ( strlen ( oldemail
), EMAILLEN
));
448 dbescapestring ( escnewemail
, newemail
, CSMIN ( strlen ( newemail
), EMAILLEN
));
452 dbquery ( "INSERT INTO chanserv.accounthistory (userID, changetime, authtime, oldpassword, newpassword, oldemail, "
453 "newemail) VALUES ( %u , %l u, %l u, ' %s ', ' %s ', ' %s ', ' %s ')" , rup
-> ID
, getnettime (), np
-> accountts
, escoldpass
, escnewpass
,
454 escoldemail
, escnewemail
);
457 void csdb_cleanuphistories ( time_t expire_time
) {
458 Error ( "chanserv" , ERR_INFO
, "Cleaning histories." );
459 dbquery ( "DELETE FROM chanserv.authhistory WHERE disconnecttime < %l u AND disconnecttime <> 0" , expire_time
);
460 dbquery ( "DELETE FROM chanserv.chanlevhistory WHERE authtime < %l u" , expire_time
);
461 dbquery ( "DELETE FROM chanserv.accounthistory WHERE authtime < %l u" , expire_time
);
464 void csdb_deletemaillock ( maillock
* mlp
) {
465 dbquery ( "DELETE FROM chanserv.maillocks WHERE ID= %u " , mlp
-> id
);
468 void csdb_createmaillock ( maillock
* mlp
) {
469 char escpattern
[ 1024 ], escreason
[ 1024 ];
471 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
474 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
478 dbquery ( "INSERT INTO chanserv.maillocks (id, pattern, reason, createdby, created) VALUES( %u , ' %s ', ' %s ', %u , %j d)" ,
479 mlp
-> id
, escpattern
, escreason
, mlp
-> createdby
,( intmax_t ) mlp
-> created
);
482 void csdb_updatemaillock ( maillock
* mlp
) {
483 char escpattern
[ 1024 ], escreason
[ 1024 ];
485 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
488 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
492 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
);