Page MenuHomePhabricator

No OneTemporary

diff --git a/keyserver/src/database/migration-config.js b/keyserver/src/database/migration-config.js
new file mode 100644
index 000000000..03a2e3adc
--- /dev/null
+++ b/keyserver/src/database/migration-config.js
@@ -0,0 +1,85 @@
+// @flow
+
+import fs from 'fs';
+
+const migrations: $ReadOnlyMap<number, () => Promise<void>> = new Map([
+ [
+ 0,
+ async () => {
+ await makeSureBaseRoutePathExists('facts/commapp_url.json');
+ await makeSureBaseRoutePathExists('facts/squadcal_url.json');
+ },
+ ],
+ [
+ 1,
+ async () => {
+ try {
+ await fs.promises.unlink('facts/url.json');
+ } catch {}
+ },
+ ],
+ [
+ 2,
+ async () => {
+ await fixBaseRoutePathForLocalhost('facts/commapp_url.json');
+ await fixBaseRoutePathForLocalhost('facts/squadcal_url.json');
+ },
+ ],
+]);
+
+async function makeSureBaseRoutePathExists(filePath: string): Promise<void> {
+ let readFile, json;
+ try {
+ readFile = await fs.promises.open(filePath, 'r');
+ const contents = await readFile.readFile('utf8');
+ json = JSON.parse(contents);
+ } catch {
+ return;
+ } finally {
+ if (readFile) {
+ await readFile.close();
+ }
+ }
+ if (json.baseRoutePath) {
+ return;
+ }
+ let baseRoutePath;
+ if (json.baseDomain === 'http://localhost') {
+ baseRoutePath = json.basePath;
+ } else if (filePath.endsWith('commapp_url.json')) {
+ baseRoutePath = '/commweb/';
+ } else {
+ baseRoutePath = '/';
+ }
+ const newJSON = { ...json, baseRoutePath };
+ console.warn(`updating ${filePath} to ${JSON.stringify(newJSON)}`);
+ const writeFile = await fs.promises.open(filePath, 'w');
+ await writeFile.writeFile(JSON.stringify(newJSON, null, ' '), 'utf8');
+ await writeFile.close();
+}
+
+async function fixBaseRoutePathForLocalhost(filePath: string): Promise<void> {
+ let readFile, json;
+ try {
+ readFile = await fs.promises.open(filePath, 'r');
+ const contents = await readFile.readFile('utf8');
+ json = JSON.parse(contents);
+ } catch {
+ return;
+ } finally {
+ if (readFile) {
+ await readFile.close();
+ }
+ }
+ if (json.baseDomain !== 'http://localhost') {
+ return;
+ }
+ const baseRoutePath = '/';
+ json = { ...json, baseRoutePath };
+ console.warn(`updating ${filePath} to ${JSON.stringify(json)}`);
+ const writeFile = await fs.promises.open(filePath, 'w');
+ await writeFile.writeFile(JSON.stringify(json, null, ' '), 'utf8');
+ await writeFile.close();
+}
+
+export { migrations };
diff --git a/keyserver/src/database/migrations.js b/keyserver/src/database/migrations.js
index e86403416..d41e8e9ae 100644
--- a/keyserver/src/database/migrations.js
+++ b/keyserver/src/database/migrations.js
@@ -1,181 +1,101 @@
// @flow
-import fs from 'fs';
import type { QueryResults } from 'mysql';
import { getMessageForException } from 'lib/utils/errors';
import { dbQuery, SQL } from './database';
+import { migrations } from './migration-config';
import { setupDB } from './setup-db';
-async function makeSureBaseRoutePathExists(filePath: string): Promise<void> {
- let readFile, json;
- try {
- readFile = await fs.promises.open(filePath, 'r');
- const contents = await readFile.readFile('utf8');
- json = JSON.parse(contents);
- } catch {
- return;
- } finally {
- if (readFile) {
- await readFile.close();
- }
- }
- if (json.baseRoutePath) {
- return;
- }
- let baseRoutePath;
- if (json.baseDomain === 'http://localhost') {
- baseRoutePath = json.basePath;
- } else if (filePath.endsWith('commapp_url.json')) {
- baseRoutePath = '/commweb/';
- } else {
- baseRoutePath = '/';
- }
- const newJSON = { ...json, baseRoutePath };
- console.warn(`updating ${filePath} to ${JSON.stringify(newJSON)}`);
- const writeFile = await fs.promises.open(filePath, 'w');
- await writeFile.writeFile(JSON.stringify(newJSON, null, ' '), 'utf8');
- await writeFile.close();
-}
-
-async function fixBaseRoutePathForLocalhost(filePath: string): Promise<void> {
- let readFile, json;
- try {
- readFile = await fs.promises.open(filePath, 'r');
- const contents = await readFile.readFile('utf8');
- json = JSON.parse(contents);
- } catch {
- return;
- } finally {
- if (readFile) {
- await readFile.close();
- }
- }
- if (json.baseDomain !== 'http://localhost') {
- return;
- }
- const baseRoutePath = '/';
- json = { ...json, baseRoutePath };
- console.warn(`updating ${filePath} to ${JSON.stringify(json)}`);
- const writeFile = await fs.promises.open(filePath, 'w');
- await writeFile.writeFile(JSON.stringify(json, null, ' '), 'utf8');
- await writeFile.close();
-}
-
-const migrations: $ReadOnlyMap<number, () => Promise<void>> = new Map([
- [
- 0,
- async () => {
- await makeSureBaseRoutePathExists('facts/commapp_url.json');
- await makeSureBaseRoutePathExists('facts/squadcal_url.json');
- },
- ],
- [
- 1,
- async () => {
- try {
- await fs.promises.unlink('facts/url.json');
- } catch {}
- },
- ],
- [
- 2,
- async () => {
- await fixBaseRoutePathForLocalhost('facts/commapp_url.json');
- await fixBaseRoutePathForLocalhost('facts/squadcal_url.json');
- },
- ],
-]);
-
async function migrate(): Promise<boolean> {
let dbVersion = null;
try {
dbVersion = await setUpDBAndReturnVersion();
console.log(`(node:${process.pid}) DB version: ${dbVersion}`);
} catch (e) {
const dbVersionExceptionMessage = String(getMessageForException(e));
console.error(`(node:${process.pid}) ${dbVersionExceptionMessage}`);
return false;
}
for (const [idx, migration] of migrations.entries()) {
if (idx <= dbVersion) {
continue;
}
try {
await startTransaction();
await migration();
await updateDBVersion(idx);
await commitTransaction();
console.log(`(node:${process.pid}) migration ${idx} succeeded.`);
} catch (e) {
const transactionExceptionMessage = String(getMessageForException(e));
console.error(`(node:${process.pid}) migration ${idx} failed.`);
console.error(transactionExceptionMessage);
await rollbackTransaction();
return false;
}
}
return true;
}
async function setUpDBAndReturnVersion(): Promise<number> {
try {
return await fetchDBVersion();
} catch (e) {
if (e.errno !== 1146) {
throw e;
}
await setupDB();
return await fetchDBVersion();
}
}
async function fetchDBVersion(): Promise<number> {
const versionQuery = SQL`
SELECT data
FROM metadata
WHERE name = 'db_version';
`;
const [[versionResult]] = await dbQuery(versionQuery);
if (!versionResult) {
return -1;
}
return versionResult.data;
}
async function updateDBVersion(dbVersion: number): Promise<QueryResults> {
const updateQuery = SQL`
INSERT INTO metadata (name, data)
VALUES ('db_version', ${dbVersion})
ON DUPLICATE KEY
UPDATE
data = ${dbVersion};
`;
return dbQuery(updateQuery);
}
async function startTransaction(): Promise<QueryResults> {
const beginTxnQuery = SQL`
START TRANSACTION;
`;
return dbQuery(beginTxnQuery);
}
async function commitTransaction(): Promise<QueryResults> {
const endTxnQuery = SQL`
COMMIT;
`;
return dbQuery(endTxnQuery);
}
async function rollbackTransaction(): Promise<QueryResults> {
const rollbackTxnQuery = SQL`
ROLLBACK;
`;
return dbQuery(rollbackTxnQuery);
}
export { migrate };

File Metadata

Mime Type
text/x-diff
Expires
Mon, Dec 23, 7:17 AM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2690543
Default Alt Text
(7 KB)

Event Timeline