Fix db key issue for bans - run node update.js 2013-08-21-banfix
This commit is contained in:
parent
d5ebf1ad4e
commit
6d47a94fe9
11
database.js
11
database.js
|
@ -366,7 +366,7 @@ Database.prototype.registerChannel = function (name, owner, callback) {
|
||||||
"`ip` VARCHAR(15) NOT NULL,",
|
"`ip` VARCHAR(15) NOT NULL,",
|
||||||
"`name` VARCHAR(32) NOT NULL,",
|
"`name` VARCHAR(32) NOT NULL,",
|
||||||
"`banner` VARCHAR(32) NOT NULL,",
|
"`banner` VARCHAR(32) NOT NULL,",
|
||||||
"PRIMARY KEY (`ip`))",
|
"PRIMARY KEY (`ip`, `name`))",
|
||||||
"ENGINE = MyISAM ",
|
"ENGINE = MyISAM ",
|
||||||
"CHARACTER SET utf8;"].join("");
|
"CHARACTER SET utf8;"].join("");
|
||||||
|
|
||||||
|
@ -570,10 +570,10 @@ Database.prototype.addToLibrary = function (channame, media, callback) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// use INSERT IGNORE to prevent errors from adding duplicates
|
var query = "INSERT INTO `chan_" + channame + "_library` " +
|
||||||
var query = "INSERT IGNORE INTO `chan_" + channame + "_library` " +
|
|
||||||
"(id, title, seconds, type) " +
|
"(id, title, seconds, type) " +
|
||||||
"VALUES (?, ?, ?, ?)";
|
"VALUES (?, ?, ?, ?) " +
|
||||||
|
"ON DUPLICATE KEY UPDATE id=id";
|
||||||
var params = [
|
var params = [
|
||||||
media.id,
|
media.id,
|
||||||
media.title,
|
media.title,
|
||||||
|
@ -648,7 +648,8 @@ Database.prototype.addChannelBan = function (channame, ip, name, banBy,
|
||||||
}
|
}
|
||||||
|
|
||||||
var query = "INSERT INTO `chan_" + channame + "_bans`" +
|
var query = "INSERT INTO `chan_" + channame + "_bans`" +
|
||||||
"(ip, name, banner) VALUES (?, ?, ?)";
|
"(ip, name, banner) VALUES (?, ?, ?) " +
|
||||||
|
"ON DUPLICATE KEY UPDATE ip=ip";
|
||||||
|
|
||||||
self.query(query, [ip, name, banBy], callback);
|
self.query(query, [ip, name, banBy], callback);
|
||||||
};
|
};
|
||||||
|
|
70
update.js
70
update.js
|
@ -2,7 +2,8 @@ var Config = require("./config.js");
|
||||||
var Database = require("./database.js");
|
var Database = require("./database.js");
|
||||||
|
|
||||||
var updates = {
|
var updates = {
|
||||||
"2013-08-20-utf8fix": fixDBUnicode
|
"2013-08-20-utf8fix": fixDBUnicode,
|
||||||
|
"2013-08-21-banfix": fixChannelBanKey
|
||||||
};
|
};
|
||||||
|
|
||||||
var x = {};
|
var x = {};
|
||||||
|
@ -23,6 +24,25 @@ Config.load(x, "cfg.json", function () {
|
||||||
fn(db);
|
fn(db);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
2013-08-20
|
||||||
|
|
||||||
|
This function iterates over tables in the database and converts the
|
||||||
|
encoding on each to UTF-8.
|
||||||
|
|
||||||
|
Furthermore, it does the following to convert channel libraries in
|
||||||
|
a way such that UTF-8 titles stored in other encodings (e.g. latin1)
|
||||||
|
are preserved as UTF-8:
|
||||||
|
1. Change the `title` column to BLOB (unencoded)
|
||||||
|
2. Change the table character set to utf8
|
||||||
|
3. Change the `title` column to VARCHAR(255) CHARACTER SET utf8
|
||||||
|
|
||||||
|
This corrects an encoding issue that was exposed when switching to
|
||||||
|
node-mysql. mysql-libmysqlclient ignored database encoding and assumed
|
||||||
|
the data was UTF-8.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
function fixDBUnicode(db) {
|
function fixDBUnicode(db) {
|
||||||
db.query("SHOW TABLES", function (err, res) {
|
db.query("SHOW TABLES", function (err, res) {
|
||||||
if(err) {
|
if(err) {
|
||||||
|
@ -110,3 +130,51 @@ function fixDBUnicode(db) {
|
||||||
}, 1000);
|
}, 1000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
2013-08-21
|
||||||
|
|
||||||
|
This function iterates over channel ban tables and corrects the
|
||||||
|
PRIMARY KEY. Previously, the table was defined with PRIMARY KEY (ip),
|
||||||
|
but in reality, (ip, name) should be pairwise unique.
|
||||||
|
|
||||||
|
This corrects the issue where only one name ban can exist in the table
|
||||||
|
because of the `ip` field "*" being unique.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fixChannelBanKey(db) {
|
||||||
|
db.query("SHOW TABLES", function (err, res) {
|
||||||
|
if(err) {
|
||||||
|
console.log("SEVERE: SHOW TABLES failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var count = res.length;
|
||||||
|
res.forEach(function (r) {
|
||||||
|
var k = Object.keys(r)[0];
|
||||||
|
|
||||||
|
if(!r[k].match(/^chan_[\w-_]{1,30}_bans$/)) {
|
||||||
|
count--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
db.query("ALTER TABLE `" + r[k] + "` DROP PRIMARY KEY, ADD PRIMARY KEY (ip, name)", function (err, res) {
|
||||||
|
count--;
|
||||||
|
if(err) {
|
||||||
|
console.log("FAILED: " + r[k]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Fixed " + r[k]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
setInterval(function () {
|
||||||
|
if(count == 0) {
|
||||||
|
console.log("Done");
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue