-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstanceHelper.js
More file actions
119 lines (99 loc) · 3.31 KB
/
instanceHelper.js
File metadata and controls
119 lines (99 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
* @typedef {import("../types").Connection} Connection
* @typedef {import("../types").NameMap} NameMap
* @typedef {import("../types").Logger} Logger
*/
const { queryHelper } = require('./queryHelper');
/**
* @param {{ connection: Connection }}
* @returns {Promise<string>}
*/
const getDbVersion = async ({ connection }) => {
const query = queryHelper.getDbVersionQuery();
const result = await connection.execute({ query });
const rawVersion = result?.[0]?.SERVICE_LEVEL || '';
const [version] = /v\d+.\d+/gi.exec(rawVersion) || [''];
return version;
};
/**
* @param {{ connection: Connection }}
* @returns {Promise<string[]>}
*/
const getSchemaNames = async ({ connection }) => {
const query = queryHelper.getSchemasQuery();
const result = await connection.execute({ query });
return result.map(row => row.SCHEMANAME);
};
/**
* @param {{ connection: Connection, objectType: string, includeSystemCollection: boolean, tableNameModifier: (name: string) => string }}
* @returns {Promise<NameMap>}
*/
const getDatabasesWithTableNames = async ({ connection, objectType, includeSystemCollection, tableNameModifier }) => {
const query = queryHelper.getTableNamesQuery({ objectType, includeSystemCollection });
const result = await connection.execute({ query });
return result.reduce((result, { SCHEMANAME, TABLENAME }) => {
return {
...result,
[SCHEMANAME]: [...(result[SCHEMANAME] || []), tableNameModifier(TABLENAME)],
};
}, {});
};
/**
* @param {{ connection: Connection, schemaName: string, logger: Logger }}
* @returns {Promise<{ [key: string]: string }>}
*/
const getSchemaProperties = async ({ connection, schemaName, logger }) => {
try {
const query = queryHelper.getSchemaQuery({ schemaName });
const result = await connection.execute({ query });
return (result || []).reduce((acc, row) => {
return {
...acc,
authorizationName: row.OWNER,
dataCapture: row.DATACAPTURE === 'Y' ? 'CHANGES' : 'NONE',
};
}, {});
} catch (error) {
logger.error(error);
return {};
}
};
/**
* @param {{ connection: Connection, schemaName: string, tableName: string, tableName: string, logger: Logger}}
* @returns {Promise<string>}
*/
const getTableDdl = async ({ connection, schemaName, tableName, objectType, logger }) => {
try {
const generateQuery = queryHelper.getGenerateTableDdlQuery({ schemaName, tableName, objectType });
const opToken = await connection.execute({ query: generateQuery, callable: true });
const selectQuery = queryHelper.getSelectTableDdlQuery({
opToken,
schemaName,
objectName: tableName,
objectType,
});
const ddlResult = await connection.execute({ query: selectQuery });
const clearQuery = queryHelper.getClearTableDdlQuery();
await connection.execute({ query: clearQuery, callable: true, inparam: opToken });
return ddlResult.map(row => queryHelper.ensureTerminator({ query: row.SQL_STMT })).join('\n');
} catch (error) {
logger.error(error);
return '';
}
};
/**
* @param {{ connection: Connection, query: string, ddl?: boolean }}
* @returns {Promise<void>}
*/
const executeQuery = async ({ connection, query, ddl = false }) => await connection.execute({ query, ddl });
const instanceHelper = {
getDbVersion,
getSchemaNames,
getSchemaProperties,
getDatabasesWithTableNames,
getTableDdl,
executeQuery,
};
module.exports = {
instanceHelper,
};