Refactor database tables init; make 2.x import script
This commit is contained in:
parent
0a480515d7
commit
87b40b679a
5 changed files with 653 additions and 149 deletions
|
|
@ -4,6 +4,7 @@ var $util = require("./utilities");
|
|||
var Logger = require("./logger");
|
||||
var Config = require("./config");
|
||||
var Server = require("./server");
|
||||
var tables = require("./database/tables");
|
||||
|
||||
var pool = null;
|
||||
var global_ipbans = {};
|
||||
|
|
@ -23,7 +24,13 @@ module.exports.init = function () {
|
|||
Logger.errlog.log("! DB connection failed");
|
||||
return;
|
||||
} else {
|
||||
module.exports.initGlobalTables();
|
||||
tables.init(module.exports.query, function (err) {
|
||||
if (err) {
|
||||
return;
|
||||
}
|
||||
require("./database/update").checkVersion();
|
||||
module.exports.loadAnnouncement();
|
||||
});
|
||||
// Refresh global IP bans
|
||||
module.exports.listGlobalBans();
|
||||
}
|
||||
|
|
@ -31,9 +38,7 @@ module.exports.init = function () {
|
|||
|
||||
global_ipbans = {};
|
||||
module.exports.users = require("./database/accounts");
|
||||
module.exports.users.init();
|
||||
module.exports.channels = require("./database/channels");
|
||||
module.exports.channels.init();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -85,75 +90,6 @@ function blackHole() {
|
|||
|
||||
}
|
||||
|
||||
module.exports.initGlobalTables = function () {
|
||||
var fail = function (table) {
|
||||
return function (err) {
|
||||
if (err) {
|
||||
Logger.errlog.log("Failed to initialize " + table);
|
||||
}
|
||||
};
|
||||
};
|
||||
var query = module.exports.query;
|
||||
query("CREATE TABLE IF NOT EXISTS `global_bans` (" +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`reason` VARCHAR(255) NOT NULL," +
|
||||
"PRIMARY KEY (`ip`)) " +
|
||||
"CHARACTER SET utf8",
|
||||
fail("global_bans"));
|
||||
|
||||
query("CREATE TABLE IF NOT EXISTS `password_reset` (" +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`hash` VARCHAR(64) NOT NULL," +
|
||||
"`email` VARCHAR(255) NOT NULL," +
|
||||
"`expire` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`name`))" +
|
||||
"CHARACTER SET utf8",
|
||||
fail("password_reset"));
|
||||
|
||||
query("CREATE TABLE IF NOT EXISTS `user_playlists` (" +
|
||||
"`user` VARCHAR(20) NOT NULL," +
|
||||
"`name` VARCHAR(255) NOT NULL," +
|
||||
"`contents` MEDIUMTEXT NOT NULL," +
|
||||
"`count` INT NOT NULL," +
|
||||
"`duration` INT NOT NULL," +
|
||||
"PRIMARY KEY (`user`, `name`))" +
|
||||
"CHARACTER SET utf8",
|
||||
fail("user_playlists"));
|
||||
|
||||
query("CREATE TABLE IF NOT EXISTS `aliases` (" +
|
||||
"`visit_id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`visit_id`), INDEX (`ip`))",
|
||||
fail("aliases"));
|
||||
|
||||
query("CREATE TABLE IF NOT EXISTS `stats` (" +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"`usercount` INT NOT NULL," +
|
||||
"`chancount` INT NOT NULL," +
|
||||
"`mem` INT NOT NULL," +
|
||||
"PRIMARY KEY (`time`))" +
|
||||
"CHARACTER SET utf8",
|
||||
fail("stats"));
|
||||
|
||||
query("CREATE TABLE IF NOT EXISTS `meta` (" +
|
||||
"`key` VARCHAR(255) NOT NULL," +
|
||||
"`value` TEXT NOT NULL," +
|
||||
"PRIMARY KEY (`key`))" +
|
||||
"CHARACTER SET utf8",
|
||||
function (err, res) {
|
||||
if (err) {
|
||||
fail("meta")(err);
|
||||
return;
|
||||
}
|
||||
|
||||
require("./database/update").checkVersion();
|
||||
module.exports.loadAnnouncement();
|
||||
});
|
||||
};
|
||||
|
||||
/* REGION global bans */
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -7,21 +7,7 @@ var registrationLock = {};
|
|||
var blackHole = function () { };
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Initialize the accounts table
|
||||
*/
|
||||
init: function () {
|
||||
db.query("CREATE TABLE IF NOT EXISTS `users` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`password` VARCHAR(64) NOT NULL," +
|
||||
"`global_rank` INT NOT NULL," +
|
||||
"`email` VARCHAR(255) NOT NULL," +
|
||||
"`profile` TEXT NOT NULL," +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`time` BIGINT NOT NULL, " +
|
||||
"PRIMARY KEY(`id`), INDEX(`name`)) " +
|
||||
"CHARACTER SET utf8");
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ var valid = require("../utilities").isValidChannelName;
|
|||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
var Logger = require("../logger");
|
||||
var tables = require("./tables");
|
||||
|
||||
var blackHole = function () { };
|
||||
|
||||
|
|
@ -10,47 +11,13 @@ function dropTable(name, callback) {
|
|||
db.query("DROP TABLE `" + name + "`", callback);
|
||||
}
|
||||
|
||||
function createRanksTable(name, callback) {
|
||||
db.query("CREATE TABLE `chan_" + name + "_ranks` (" +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`rank` INT NOT NULL," +
|
||||
"PRIMARY KEY (`name`)) " +
|
||||
"CHARACTER SET utf8", callback);
|
||||
}
|
||||
|
||||
function createLibraryTable(name, callback) {
|
||||
db.query("CREATE TABLE `chan_" + name + "_library` (" +
|
||||
"`id` VARCHAR(255) NOT NULL," +
|
||||
"`title` VARCHAR(255) NOT NULL," +
|
||||
"`seconds` INT NOT NULL," +
|
||||
"`type` VARCHAR(2) NOT NULL," +
|
||||
"PRIMARY KEY (`id`))" +
|
||||
"CHARACTER SET utf8", callback);
|
||||
}
|
||||
|
||||
function createBansTable(name, callback) {
|
||||
db.query("CREATE TABLE `chan_" + name + "_bans` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`bannedby` VARCHAR(20) NOT NULL," +
|
||||
"`reason` VARCHAR(255) NOT NULL," +
|
||||
"PRIMARY KEY (`id`), UNIQUE (`name`, `ip`))" +
|
||||
"CHARACTER SET utf8", callback);
|
||||
}
|
||||
|
||||
function initTables(name, owner, callback) {
|
||||
if (!valid(name)) {
|
||||
callback("Invalid channel name", null);
|
||||
return;
|
||||
}
|
||||
|
||||
createRanksTable(name, function (err) {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
tables.createChannelTables(name, db.query.bind(db), function (err) {
|
||||
db.users.getGlobalRank(owner, function (err, rank) {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
|
|
@ -62,45 +29,20 @@ function initTables(name, owner, callback) {
|
|||
module.exports.setRank(name, owner, rank, function (err) {
|
||||
if (err) {
|
||||
dropTable("chan_" + name + "_ranks");
|
||||
dropTable("chan_" + name + "_ranks");
|
||||
dropTable("chan_" + name + "_library");
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
createLibraryTable(name, function (err) {
|
||||
if (err) {
|
||||
dropTable("chan_" + name + "_ranks");
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
createBansTable(name, function (err) {
|
||||
if (err) {
|
||||
dropTable("chan_" + name + "_ranks");
|
||||
dropTable("chan_" + name + "_library");
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(null, true);
|
||||
});
|
||||
});
|
||||
callback(null, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Initialize the channels table
|
||||
*/
|
||||
init: function () {
|
||||
db.query("CREATE TABLE IF NOT EXISTS `channels` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`name` VARCHAR(30) NOT NULL," +
|
||||
"`owner` VARCHAR(20) NOT NULL," +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`id`), INDEX(`name`), INDEX(`owner`))" +
|
||||
"CHARACTER SET utf8");
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
|||
147
lib/database/tables.js
Normal file
147
lib/database/tables.js
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
const TBL_USERS = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `users` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`password` VARCHAR(64) NOT NULL," +
|
||||
"`global_rank` INT NOT NULL," +
|
||||
"`email` VARCHAR(255) NOT NULL," +
|
||||
"`profile` TEXT NOT NULL," +
|
||||
"`ip` VARCHAR(39) NOT NULL," + "`time` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY(`id`)," +
|
||||
"UNIQUE(`name`)) " +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_CHANNELS = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `channels` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`name` VARCHAR(30) NOT NULL," +
|
||||
"`owner` VARCHAR(20) NOT NULL," +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`id`), UNIQUE(`name`), INDEX(`owner`))" +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_GLOBAL_BANS = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `global_bans` (" +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`reason` VARCHAR(255) NOT NULL," +
|
||||
"PRIMARY KEY (`ip`)) " +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_PASSWORD_RESET = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `password_reset` (" +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`hash` VARCHAR(64) NOT NULL," +
|
||||
"`email` VARCHAR(255) NOT NULL," +
|
||||
"`expire` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`name`))" +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_USER_PLAYLISTS = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `user_playlists` (" +
|
||||
"`user` VARCHAR(20) NOT NULL," +
|
||||
"`name` VARCHAR(255) NOT NULL," +
|
||||
"`contents` MEDIUMTEXT NOT NULL," +
|
||||
"`count` INT NOT NULL," +
|
||||
"`duration` INT NOT NULL," +
|
||||
"PRIMARY KEY (`user`, `name`))" +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_ALIASES = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `aliases` (" +
|
||||
"`visit_id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"PRIMARY KEY (`visit_id`), INDEX (`ip`)" +
|
||||
")";
|
||||
|
||||
const TBL_STATS = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `stats` (" +
|
||||
"`time` BIGINT NOT NULL," +
|
||||
"`usercount` INT NOT NULL," +
|
||||
"`chancount` INT NOT NULL," +
|
||||
"`mem` INT NOT NULL," +
|
||||
"PRIMARY KEY (`time`))" +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
const TBL_META = "" +
|
||||
"CREATE TABLE IF NOT EXISTS `meta` (" +
|
||||
"`key` VARCHAR(255) NOT NULL," +
|
||||
"`value` TEXT NOT NULL," +
|
||||
"PRIMARY KEY (`key`))" +
|
||||
"CHARACTER SET utf8";
|
||||
|
||||
module.exports.init = function (queryfn, cb) {
|
||||
var tables = {
|
||||
users: TBL_USERS,
|
||||
channels: TBL_CHANNELS,
|
||||
global_bans: TBL_GLOBAL_BANS,
|
||||
password_reset: TBL_PASSWORD_RESET,
|
||||
user_playlists: TBL_USER_PLAYLISTS,
|
||||
aliases: TBL_ALIASES,
|
||||
stats: TBL_STATS,
|
||||
meta: TBL_META
|
||||
};
|
||||
|
||||
var AsyncQueue = require("../asyncqueue");
|
||||
var aq = new AsyncQueue();
|
||||
var hasError = false;
|
||||
Object.keys(tables).forEach(function (tbl) {
|
||||
aq.queue(function (lock) {
|
||||
queryfn(tables[tbl], function (err) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
hasError = true;
|
||||
}
|
||||
lock.release();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
aq.queue(function (lock) {
|
||||
lock.release();
|
||||
cb(hasError);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports.createChannelTables = function (name, queryfn, cb) {
|
||||
var createRanksTable = function () {
|
||||
queryfn("CREATE TABLE `chan_" + name + "_ranks` (" +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`rank` INT NOT NULL," +
|
||||
"PRIMARY KEY (`name`)) " +
|
||||
"CHARACTER SET utf8", createLibraryTable);
|
||||
};
|
||||
|
||||
var createLibraryTable = function (err) {
|
||||
if (err) {
|
||||
cb(err);
|
||||
return;
|
||||
}
|
||||
queryfn("CREATE TABLE `chan_" + name + "_library` (" +
|
||||
"`id` VARCHAR(255) NOT NULL," +
|
||||
"`title` VARCHAR(255) NOT NULL," +
|
||||
"`seconds` INT NOT NULL," +
|
||||
"`type` VARCHAR(2) NOT NULL," +
|
||||
"PRIMARY KEY (`id`))" +
|
||||
"CHARACTER SET utf8", createBansTable);
|
||||
};
|
||||
|
||||
var createBansTable = function (err) {
|
||||
if (err) {
|
||||
cb(err);
|
||||
return;
|
||||
}
|
||||
queryfn("CREATE TABLE `chan_" + name + "_bans` (" +
|
||||
"`id` INT NOT NULL AUTO_INCREMENT," +
|
||||
"`ip` VARCHAR(39) NOT NULL," +
|
||||
"`name` VARCHAR(20) NOT NULL," +
|
||||
"`bannedby` VARCHAR(20) NOT NULL," +
|
||||
"`reason` VARCHAR(255) NOT NULL," +
|
||||
"PRIMARY KEY (`id`), UNIQUE (`name`, `ip`))" +
|
||||
"CHARACTER SET utf8", cb);
|
||||
};
|
||||
|
||||
createRanksTable();
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue