Skip to content

Commit d6f5534

Browse files
author
Sylvestre
authored
Moved Oracle DB types mapping to the OracleSingleton class (#51)
* moved the oracle db types mapping to the OracleSingleton class * check if map is empty * correctly check if map is empty * more concised, getter and root scope cleanedup * typo
1 parent 74dc0ba commit d6f5534

File tree

1 file changed

+64
-39
lines changed

1 file changed

+64
-39
lines changed

lib/oracle.js

Lines changed: 64 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,71 @@ import {badRequest, failedCheck} from "./errors.js";
66
import {validateQueryPayload} from "./validate.js";
77

88
const READ_ONLY = new Set(["SELECT", "USAGE", "CONNECT"]);
9-
109
export class OracleSingleton {
1110
static instance = null;
11+
static types = new Map();
1212
constructor() {
1313
throw new Error(
1414
"Do not use new OracleSingleton(). Call OracleSingleton.initialize() instead."
1515
);
1616
}
1717
static initialize() {
18+
const boolean = ["null", "boolean"],
19+
number = ["null", "number"],
20+
object = ["null", "object"],
21+
string = ["null", "string"];
22+
1823
if (!OracleSingleton.instance) {
1924
try {
2025
OracleSingleton.instance = import("oracledb").then((module) => {
2126
const oracledb = module.default;
2227
oracledb.initOracleClient({
2328
libDir: process.env.LIB_DIR_PATH,
2429
});
30+
31+
OracleSingleton.types
32+
.set(oracledb.DB_TYPE_BOOLEAN, {
33+
type: boolean,
34+
})
35+
.set(oracledb.DB_TYPE_NUMBER, {type: number})
36+
.set(oracledb.DB_TYPE_BINARY_FLOAT, {
37+
type: number,
38+
})
39+
.set(oracledb.DB_TYPE_BINARY_DOUBLE, {
40+
type: number,
41+
})
42+
.set(oracledb.DB_TYPE_BINARY_INTEGER, {
43+
type: number,
44+
})
45+
.set(oracledb.DB_TYPE_TIMESTAMP, {
46+
type: string,
47+
date: true,
48+
})
49+
.set(oracledb.DB_TYPE_DATE, {
50+
type: string,
51+
date: true,
52+
})
53+
.set(oracledb.DB_TYPE_TIMESTAMP_TZ, {
54+
type: string,
55+
date: true,
56+
})
57+
.set(oracledb.DB_TYPE_TIMESTAMP_LTZ, {
58+
type: string,
59+
date: true,
60+
})
61+
.set(oracledb.DB_TYPE_INTERVAL_DS, {
62+
type: string,
63+
date: true,
64+
})
65+
.set(oracledb.DB_TYPE_INTERVAL_YM, {
66+
type: string,
67+
date: true,
68+
})
69+
.set(oracledb.DB_TYPE_BLOB, {
70+
type: object,
71+
buffer: true,
72+
});
73+
2574
return oracledb;
2675
});
2776
} catch (err) {
@@ -36,6 +85,14 @@ export class OracleSingleton {
3685
);
3786
return OracleSingleton.instance;
3887
}
88+
89+
get types() {
90+
if (OracleSingleton.types.size === 0)
91+
throw new Error(
92+
"OracleSingleton not initialized. Call OracleSingleton.initialize() first."
93+
);
94+
return OracleSingleton.types;
95+
}
3996
}
4097

4198
export async function queryStream(req, res, pool) {
@@ -179,43 +236,11 @@ export default async ({url, username, password}) => {
179236
};
180237

181238
// See https://oracle.github.io/node-oracledb/doc/api.html#-312-oracle-database-type-constants
182-
const boolean = ["null", "boolean"],
183-
number = ["null", "number"],
184-
object = ["null", "object"],
185-
string = ["null", "string"];
186-
export function dataTypeSchema({type}) {
187-
const oracledb = OracleSingleton.getInstance();
188-
189-
switch (type) {
190-
case oracledb.DB_TYPE_BOOLEAN:
191-
return {type: boolean};
192-
case oracledb.DB_TYPE_NUMBER:
193-
case oracledb.DB_TYPE_BINARY_DOUBLE:
194-
case oracledb.DB_TYPE_BINARY_FLOAT:
195-
case oracledb.DB_TYPE_BINARY_INTEGER:
196-
return {type: number};
197-
case oracledb.DB_TYPE_TIMESTAMP:
198-
case oracledb.DB_TYPE_DATE:
199-
case oracledb.DB_TYPE_TIMESTAMP_TZ:
200-
case oracledb.DB_TYPE_TIMESTAMP_LTZ:
201-
case oracledb.DB_TYPE_INTERVAL_DS:
202-
case oracledb.DB_TYPE_INTERVAL_YM:
203-
return {type: string, date: true};
204-
case oracledb.DB_TYPE_BLOB:
205-
return {type: object, buffer: true};
206-
case oracledb.DB_TYPE_CHAR:
207-
case oracledb.DB_TYPE_BFILE:
208-
case oracledb.DB_TYPE_CLOB:
209-
case oracledb.DB_TYPE_NCLOB:
210-
case oracledb.DB_TYPE_CURSOR:
211-
case oracledb.DB_TYPE_LONG_RAW:
212-
case oracledb.DB_TYPE_NCHAR:
213-
case oracledb.DB_TYPE_NVARCHAR:
214-
case oracledb.DB_TYPE_OBJECT:
215-
case oracledb.DB_TYPE_RAW:
216-
case oracledb.DB_TYPE_ROWID:
217-
case oracledb.DB_TYPE_VARCHAR:
218-
default:
219-
return {type: string};
239+
function dataTypeSchema({type}) {
240+
const types = OracleSingleton.types;
241+
if (types.has(type)) {
242+
return types.get(type);
220243
}
244+
245+
return {type: ["null", "string"]};
221246
}

0 commit comments

Comments
 (0)