summaryrefslogtreecommitdiff
path: root/server/frob/sql.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/frob/sql.ts')
-rw-r--r--server/frob/sql.ts182
1 files changed, 182 insertions, 0 deletions
diff --git a/server/frob/sql.ts b/server/frob/sql.ts
new file mode 100644
index 0000000..60c4bbe
--- /dev/null
+++ b/server/frob/sql.ts
@@ -0,0 +1,182 @@
+import { Client } from "https://deno.land/x/mysql/mod.ts";
+
+class SQLHandler {
+ private client;
+ private hostname;
+ private username;
+ private password;
+ private backslash;
+
+ constructor (hostname: string = "127.0.0.1", username: string = "evol", password: string = "evol") {
+ this.client = new Client();
+ [this.hostname, this.username, this.password] = [hostname, username, password];
+
+ // escape regexes
+ this.backslash = /\\/g;
+ }
+
+ async init () {
+ await this.client.connect({
+ hostname: this.hostname,
+ username: this.username,
+ password: this.password,
+ });
+
+ // INSTALL SONAME 'ha_rocksdb';
+
+ console.log("Initializing database...");
+ await this.do("CREATE DATABASE IF NOT EXISTS legacy");
+ await this.do("USE legacy");
+
+ console.log("Initializing tables...");
+ await this.do("DROP TABLE IF EXISTS `login`");
+ await this.do("DROP TABLE IF EXISTS `char`");
+ await this.do("DROP TABLE IF EXISTS `inventory`");
+ await this.do("DROP TABLE IF EXISTS `storage`");
+ await this.do("DROP TABLE IF EXISTS `global_acc_reg`");
+ await this.do("DROP TABLE IF EXISTS `acc_reg`");
+ await this.do("DROP TABLE IF EXISTS `char_reg`");
+ await this.do("DROP TABLE IF EXISTS `party`");
+ await this.do(`
+ CREATE TABLE \`login\` (
+ account_id INT(11) UNSIGNED NOT NULL,
+ revolt_id INT(11) UNSIGNED NULL, -- id of the new account on revolt
+ userid VARCHAR(23) NOT NULL DEFAULT '',
+ user_pass VARCHAR(32) NOT NULL DEFAULT '',
+ lastlogin DATETIME NULL,
+ -- sex,
+ logincount INT(9) UNSIGNED NOT NULL DEFAULT '0',
+ state INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ email VARCHAR(39) NULL,
+ -- error_message,
+ -- connect_until_time,
+ last_ip INT(4) UNSIGNED NOT NULL DEFAULT 0,
+ -- memo,
+ unban_time INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (account_id),
+ UNIQUE KEY revolt (revolt_id),
+ KEY userid (userid)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`char\` (
+ char_id INT(11) UNSIGNED NOT NULL,
+ revolt_id INT(11) UNSIGNED NULL, -- id of the new char on revolt
+ account_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ char_num TINYINT(1) NOT NULL DEFAULT '0',
+ \`name\` VARCHAR(30) NOT NULL DEFAULT '',
+ class SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
+ base_level SMALLINT(6) UNSIGNED NOT NULL DEFAULT '1',
+ job_level SMALLINT(6) UNSIGNED NOT NULL DEFAULT '1',
+ base_exp BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
+ job_exp BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
+ zeny INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ \`str\` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ agi SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ vit SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ \`int\` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ dex SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ luk SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ status_point INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ skill_point INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ party_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ party_isleader BIT(1) NOT NULL DEFAULT 0,
+ hair TINYINT(4) UNSIGNED NOT NULL DEFAULT '0',
+ hair_color SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ partner_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ sex ENUM('M','F','N','S') NOT NULL DEFAULT 'N',
+ PRIMARY KEY (char_id),
+ UNIQUE KEY revolt (revolt_id),
+ UNIQUE KEY name_key (name),
+ KEY account_id (account_id),
+ KEY party_id (party_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`inventory\` (
+ id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ char_id INT(11) UNSIGNED NOT NULL,
+ nameid INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ amount INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ equip INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (id),
+ KEY char_id (char_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`storage\` (
+ id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ account_id INT(11) UNSIGNED NOT NULL,
+ nameid INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ amount INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (id),
+ KEY account_id (account_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`global_acc_reg\` (
+ account_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ \`name\` VARCHAR(32) NOT NULL DEFAULT '',
+ \`value\` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (account_id,\`name\`),
+ KEY account_id (account_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`acc_reg\` (
+ account_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ \`name\` VARCHAR(32) NOT NULL DEFAULT '',
+ \`value\` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (account_id,\`name\`),
+ KEY account_id (account_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`char_reg\` (
+ char_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ \`name\` VARCHAR(32) NOT NULL DEFAULT '',
+ \`value\` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (char_id,\`name\`),
+ KEY char_id (char_id)
+ ) ENGINE=ROCKSDB;
+ `);
+ await this.do(`
+ CREATE TABLE \`party\` (
+ party_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ revolt_id INT(11) UNSIGNED NULL, -- id of the new party on revolt
+ \`name\` VARCHAR(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
+ exp_share BIT(1) NOT NULL DEFAULT 0,
+ item_share BIT(1) NOT NULL DEFAULT 0,
+ PRIMARY KEY (party_id),
+ UNIQUE KEY revolt (revolt_id),
+ UNIQUE KEY name_key (name)
+ ) ENGINE=ROCKSDB;
+ `); // some old parties have weird names
+ }
+
+ escape (str) {
+ // for some reason the deno sql module doesn't escape backslashes
+ return str.replace(this.backslash, "\\\\");
+ }
+
+ async transaction (fn) {
+ return await this.client.transaction(fn);
+ }
+
+ async query (...args) {
+ return await this.client.query(...args);
+ }
+
+ async do (...args) {
+ return await this.client.execute(...args);
+ }
+
+
+ async close () {
+ return this.client.close();
+ }
+}
+
+export {
+ SQLHandler,
+}