1 #include "../dbapi2/dbapi2.h"
2 #include "../core/error.h"
5 extern DBAPIConn
*trustsdb
;
6 static trustmigration
*migration
;
8 static void tm_group(void *, unsigned int, char *, unsigned int, unsigned int, unsigned int, unsigned int, time_t, time_t, time_t, char *, char *, char *);
9 static void tm_host(void *, unsigned int, char *, unsigned int, time_t);
10 static void tm_final(void *, int);
12 trustmigration
*migration_start(TrustMigrationGroup
, TrustMigrationHost
, TrustMigrationFini
, void *);
13 void migration_stop(trustmigration
*);
14 void createtrusttables(int migration
);
19 TrustDBMigrationCallback callback
;
22 int trusts_migration_start(TrustDBMigrationCallback callback
, void *tag
) {
23 struct callbackdata
*cbd
;
28 cbd
= malloc(sizeof(struct callbackdata
));
32 cbd
->callback
= callback
;
37 trustsdb
->squery(trustsdb
, "DELETE FROM ?", "T", "migration_groups");
38 trustsdb
->squery(trustsdb
, "DELETE FROM ?", "T", "migration_hosts");
40 migration
= migration_start(tm_group
, tm_host
, tm_final
, cbd
);
49 void trusts_migration_stop(void) {
53 migration_stop(migration
);
56 static void tm_group(void *tag
, unsigned int id
, char *name
, unsigned int trustedfor
, unsigned int mode
, unsigned int maxperident
, unsigned int maxusage
, time_t expires
, time_t lastseen
, time_t lastmaxuserreset
, char *createdby
, char *contact
, char *comment
) {
58 Error("trusts", ERR_INFO
, "Migration currently at id: %d", id
);
60 trustsdb
->squery(trustsdb
,
61 "INSERT INTO ? (id, name, trustedfor, mode, maxperident, maxusage, expires, lastseen, lastmaxuserreset, createdby, contact, comment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
62 "Tusuuuutttsss", "migration_groups", id
, name
, trustedfor
, mode
, maxperident
, maxusage
, expires
, lastseen
, lastmaxuserreset
, createdby
, contact
, comment
66 static void tm_host(void *tag
, unsigned int id
, char *host
, unsigned int maxusage
, time_t lastseen
) {
67 struct callbackdata
*cbd
= tag
;
69 trustsdb
->squery(trustsdb
,
70 "INSERT INTO ? (id, groupid, host, maxusage, lastseen) VALUES (?, ?, ?, ?, ?)",
71 "Tuusut", "migration_hosts", cbd
->hostid
++, id
, host
, maxusage
, lastseen
75 static void tm_complete(const DBAPIResult
*r
, void *tag
) {
76 struct callbackdata
*cbd
= tag
;
80 errcode
= MIGRATION_STOPPED
;
83 Error("trusts", ERR_ERROR
, "A error occured executing the rename table query.");
86 Error("trusts", ERR_INFO
, "Migration table copying complete.");
92 cbd
->callback(errcode
, cbd
->tag
);
97 static void tm_final(void *tag
, int errcode
) {
98 struct callbackdata
*cbd
= tag
;
102 Error("trusts", ERR_ERROR
, "Migration error: %d", errcode
);
104 cbd
->callback(errcode
, cbd
->tag
);
108 Error("trusts", ERR_INFO
, "Migration completed, copying tables...");
110 trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
111 "BEGIN TRANSACTION; DROP TABLE ?; ALTER TABLE ? RENAME TO ?; DROP TABLE ?; ALTER TABLE ? RENAME TO ?; COMMIT;",
112 "TTsTTs", "groups", "migration_groups", "groups", "hosts", "migration_hosts", "hosts");
115 trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
116 "BEGIN TRANSACTION; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; COMMIT;",
117 "TTTTTT", "groups", "groups", "migration_groups", "hosts", "hosts", "migration_hosts");
120 trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
121 "DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?;",
122 "TTTTTT", "groups", "groups", "migration_groups", "hosts", "hosts", "migration_hosts");
124 trustsdb
->squery(trustsdb
, "BEGIN TRANSACTION", "");
125 trustsdb
->squery(trustsdb
, "DROP TABLE ?", "T", "groups");
126 trustsdb
->squery(trustsdb
, "ALTER TABLE ? RENAME TO ?", "Ts", "migration_groups", "groups");
127 trustsdb
->squery(trustsdb
, "DROP TABLE ?", "T", "hosts");
128 trustsdb
->squery(trustsdb
, "ALTER TABLE ? RENAME TO ?", "Ts", "migration_hosts", "hosts");
129 trustsdb
->query(trustsdb
, tm_complete
, cbd
, "COMMIT", "");