UNPKG

teradata-nodejs-driver-temp-fork1

Version:
111 lines 5.25 kB
"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