Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit d2da30b

Browse files
committed
fix #69
1 parent f299c1f commit d2da30b

File tree

5 files changed

+251
-116
lines changed

5 files changed

+251
-116
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ Setup your Elasticsearch instance and ensure that it is up and running.
6969

7070
Migrations are located under the `./scripts/db/` folder. Run `npm run migrations up` and `npm run migrations down` to execute the migrations or remove the earlier ones
7171

72+
## Import data from QLDB
73+
74+
Make sure `QLDB_NAME`, `AWS_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` are set in your environment
75+
76+
Run `npm run migrate-qldb-to-pg` to import data from qldb.
77+
7278
## Local Deployment with Docker
7379

7480
Make sure all config values are right, and you can run on local successfully, then run below commands

package-lock.json

+127-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"insert-data": "node scripts/db/genData.js",
1010
"delete-data": "node scripts/db/dropAll.js",
1111
"migrate-db-to-es": "node scripts/db/dumpDbToEs.js",
12-
"migrations": "node scripts/db/migrations.js"
12+
"migrations": "node scripts/db/migrations.js",
13+
"migrate-qldb-to-pg": "node scripts/db/migrateQldbToPg.js"
1314
},
1415
"repository": {
1516
"type": "git",
@@ -25,7 +26,6 @@
2526
"cors": "^2.8.5",
2627
"express": "^4.17.1",
2728
"get-parameter-names": "^0.3.0",
28-
"ion-js": "^3.1.2",
2929
"js-yaml": "^3.13.1",
3030
"lodash": "^4.17.19",
3131
"node-cache": "^5.1.2",
@@ -42,6 +42,9 @@
4242
"winston": "^3.2.1"
4343
},
4444
"devDependencies": {
45+
"aws-sdk": "^2.627.0",
46+
"ion-js": "^3.1.2",
47+
"amazon-qldb-driver-nodejs": "^0.1.1-preview.2",
4548
"standard": "^14.3.0"
4649
},
4750
"engines": {

scripts/db/migrateQldbToPg.js

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
const {
2+
IonTypes
3+
} = require('ion-js')
4+
const QLDB = require('amazon-qldb-driver-nodejs')
5+
const sequelize = require('../../src/models/index')
6+
const logger = require('../../src/common/logger')
7+
8+
const models = sequelize.models
9+
10+
const dataKeys = ['User', 'Organization', 'AchievementsProvider', 'Achievement',
11+
'AttributeGroup', 'Attribute', 'ExternalProfile', 'SkillsProvider',
12+
'OrganizationSkillsProvider', 'Role', 'Skill', 'UserAttribute', 'UsersRole', 'UsersSkill']
13+
14+
/**
15+
* Query all records from db.
16+
* @param {String} tableName the table name
17+
* @param {Object} session the db session
18+
*/
19+
async function queryAllRecord (tableName, session) {
20+
if (tableName === 'User') {
21+
tableName = 'DUser'
22+
} else if (tableName === 'UserAttribute') {
23+
tableName = 'UsersAttribute'
24+
} else if (tableName === 'UsersRole') {
25+
tableName = 'UserRole'
26+
}
27+
const results = await session.executeStatement(`SELECT * FROM ${tableName}`, [])
28+
return results.getResultList().map(r => readerToJson(r))
29+
}
30+
31+
/**
32+
* Reader to json object
33+
* @param reader the ion.js Reader
34+
* @returns {{}}
35+
*/
36+
function readerToJson (reader) {
37+
reader.next()
38+
reader.stepIn()
39+
40+
const obj = {}
41+
42+
const toRealValue = (r, result) => {
43+
let nextT = reader.next()
44+
45+
const setValue = (key, value) => {
46+
if (key) {
47+
result[key] = value
48+
} else {
49+
result.push(value)
50+
}
51+
return value
52+
}
53+
54+
while (nextT) {
55+
const name = r.fieldName()
56+
switch (nextT) {
57+
case IonTypes.STRING:
58+
setValue(name, r.stringValue())
59+
break
60+
case IonTypes.TIMESTAMP:
61+
setValue(name, r.timestampValue().getDate())
62+
break
63+
case IonTypes.NULL:
64+
setValue(name, null)
65+
break
66+
case IonTypes.INT:
67+
setValue(name, r.numberValue())
68+
break
69+
case IonTypes.LIST:
70+
r.stepIn()
71+
toRealValue(r, setValue(name, []))
72+
r.stepOut()
73+
break
74+
case IonTypes.BOOL:
75+
setValue(name, r.booleanValue())
76+
break
77+
}
78+
nextT = reader.next()
79+
}
80+
}
81+
82+
toRealValue(reader, obj)
83+
return obj
84+
}
85+
86+
/**
87+
* import test data
88+
*/
89+
async function main () {
90+
const qldbInstance = new QLDB.PooledQldbDriver(process.env.QLDB_NAME, {
91+
region: process.env.AWS_REGION,
92+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
93+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
94+
})
95+
const session = await qldbInstance.getSession()
96+
for (const key of dataKeys) {
97+
try {
98+
const records = await queryAllRecord(key, session)
99+
await models[key].bulkCreate(records)
100+
logger.info(`import data for ${key} done, record count: ${records.length}`)
101+
} catch (e) {
102+
logger.error(e)
103+
logger.warn(`import data for ${key} failed`)
104+
}
105+
}
106+
session.close()
107+
logger.info('all done')
108+
process.exit(0)
109+
}
110+
111+
(async () => {
112+
main().catch(err => console.error(err))
113+
})()

0 commit comments

Comments
 (0)