From a2c42d213aa13432a571db2d85e4e29a80963238 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 22 Mar 2023 00:31:35 +0800 Subject: [PATCH] migrate: hustoj: support mysql 8.0 --- packages/migrate/package.json | 4 +-- packages/migrate/scripts/hustoj.ts | 42 +++++++++++++----------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/packages/migrate/package.json b/packages/migrate/package.json index a4df48a8a..12b7150db 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,18 +1,16 @@ { "name": "@hydrooj/migrate", - "version": "0.2.3", + "version": "0.2.4", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", "license": "AGPL-3.0-or-later", "devDependencies": { - "@types/mysql": "^2.15.21", "@types/turndown": "^5.0.1" }, "dependencies": { "mariadb": "^3.1.0", "mongodb": "^5.1.0", - "mysql": "^2.18.1", "turndown": "^7.1.1" } } diff --git a/packages/migrate/scripts/hustoj.ts b/packages/migrate/scripts/hustoj.ts index 979b5fcaf..ce8bf3a90 100644 --- a/packages/migrate/scripts/hustoj.ts +++ b/packages/migrate/scripts/hustoj.ts @@ -1,6 +1,6 @@ /* eslint-disable no-tabs */ /* eslint-disable no-await-in-loop */ -import mysql from 'mysql'; +import mariadb from 'mariadb'; import TurndownService from 'turndown'; import { buildContent, ContestModel, DomainModel, fs, noop, NotFoundError, ObjectId, postJudge, ProblemModel, @@ -53,21 +53,15 @@ export async function run({ username, password, domainId, contestType = 'oi', dataDir, rerun = true, randomMail = false, }, report: Function) { - const src = mysql.createConnection({ + const src = await mariadb.createConnection({ host, port, user: username, password, database: name, }); - await new Promise((resolve, reject) => { - src.connect((err) => (err ? reject(err) : resolve(null))); - }); - const query = (q: string | mysql.Query) => new Promise<[values: any[], fields: mysql.FieldInfo[]]>((res, rej) => { - src.query(q, (err, val, fields) => { - if (err) rej(err); - else res([val, fields]); - }); + const query = (q: string) => new Promise((res, rej) => { + src.query(q).then((r) => res(r)).catch((e) => rej(e)); }); const target = await DomainModel.get(domainId); if (!target) throw new NotFoundError(domainId); @@ -88,7 +82,7 @@ export async function run({ school varchar 100 N 用户所在学校 */ const uidMap: Record = {}; - const [udocs] = await query('SELECT * FROM `users`'); + const udocs = await query('SELECT * FROM `users`'); const precheck = await UserModel.getMulti({ unameLower: { $in: udocs.map((u) => u.user_id.toLowerCase()) } }).toArray(); if (precheck.length) throw new Error(`Conflict username: ${precheck.map((u) => u.unameLower).join(', ')}`); for (const udoc of udocs) { @@ -121,7 +115,7 @@ export async function run({ } } - const [admins] = await query("SELECT * FROM `privilege` WHERE `rightstr` = 'administrator'"); + const admins = await query("SELECT * FROM `privilege` WHERE `rightstr` = 'administrator'"); for (const admin of admins) await DomainModel.setUserRole(domainId, uidMap[admin.user_id], 'root'); const adminUids = admins.map((admin) => uidMap[admin.user_id]); report({ message: 'user finished' }); @@ -148,11 +142,11 @@ export async function run({ solution #optional */ const pidMap: Record = {}; - const [[{ 'count(*)': pcount }]] = await query('SELECT count(*) FROM `problem`'); + const [{ 'count(*)': pcount }] = await query('SELECT count(*) FROM `problem`'); const step = 50; - const pageCount = Math.ceil(pcount / step); + const pageCount = Math.ceil(Number(pcount) / step); for (let pageId = 0; pageId < pageCount; pageId++) { - const [pdocs] = await query(`SELECT * FROM \`problem\` LIMIT ${pageId * step}, ${step}`); + const pdocs = await query(`SELECT * FROM \`problem\` LIMIT ${pageId * step}, ${step}`); for (const pdoc of pdocs) { if (rerun) { const opdoc = await ProblemModel.get(domainId, `P${pdoc.problem_id}`); @@ -173,7 +167,7 @@ export async function run({ ); pidMap[pdoc.problem_id] = pid; } - const [cdoc] = await query(`SELECT * FROM \`privilege\` WHERE \`rightstr\` = 'p${pdoc.problem_id}'`); + const cdoc = await query(`SELECT * FROM \`privilege\` WHERE \`rightstr\` = 'p${pdoc.problem_id}'`); const maintainer = []; for (let i = 1; i < cdoc.length; i++) maintainer.push(uidMap[cdoc[i].user_id]); await ProblemModel.edit(domainId, pidMap[pdoc.problem_id], { @@ -205,9 +199,9 @@ export async function run({ user_id char(48) 允许参加比赛用户列表 */ const tidMap: Record = {}; - const [tdocs] = await query('SELECT * FROM `contest`'); + const tdocs = await query('SELECT * FROM `contest`'); for (const tdoc of tdocs) { - const [pdocs] = await query(`SELECT * FROM \`contest_problem\` WHERE \`contest_id\` = ${tdoc.contest_id}`); + const pdocs = await query(`SELECT * FROM \`contest_problem\` WHERE \`contest_id\` = ${tdoc.contest_id}`); const pids = pdocs.map((i) => pidMap[i.problem_id]).filter((i) => i); const tid = await ContestModel.add( domainId, tdoc.title, tdoc.description || 'Description', @@ -239,10 +233,10 @@ export async function run({ lint_error int N ??? judger char(16) N 判题机 */ - const [[{ 'count(*)': rcount }]] = await query('SELECT count(*) FROM `solution`'); - const rpageCount = Math.ceil(rcount / step); + const [{ 'count(*)': rcount }] = await query('SELECT count(*) FROM `solution`'); + const rpageCount = Math.ceil(Number(rcount) / step); for (let pageId = 0; pageId < rpageCount; pageId++) { - const [rdocs] = await query(`SELECT * FROM \`solution\` LIMIT ${pageId * step}, ${step}`); + const rdocs = await query(`SELECT * FROM \`solution\` LIMIT ${pageId * step}, ${step}`); for (const rdoc of rdocs) { const data: RecordDoc = { status: statusMap[rdoc.result] || 0, @@ -262,11 +256,11 @@ export async function run({ rejudged: false, judger: 1, }; - const [ceInfo] = await query(`SELECT \`error\` FROM \`compileinfo\` WHERE \`solution_id\` = ${rdoc.solution_id}`); + const ceInfo = await query(`SELECT \`error\` FROM \`compileinfo\` WHERE \`solution_id\` = ${rdoc.solution_id}`); if (ceInfo[0]?.error) data.judgeTexts.push(ceInfo[0].error); - const [rtInfo] = await query(`SELECT \`error\` FROM \`runtimeinfo\` WHERE \`solution_id\` = ${rdoc.solution_id}`); + const rtInfo = await query(`SELECT \`error\` FROM \`runtimeinfo\` WHERE \`solution_id\` = ${rdoc.solution_id}`); if (rtInfo[0]?.error) data.judgeTexts.push(rtInfo[0].error); - const [source] = await query(`SELECT \`source\` FROM \`source_code\` WHERE \`solution_id\` = ${rdoc.solution_id}`); + const source = await query(`SELECT \`source\` FROM \`source_code\` WHERE \`solution_id\` = ${rdoc.solution_id}`); if (source[0]?.source) data.code = source[0].source; if (rdoc.contest_id) { data.contest = new ObjectId(tidMap[rdoc.contest_id]);