]>
jfr.im git - irc/quakenet/newserv.git/blob - trusts/db.c
1 #include "../dbapi2/dbapi2.h"
2 #include "../core/error.h"
3 #include "../core/hooks.h"
4 #include "../core/schedule.h"
8 static int tgmaxid
, thmaxid
;
10 static void *flushschedule
;
14 void createtrusttables(int migration
);
15 void trusts_flush(void);
16 void trusts_freeall(void);
18 void createtrusttables(int migration
) {
22 groups
= "migration_groups";
23 hosts
= "migration_hosts";
29 trustsdb
->createtable(trustsdb
, NULL
, NULL
,
30 "CREATE TABLE ? (id INT PRIMARY KEY, name VARCHAR(?), trustedfor INT, mode INT, maxperident INT, maxusage INT, expires INT, lastseen INT, lastmaxuserreset INT, createdby VARCHAR(?), contact VARCHAR(?), comment VARCHAR(?))",
31 "Tdddd", groups
, TRUSTNAMELEN
, NICKLEN
, CONTACTLEN
, COMMENTLEN
34 /* I'd like multiple keys here but that's not gonna happen on a cross-database platform :( */
35 trustsdb
->createtable(trustsdb
, NULL
, NULL
, "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, host VARCHAR(?), maxusage INT, lastseen INT)", "Td", hosts
, TRUSTHOSTLEN
);
38 static void flushdatabase(void *arg
) {
42 static void triggerdbloaded(void *arg
) {
43 triggerhook(HOOK_TRUSTS_DB_LOADED
, NULL
);
46 static void loadcomplete(void) {
47 /* error has already been shown */
52 flushschedule
= schedulerecurring(time(NULL
) + 300, 0, 300, flushdatabase
, NULL
);
54 scheduleoneshot(time(NULL
), triggerdbloaded
, NULL
);
57 static void loadhosts_data(const DBAPIResult
*result
, void *tag
) {
63 if(!result
->success
) {
64 Error("trusts", ERR_ERROR
, "Error loading hosts table.");
67 result
->clear(result
);
71 if(result
->fields
!= 5) {
72 Error("trusts", ERR_ERROR
, "Wrong number of fields in hosts table.");
75 result
->clear(result
);
79 while(result
->next(result
)) {
80 unsigned int groupid
, id
;
82 unsigned int maxusage
, lastseen
;
85 id
= strtoul(result
->get(result
, 0), NULL
, 10);
89 groupid
= strtoul(result
->get(result
, 1), NULL
, 10);
91 tg
= tg_getbyid(groupid
);
93 Error("trusts", ERR_WARNING
, "Orphaned trust group host: %d", groupid
);
97 /* NOTE: 2 is at the bottom */
98 maxusage
= strtoul(result
->get(result
, 3), NULL
, 10);
99 lastseen
= (time_t)strtoul(result
->get(result
, 4), NULL
, 10);
100 host
= result
->get(result
, 2);
102 if(!th_add(tg
, id
, host
, maxusage
, lastseen
))
103 Error("trusts", ERR_WARNING
, "Error adding host to trust %d: %s", groupid
, host
);
106 result
->clear(result
);
111 static void loadhosts_fini(const DBAPIResult
*result
, void *tag
) {
112 Error("trusts", ERR_INFO
, "Finished loading hosts, maximum id: %d", thmaxid
);
115 static void loadgroups_data(const DBAPIResult
*result
, void *tag
) {
121 if(!result
->success
) {
122 Error("trusts", ERR_ERROR
, "Error loading group table.");
125 result
->clear(result
);
129 if(result
->fields
!= 12) {
130 Error("trusts", ERR_ERROR
, "Wrong number of fields in groups table.");
133 result
->clear(result
);
137 while(result
->next(result
)) {
139 sstring
*name
, *createdby
, *contact
, *comment
;
140 unsigned int trustedfor
, mode
, maxperident
, maxusage
;
141 time_t expires
, lastseen
, lastmaxuserreset
;
143 id
= strtoul(result
->get(result
, 0), NULL
, 10);
147 name
= getsstring(result
->get(result
, 1), TRUSTNAMELEN
);
148 trustedfor
= strtoul(result
->get(result
, 2), NULL
, 10);
149 mode
= atoi(result
->get(result
, 3));
150 maxperident
= strtoul(result
->get(result
, 4), NULL
, 10);
151 maxusage
= strtoul(result
->get(result
, 5), NULL
, 10);
152 expires
= (time_t)strtoul(result
->get(result
, 6), NULL
, 10);
153 lastseen
= (time_t)strtoul(result
->get(result
, 7), NULL
, 10);
154 lastmaxuserreset
= (time_t)strtoul(result
->get(result
, 8), NULL
, 10);
155 createdby
= getsstring(result
->get(result
, 9), NICKLEN
);
156 contact
= getsstring(result
->get(result
, 10), CONTACTLEN
);
157 comment
= getsstring(result
->get(result
, 11), COMMENTLEN
);
159 if(name
&& createdby
&& contact
&& comment
) {
160 if(!tg_add(id
, name
->content
, trustedfor
, mode
, maxperident
, maxusage
, expires
, lastseen
, lastmaxuserreset
, createdby
->content
, contact
->content
, comment
->content
))
161 Error("trusts", ERR_WARNING
, "Error adding trustgroup %d: %s", id
, name
->content
);
163 Error("trusts", ERR_ERROR
, "Error allocating sstring in group loader, id: %d", id
);
167 freesstring(createdby
);
168 freesstring(contact
);
169 freesstring(comment
);
172 result
->clear(result
);
175 static void loadgroups_fini(const DBAPIResult
*result
, void *tag
) {
176 Error("trusts", ERR_INFO
, "Finished loading groups, maximum id: %d.", tgmaxid
);
179 int trusts_loaddb(void) {
181 trustsdb
= dbapi2open(NULL
, "trusts");
183 Error("trusts", ERR_WARNING
, "Unable to connect to db -- not loaded.");
188 createtrusttables(0);
192 trustsdb
->loadtable(trustsdb
, NULL
, loadgroups_data
, loadgroups_fini
, NULL
, "groups");
193 trustsdb
->loadtable(trustsdb
, NULL
, loadhosts_data
, loadhosts_fini
, NULL
, "hosts");
198 void trusts_closedb(int closeconnection
) {
203 deleteschedule(flushschedule
, flushdatabase
, NULL
);
204 flushschedule
= NULL
;
212 thmaxid
= tgmaxid
= 0;
214 if(closeconnection
) {
215 trustsdb
->close(trustsdb
);
219 triggerhook(HOOK_TRUSTS_DB_CLOSED
, NULL
);
222 void th_dbupdatecounts(trusthost
*th
) {
223 trustsdb
->squery(trustsdb
, "UPDATE ? SET lastseen = ?, maxusage = ? WHERE id = ?", "Ttuu", "hosts", th
->lastseen
, th
->maxusage
, th
->id
);
226 void tg_dbupdatecounts(trustgroup
*tg
) {
227 trustsdb
->squery(trustsdb
, "UPDATE ? SET lastseen = ?, maxusage = ? WHERE id = ?", "Ttuu", "groups", tg
->lastseen
, tg
->maxusage
, tg
->id
);