trustmigration *migration_start(TrustMigrationGroup, TrustMigrationHost, TrustMigrationFini, void *);
void migration_stop(trustmigration *);
+void createtrusttables(int migration);
struct callbackdata {
void *tag;
struct callbackdata *cbd;
if(migration)
- return 0;
+ return 1;
if(callback) {
cbd = malloc(sizeof(struct callbackdata));
if(!cbd)
- return 0;
+ return 2;
cbd->callback = callback;
cbd->tag = tag;
cbd = NULL;
}
- trustsdb->squery(trustsdb, "DELETE FROM ?", "T", "groups");
- trustsdb->squery(trustsdb, "DELETE FROM ?", "T", "hosts");
+ createtrusttables(1);
+ trustsdb->squery(trustsdb, "DELETE FROM ?", "T", "migration_groups");
+ trustsdb->squery(trustsdb, "DELETE FROM ?", "T", "migration_hosts");
migration = migration_start(tm_group, tm_host, tm_final, cbd);
if(!migration) {
free(cbd);
- return 0;
+ return 3;
}
- return 1;
+ return 0;
}
void trusts_migration_stop(void) {
trustsdb->squery(trustsdb,
"INSERT INTO ? (id, name, trustedfor, mode, maxperident, maxseen, expires, lastseen, lastmaxuserreset, createdby, contact, comment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
- "Tusuuuutttsss", "groups", id, name, trustedfor, mode, maxperident, maxseen, expires, lastseen, lastmaxuserreset, createdby, contact, comment
+ "Tusuuuutttsss", "migration_groups", id, name, trustedfor, mode, maxperident, maxseen, expires, lastseen, lastmaxuserreset, createdby, contact, comment
);
}
static void tm_host(void *tag, unsigned int id, char *host, unsigned int max, time_t lastseen) {
trustsdb->squery(trustsdb,
"INSERT INTO ? (groupid, host, max, lastseen) VALUES (?, ?, ?, ?)",
- "Tusut", "hosts", id, host, max, lastseen
+ "Tusut", "migration_hosts", id, host, max, lastseen
);
}
-static void tm_final(void *tag, int errcode) {
+static void tm_complete(const DBAPIResult *r, void *tag) {
struct callbackdata *cbd = tag;
- migration = NULL;
+ int errcode = 0;
- if(errcode) {
- Error("trusts", ERR_ERROR, "Migration error: %d", errcode);
+ if(!r) {
+ errcode = MIGRATION_STOPPED;
} else {
- Error("trusts", ERR_INFO, "Migration completed.");
+ if(!r->success) {
+ Error("trusts", ERR_ERROR, "A error occured executing the rename table query.");
+ errcode = 100;
+ } else {
+ Error("trusts", ERR_INFO, "Migration table copying complete.");
+ }
+ r->clear(r);
}
if(cbd) {
- cbd->callback(errcode, tag);
+ cbd->callback(errcode, cbd->tag);
free(cbd);
}
}
+
+static void tm_final(void *tag, int errcode) {
+ struct callbackdata *cbd = tag;
+ migration = NULL;
+
+ if(errcode) {
+ Error("trusts", ERR_ERROR, "Migration error: %d", errcode);
+ if(cbd) {
+ cbd->callback(errcode, cbd->tag);
+ free(cbd);
+ }
+ } else {
+ Error("trusts", ERR_INFO, "Migration completed, copying tables...");
+/*
+ trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
+ "BEGIN TRANSACTION; DROP TABLE ?; ALTER TABLE ? RENAME TO ?; DROP TABLE ?; ALTER TABLE ? RENAME TO ?; COMMIT;",
+ "TTsTTs", "groups", "migration_groups", "groups", "hosts", "migration_hosts", "hosts");
+*/
+/*
+ trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
+ "BEGIN TRANSACTION; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; COMMIT;",
+ "TTTTTT", "groups", "groups", "migration_groups", "hosts", "hosts", "migration_hosts");
+*/
+/*
+ trustsdb->query(trustsdb, cbd?tm_complete:NULL, cbd,
+ "DELETE FROM ?; INSERT INTO ? SELECT * FROM ?; DELETE FROM ?; INSERT INTO ? SELECT * FROM ?;",
+ "TTTTTT", "groups", "groups", "migration_groups", "hosts", "hosts", "migration_hosts");
+*/
+ trustsdb->squery(trustsdb, "BEGIN TRANSACTION", "");
+ trustsdb->squery(trustsdb, "DROP TABLE ?", "T", "groups");
+ trustsdb->squery(trustsdb, "ALTER TABLE ? RENAME TO ?", "Ts", "migration_groups", "groups");
+ trustsdb->squery(trustsdb, "DROP TABLE ?", "T", "hosts");
+ trustsdb->squery(trustsdb, "ALTER TABLE ? RENAME TO ?", "Ts", "migration_hosts", "hosts");
+ trustsdb->query(trustsdb, tm_complete, cbd, "COMMIT", "");
+ }
+}