oracle thick mode support #843

This commit is contained in:
Jan Prochazka
2024-07-31 11:20:31 +02:00
parent faf6339b41
commit 5e68ce3218
11 changed files with 75 additions and 39 deletions

View File

@@ -1,13 +1,22 @@
const _ = require('lodash');
const stream = require('stream');
const driverBases = require('../frontend/drivers');
const driverBase = require('../frontend/driver');
const Analyser = require('./Analyser');
//--const pg = require('pg');
const oracledb = require('oracledb');
const { createBulkInsertStreamBase, makeUniqueColumnNames } = require('dbgate-tools');
const createOracleBulkInsertStream = require('./createOracleBulkInsertStream');
let requireOracledb;
let oracledbValue;
function getOracledb() {
if (!oracledbValue) {
oracledbValue = requireOracledb();
}
return oracledbValue;
}
/*
pg.types.setTypeParser(1082, 'text', val => val); // date
pg.types.setTypeParser(1114, 'text', val => val); // timestamp without timezone
@@ -33,8 +42,10 @@ function zipDataRow(rowArray, columns) {
return obj;
}
let oracleClientInitialized = false;
/** @type {import('dbgate-types').EngineDriver} */
const drivers = driverBases.map(driverBase => ({
const driver = {
...driverBase,
analyserClass: Analyser,
@@ -51,8 +62,14 @@ const drivers = driverBases.map(driverBase => ({
ssl,
isReadOnly,
authType,
clientLibraryPath,
socketPath,
}) {
const oracledb = getOracledb();
if (authType == 'thick' && !oracleClientInitialized) {
oracledb.initOracleClient({ libDir: clientLibraryPath });
oracleClientInitialized = true;
}
client = await oracledb.getConnection({
user,
password,
@@ -312,15 +329,21 @@ const drivers = driverBases.map(driverBase => ({
getAuthTypes() {
return [
{
title: 'Host and port',
name: 'hostPort',
title: 'Thin mode (default) - direct connection to Oracle database',
name: 'thin',
},
{
title: 'Socket',
name: 'socket',
title: 'Thick mode - connection via Oracle instant client',
name: 'thick',
},
];
},
}));
};
module.exports = drivers;
driver.initialize = (dbgateEnv) => {
if (dbgateEnv.nativeModules && dbgateEnv.nativeModules['oracledb']) {
requireOracledb = dbgateEnv.nativeModules['oracledb'];
}
};
module.exports = driver;

View File

@@ -1,6 +1,9 @@
const drivers = require('./drivers');
const driver = require('./driver');
module.exports = {
packageName: 'dbgate-plugin-oracle',
drivers,
drivers: [driver],
initialize(dbgateEnv) {
driver.initialize(dbgateEnv);
},
};