teradata-nodejs-driver-temp-fork1
Version:
Teradata Database Node.js Driver
111 lines • 5.25 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TeradataConnection = void 0;
// Get the Teradata Native Binding
/* tslint:disable-next-line */
let ffi = require('ffi-napi');
/* tslint:disable-next-line */
let ref = require('ref-napi');
/* tslint:disable-next-line */
let ArrayType = require('ref-array-di')(ref);
const teradata_cursor_1 = require("./teradata-cursor");
const teradata_logging_1 = require("./teradata-logging");
const teradata_exceptions_1 = require("./teradata-exceptions");
class TeradataConnection {
constructor() {
this.sVersionNumber = '42659830765e8ee7b720b821cd0b35677b82dbd5'; // Version Number
this.poolHandle = null;
this.ref = ref;
this.byteArray = new ArrayType(this.ref.types.byte);
this.logLevel = 0;
this.logger = new teradata_logging_1.TeradataLogging(this.logLevel);
// Setup libpath for ffi.library
let libpath = '';
if (process.platform === 'win32') {
libpath = 'node_modules/@teradataprebuilt/nativelib-win32/teradatasql.dll';
}
else if (process.platform === 'darwin') {
libpath = 'node_modules/@teradataprebuilt/nativelib-darwin/teradatasql.dylib';
}
else if (process.platform === 'freebsd' || process.platform === 'linux') {
libpath = 'node_modules/@teradataprebuilt/nativelib-linux/teradatasql.so';
}
// Load native library with libpath and declare functions
this.lib = ffi.Library(libpath, {
'jsgoCreateConnection': ['void', ['long', 'char*', 'char*', 'char**', this.ref.refType(this.ref.types.ulonglong)]],
'jsgoCloseConnection': ['void', ['long', 'long', 'char**']],
'jsgoCreateRows': ['void', ['long', 'long', 'char*', 'long', 'void*', 'char**', this.ref.refType(this.ref.types.ulonglong)]],
'jsgoFetchRow': ['void', ['long', 'long', 'char**', this.ref.refType(this.ref.types.int), 'void**']],
'jsgoResultMetaData': ['void', ['long', 'long', 'char**',
this.ref.refType(this.ref.types.ulonglong), this.ref.refType(this.ref.types.int), 'void**']],
'jsgoNextResult': ['void', ['long', 'long', 'char**', 'char*']],
'jsgoCloseRows': ['void', ['long', 'long', 'char**']],
'jsgoFreePointer': ['void', ['long', 'void*']],
});
}
// All DBAPI 2.0 methods
// https://www.python.org/dev/peps/pep-0249/#connection-objects
get uLog() {
return this.logLevel;
}
get uPoolHandle() {
return this.poolHandle;
}
cursor() {
return new teradata_cursor_1.TeradataCursor(this, this.lib, this.ref, this.byteArray);
}
connect(databaseConnParams) {
this.logLevel = (databaseConnParams.log ? Number(databaseConnParams.log) : 0);
this.logger = new teradata_logging_1.TeradataLogging(this.logLevel);
this.logger.traceLogMessage('entering connect()');
try {
const jsgoFreePointer = this.lib.jsgoFreePointer;
const inputString = this.ref.allocCString(JSON.stringify(databaseConnParams));
const sVersionNumberPtr = this.ref.allocCString(this.sVersionNumber);
const cStringPtrType = this.ref.refType(this.ref.types.char);
const jsgoCreateConnection = this.lib.jsgoCreateConnection;
const poolHandlePtr = this.ref.alloc(this.ref.types.ulonglong);
const outputPtrPtr = this.ref.alloc(cStringPtrType);
jsgoCreateConnection(this.uLog, sVersionNumberPtr, inputString, outputPtrPtr, poolHandlePtr);
let outputString = this.ref.allocCString('');
outputString = this.ref.deref(outputPtrPtr);
if (outputString.length > 0) {
let msg = this.ref.readCString(outputString);
jsgoFreePointer(this.uLog, outputString);
throw new teradata_exceptions_1.OperationalError(msg);
}
this.poolHandle = this.ref.readUInt64LE(poolHandlePtr);
}
finally {
this.logger.traceLogMessage('leaving connect()');
}
}
close() {
this.logger.traceLogMessage('entering close()');
try {
const jsgoCloseConnection = this.lib.jsgoCloseConnection;
const jsgoFreePointer = this.lib.jsgoFreePointer;
const cStringPtrType = this.ref.refType(this.ref.types.char);
const outputPtrPtr = this.ref.alloc(cStringPtrType);
jsgoCloseConnection(this.uLog, this.poolHandle, outputPtrPtr);
let outputString = this.ref.allocCString('');
outputString = this.ref.deref(outputPtrPtr);
if (outputString.length > 0) {
let msg = this.ref.readCString(outputString);
jsgoFreePointer(this.uLog, outputString);
throw new teradata_exceptions_1.OperationalError(msg);
}
}
finally {
this.logger.traceLogMessage('leaving close()');
}
}
commit() {
// do something
}
rollback() {
// do something
}
}
exports.TeradataConnection = TeradataConnection;
//# sourceMappingURL=teradata-connection.js.map