]>
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 void csdb_updatechannelcounters ( regchan
* rcp
) {
97 dbquery ( "UPDATE chanserv.channels SET "
98 "lastactive= %l u, totaljoins= %u ,"
99 "tripjoins= %u , maxusers= %u , tripusers= %u "
102 rcp
-> totaljoins
, rcp
-> tripjoins
,
103 rcp
-> maxusers
, rcp
-> tripusers
,
107 void csdb_updatechanneltimestamp ( regchan
* rcp
) {
108 dbquery ( "UPDATE chanserv.channels SET "
109 "lasttimestamp= %j d WHERE ID= %u " ,
110 ( intmax_t ) rcp
-> ltimestamp
, rcp
-> ID
);
113 void csdb_createchannel ( regchan
* rcp
) {
114 char escwelcome
[ WELCOMELEN
* 2 + 1 ];
115 char esctopic
[ TOPICLEN
* 2 + 1 ];
118 char esccomment
[ 510 ];
121 dbescapestring ( escname
, rcp
-> index
-> name
-> content
, rcp
-> index
-> name
-> length
);
124 dbescapestring ( escwelcome
, rcp
-> welcome
-> content
,
125 rcp
-> welcome
-> length
);
130 dbescapestring ( esctopic
, rcp
-> topic
-> content
, rcp
-> topic
-> length
);
135 dbescapestring ( esckey
, rcp
-> key
-> content
, rcp
-> key
-> length
);
139 if ( rcp
-> suspendreason
)
140 dbescapestring ( escreason
, rcp
-> suspendreason
-> content
,
141 rcp
-> suspendreason
-> length
);
146 dbescapestring ( esccomment
, rcp
-> comment
-> content
,
147 rcp
-> comment
-> length
);
151 dbquery ( "INSERT INTO chanserv.channels (ID, name, flags, forcemodes, denymodes,"
152 "chanlimit, autolimit, banstyle, created, lastactive, statsreset, "
153 "banduration, founder, addedby, suspendby, suspendtime, chantype, totaljoins, tripjoins,"
154 "maxusers, tripusers, welcome, topic, chankey, suspendreason, "
155 "comment, lasttimestamp) VALUES ( %u ,' %s ', %d , %d , %d , %d , %d , %d , %l u, %l u, %l u, %l u, %u ,"
156 " %u , %u , %l u, %d , %u , %u , %u , %u ,' %s ',' %s ',' %s ',' %s ',' %s ', %j d)" ,
157 rcp
-> ID
, escname
, rcp
-> flags
, rcp
-> forcemodes
,
158 rcp
-> denymodes
, rcp
-> limit
, rcp
-> autolimit
, rcp
-> banstyle
, rcp
-> created
,
159 rcp
-> lastactive
, rcp
-> statsreset
, rcp
-> banduration
,
160 rcp
-> founder
, rcp
-> addedby
, rcp
-> suspendby
, rcp
-> suspendtime
,
161 rcp
-> chantype
, rcp
-> totaljoins
, rcp
-> tripjoins
,
162 rcp
-> maxusers
, rcp
-> tripusers
,
163 escwelcome
, esctopic
, esckey
, escreason
, esccomment
,( intmax_t ) rcp
-> ltimestamp
);
166 void csdb_deletechannel ( regchan
* rcp
) {
167 dbquery ( "DELETE FROM chanserv.channels WHERE ID= %u " , rcp
-> ID
);
168 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelID= %u " , rcp
-> ID
);
169 dbquery ( "DELETE FROM chanserv.bans WHERE channelID= %u " , rcp
-> ID
);
172 void csdb_deleteuser ( reguser
* rup
) {
173 dbquery ( "DELETE FROM chanserv.users WHERE ID= %u " , rup
-> ID
);
174 dbquery ( "DELETE FROM chanserv.chanusers WHERE userID= %u " , rup
-> ID
);
177 void csdb_updateuser ( reguser
* rup
) {
178 char escpassword
[ 25 ];
180 char esclastuserhost
[ 160 ];
182 char esccomment
[ 510 ];
184 char esclastemail
[ 210 ];
186 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
189 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
194 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
196 esclastemail
[ 0 ]= '\0' ;
198 if ( rup
-> lastuserhost
)
199 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
201 esclastuserhost
[ 0 ]= '\0' ;
203 if ( rup
-> suspendreason
)
204 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
209 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
214 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
218 dbquery ( "UPDATE chanserv.users SET lastauth= %l u, lastemailchng= %l u, flags= %u ,"
219 "language= %u , suspendby= %u , suspendexp= %l u, suspendtime= %l u, lockuntil= %l u, password=' %s ', email=' %s ',"
220 "lastuserhost=' %s ', suspendreason=' %s ', comment=' %s ', info=' %s ', lastemail=' %s ', lastpasschng= %l u "
222 rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
, rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
,
223 rup
-> suspendtime
, rup
-> lockuntil
, escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
228 void csdb_createuser ( reguser
* rup
) {
229 char escpassword
[ 25 ];
231 char esclastuserhost
[ 160 ];
233 char esccomment
[ 510 ];
234 char escusername
[ 35 ];
236 char esclastemail
[ 210 ];
238 dbescapestring ( escusername
, rup
-> username
, strlen ( rup
-> username
));
239 dbescapestring ( escpassword
, rup
-> password
, strlen ( rup
-> password
));
242 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
247 dbescapestring ( esclastemail
, rup
-> lastemail
-> content
, rup
-> lastemail
-> length
);
249 esclastemail
[ 0 ]= '\0' ;
251 if ( rup
-> lastuserhost
)
252 dbescapestring ( esclastuserhost
, rup
-> lastuserhost
-> content
, rup
-> lastuserhost
-> length
);
254 esclastuserhost
[ 0 ]= '\0' ;
256 if ( rup
-> suspendreason
)
257 dbescapestring ( escreason
, rup
-> suspendreason
-> content
, rup
-> suspendreason
-> length
);
262 dbescapestring ( esccomment
, rup
-> comment
-> content
, rup
-> comment
-> length
);
267 dbescapestring ( escinfo
, rup
-> info
-> content
, rup
-> info
-> length
);
271 dbquery ( "INSERT INTO chanserv.users (ID, username, created, lastauth, lastemailchng, "
272 "flags, language, suspendby, suspendexp, suspendtime, lockuntil, password, email, lastuserhost, "
273 "suspendreason, comment, info, lastemail, lastpasschng)"
274 "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)" ,
275 rup
-> ID
, escusername
, rup
-> created
, rup
-> lastauth
, rup
-> lastemailchange
, rup
-> flags
,
276 rup
-> languageid
, rup
-> suspendby
, rup
-> suspendexp
, rup
-> suspendtime
, rup
-> lockuntil
,
277 escpassword
, escemail
, esclastuserhost
, escreason
, esccomment
, escinfo
, esclastemail
,
278 rup
-> lastpasschange
);
282 void csdb_updatechanuser ( regchanuser
* rcup
) {
286 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
290 dbquery ( "UPDATE chanserv.chanusers SET flags= %u , changetime= %l u, "
291 "usetime= %l u, info=' %s ' WHERE channelID= %u and userID= %u " ,
292 rcup
-> flags
, rcup
-> changetime
, rcup
-> usetime
, escinfo
, rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
295 void csdb_createchanuser ( regchanuser
* rcup
) {
299 dbescapestring ( escinfo
, rcup
-> info
-> content
, rcup
-> info
-> length
);
303 dbquery ( "INSERT INTO chanserv.chanusers VALUES( %u , %u , %u , %l u, %l u, ' %s ')" ,
304 rcup
-> user
-> ID
, rcup
-> chan
-> ID
, rcup
-> flags
, rcup
-> changetime
,
305 rcup
-> usetime
, escinfo
);
308 void csdb_deletechanuser ( regchanuser
* rcup
) {
309 dbquery ( "DELETE FROM chanserv.chanusers WHERE channelid= %u AND userID= %u " ,
310 rcup
-> chan
-> ID
, rcup
-> user
-> ID
);
313 void csdb_createban ( regchan
* rcp
, regban
* rbp
) {
318 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
319 dbescapestring ( escban
, banstr
, strlen ( banstr
));
322 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
326 dbquery ( "INSERT INTO chanserv.bans (banID, channelID, userID, hostmask, "
327 "expiry, reason) VALUES ( %u , %u , %u ,' %s ', %l u,' %s ')" , rbp
-> ID
, rcp
-> ID
,
328 rbp
-> setby
, escban
, rbp
-> expiry
, escreason
);
331 void csdb_updateban ( regchan
* rcp
, regban
* rbp
) {
336 strcpy ( banstr
, bantostring ( rbp
-> cbp
));
337 dbescapestring ( escban
, banstr
, strlen ( banstr
));
340 dbescapestring ( escreason
, rbp
-> reason
-> content
, rbp
-> reason
-> length
);
344 dbquery ( "UPDATE chanserv.bans set channelID= %u , userID= %u , hostmask=' %s ', expiry= %l u, reason=' %s ' "
345 "WHERE banID= %u " , rcp
-> ID
, rbp
-> setby
, escban
, rbp
-> expiry
, escreason
, rbp
-> ID
);
348 void csdb_deleteban ( regban
* rbp
) {
349 dbquery ( "DELETE FROM chanserv.bans WHERE banID= %u " , rbp
-> ID
);
352 void csdb_createmail ( reguser
* rup
, int type
) {
356 if ( type
== QMAIL_NEWEMAIL
) {
358 dbescapestring ( escemail
, rup
-> email
-> content
, rup
-> email
-> length
);
359 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType, prevEmail) "
360 "VALUES ( %u , %u ,' %s ')" , rup
-> ID
, type
, escemail
);
363 sprintf ( sqlquery
, "INSERT INTO chanserv.email (userID, emailType) VALUES ( %u , %u )" , rup
-> ID
, type
);
366 dbquery ( " %s " , sqlquery
);
369 void csdb_deletemaildomain ( maildomain
* mdp
) {
370 dbquery ( "DELETE FROM chanserv.maildomain WHERE ID= %u " , mdp
-> ID
);
373 void csdb_createmaildomain ( maildomain
* mdp
) {
375 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
377 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
);
380 void csdb_updatemaildomain ( maildomain
* mdp
) {
382 dbescapestring ( escdomain
, mdp
-> name
-> content
, mdp
-> name
-> length
);
384 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
);
387 void csdb_chanlevhistory_insert ( regchan
* rcp
, nick
* np
, reguser
* trup
, flag_t oldflags
, flag_t newflags
) {
388 reguser
* rup
= getreguserfromnick ( np
);
391 dbquery ( "INSERT INTO chanserv.chanlevhistory (userID, channelID, targetID, changetime, authtime, "
392 "oldflags, newflags) VALUES ( %u , %u , %u , %l u, %l u, %u , %u )" , rup
-> ID
, rcp
-> ID
, trup
-> ID
, getnettime (), np
-> accountts
,
396 void csdb_accounthistory_insert ( nick
* np
, char * oldpass
, char * newpass
, char * oldemail
, char * newemail
) {
397 reguser
* rup
= getreguserfromnick ( np
);
398 char escoldpass
[ PASSLEN
* 2 + 5 ];
399 char escnewpass
[ PASSLEN
* 2 + 5 ];
400 char escoldemail
[ EMAILLEN
* 2 + 5 ];
401 char escnewemail
[ EMAILLEN
* 2 + 5 ];
403 if (! rup
|| UHasOperPriv ( rup
))
407 dbescapestring ( escoldpass
, oldpass
, CSMIN ( strlen ( oldpass
), PASSLEN
));
412 dbescapestring ( escnewpass
, newpass
, CSMIN ( strlen ( newpass
), PASSLEN
));
417 dbescapestring ( escoldemail
, oldemail
, CSMIN ( strlen ( oldemail
), EMAILLEN
));
421 dbescapestring ( escnewemail
, newemail
, CSMIN ( strlen ( newemail
), EMAILLEN
));
425 dbquery ( "INSERT INTO chanserv.accounthistory (userID, changetime, authtime, oldpassword, newpassword, oldemail, "
426 "newemail) VALUES ( %u , %l u, %l u, ' %s ', ' %s ', ' %s ', ' %s ')" , rup
-> ID
, getnettime (), np
-> accountts
, escoldpass
, escnewpass
,
427 escoldemail
, escnewemail
);
430 void csdb_cleanuphistories ( time_t expire_time
) {
431 Error ( "chanserv" , ERR_INFO
, "Cleaning histories." );
432 dbquery ( "DELETE FROM chanserv.authhistory WHERE disconnecttime < %l u AND disconnecttime <> 0" , expire_time
);
433 dbquery ( "DELETE FROM chanserv.chanlevhistory WHERE authtime < %l u" , expire_time
);
434 dbquery ( "DELETE FROM chanserv.accounthistory WHERE authtime < %l u" , expire_time
);
437 void csdb_deletemaillock ( maillock
* mlp
) {
438 dbquery ( "DELETE FROM chanserv.maillocks WHERE ID= %u " , mlp
-> id
);
441 void csdb_createmaillock ( maillock
* mlp
) {
442 char escpattern
[ 1024 ], escreason
[ 1024 ];
444 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
447 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
451 dbquery ( "INSERT INTO chanserv.maillocks (id, pattern, reason, createdby, created) VALUES( %u , ' %s ', ' %s ', %u , %j d)" ,
452 mlp
-> id
, escpattern
, escreason
, mlp
-> createdby
,( intmax_t ) mlp
-> created
);
455 void csdb_updatemaillock ( maillock
* mlp
) {
456 char escpattern
[ 1024 ], escreason
[ 1024 ];
458 dbescapestring ( escpattern
, mlp
-> pattern
-> content
, mlp
-> pattern
-> length
);
461 dbescapestring ( escreason
, mlp
-> reason
-> content
, mlp
-> reason
-> length
);
465 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
);