@teradataprebuilt/januspreview
Version:
Teradata SQL Driver for Node.js
280 lines • 11.5 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TeradataConnection = void 0;
const ffi = __importStar(require("ffi-napi"));
const ref = __importStar(require("ref-napi"));
const arrayType = require("ref-array-di")(ref);
const fs = require("fs");
const path = require("path");
const os = require("os");
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 = "";
if (!["arm64", "x64"].includes(process.arch)) {
throw new Error("This package requires 64-bit Node.js. 32-bit Node.js is not supported.");
}
const sPackageJsonPathName = path.resolve(__dirname, "..", "package.json");
try {
const packageJson = fs.readFileSync(sPackageJsonPathName);
JSON.parse(packageJson, (key, value) => {
if (key === "version") {
this.sVersionNumber = value;
}
});
}
catch (error) {
console.log(`sPackageJsonPathName=${sPackageJsonPathName}`);
fs.stat(sPackageJsonPathName, (err, stat) => {
if (err) {
console.log(err);
}
else {
if (stat.isFile()) {
console.log(stat);
}
else {
console.log(`${sPackageJsonPathName} is not a file.`);
}
}
});
throw new teradata_exceptions_1.OperationalError(error.message);
}
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);
const osType = process.platform;
let sExtension = "";
if (osType === "win32") {
sExtension = "dll";
}
else if (osType === "darwin") {
sExtension = "dylib";
}
else {
sExtension = "so";
}
const sLibPathName = path.resolve(__dirname, "teradatasql." + sExtension);
try {
this.lib = ffi.Library(`${sLibPathName}`, {
jsgoCreateConnection: ["void", ["ulong", "char*", "char*", "char**", this.ref.refType(this.ref.types.ulong)]],
jsgoCloseConnection: ["void", ["ulong", "ulong", "char**"]],
jsgoCancelRequest: ["void", ["ulong", "ulong", "char**"]],
jsgoCreateRows: ["void", ["ulong", "ulong", "char*", "ulong", "void*", "char**", this.ref.refType(this.ref.types.ulong)]],
jsgoFetchRow: ["void", ["ulong", "ulong", "char**", this.ref.refType(this.ref.types.long), "void**", "long"]],
jsgoResultMetaData: [
"void",
["ulong", "ulong", "char**", this.ref.refType(this.ref.types.ulong), this.ref.refType(this.ref.types.int), "void**"],
],
jsgoNextResult: ["void", ["ulong", "ulong", "char**", "char*"]],
jsgoCloseRows: ["void", ["ulong", "ulong", "char**"]],
jsgoFreePointer: ["void", ["ulong", "void*"]],
});
}
catch (error) {
console.log(`sLibPathName=${sLibPathName}`);
fs.stat(sLibPathName, (err, stat) => {
if (err) {
console.log(err);
}
else {
if (stat.isFile()) {
console.log(stat);
}
else {
console.log(`${sLibPathName} is not a file.`);
}
}
});
throw new teradata_exceptions_1.OperationalError(error.message);
}
}
get uLog() {
return this.logLevel;
}
get uPoolHandle() {
return this.poolHandle;
}
get autocommit() {
this.logger.traceLog("> enter autocommit getter");
let result;
try {
const cur = this.cursor();
cur.execute("{fn teradata_nativesql}{fn teradata_autocommit}");
const row = cur.fetchone();
if (row && row[0] === "true") {
result = true;
}
else {
result = false;
}
cur.close();
return result;
}
finally {
this.logger.traceLog("< leave autocommit getter");
}
}
set autocommit(value) {
this.logger.traceLog("> enter autocommit setter");
if (typeof value !== "boolean") {
throw new TypeError(`value unexpected type ${typeof value}`);
}
try {
const s = value ? "on" : "off";
const cur = this.cursor();
cur.execute("{fn teradata_nativesql}{fn teradata_autocommit_" + s + "}");
cur.close();
}
finally {
this.logger.traceLog("< leave autocommit setter");
}
}
cursor() {
return new teradata_cursor_1.TeradataCursor(this, this.lib, this.ref, this.byteArray);
}
connect(connectParams = {}, sJSON = "{}") {
const kwargs = { ...JSON.parse(sJSON) };
Object.keys(kwargs).forEach((key) => {
if (kwargs[key] === true) {
kwargs[key] = "true";
}
else if (kwargs[key] === false) {
kwargs[key] = "false";
}
});
const traceback = Error().stack;
let sFrame;
let sFrames = [];
let listFrames = [];
if (traceback) {
traceback.replace(path.sep, "/");
sFrames = traceback.split("\n at").slice(1);
for (const fr of sFrames) {
sFrame = fr.split("/").pop();
if (sFrame) {
sFrame = sFrame.split(":")[0];
if (!listFrames.includes(sFrame)) {
listFrames.push(sFrame);
}
}
}
}
if (process.platform === "win32") {
listFrames = listFrames.map((frame) => frame.split(" (C")[0].trim());
}
kwargs.client_kind = "S";
kwargs.client_vmname = "Node.js " + process.version;
kwargs.client_osname = os.version().split(":")[0] + " " + os.arch();
kwargs.client_stack = listFrames.join(" ");
kwargs.client_extra = "NODEJS=" + process.version + ";";
const combinedConnectParams = { ...connectParams, ...kwargs };
this.logLevel = combinedConnectParams.log ? Number(combinedConnectParams.log) : 0;
this.logger = new teradata_logging_1.TeradataLogging(this.logLevel);
this.logger.traceLog("> enter connect TeradataConnection");
try {
const jsgoFreePointer = this.lib.jsgoFreePointer;
const inputString = this.ref.allocCString(JSON.stringify(combinedConnectParams));
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.ulong);
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) {
const 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.traceLog("< leave connect TeradataConnection");
}
}
close() {
this.logger.traceLog("> enter close TeradataConnection");
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) {
const msg = this.ref.readCString(outputString);
jsgoFreePointer(this.uLog, outputString);
throw new teradata_exceptions_1.OperationalError(msg);
}
}
finally {
this.logger.traceLog("< leave close TeradataConnection");
}
}
cancel() {
this.logger.traceLog("> enter cancel TeradataConnection");
try {
const jsgoCancelRequest = this.lib.jsgoCancelRequest;
const jsgoFreePointer = this.lib.jsgoFreePointer;
const cStringPtrType = this.ref.refType(this.ref.types.char);
const outputPtrPtr = this.ref.alloc(cStringPtrType);
jsgoCancelRequest(this.uLog, this.poolHandle, outputPtrPtr);
let outputString = this.ref.allocCString("");
outputString = this.ref.deref(outputPtrPtr);
if (outputString.length > 0) {
const msg = this.ref.readCString(outputString);
jsgoFreePointer(this.uLog, outputString);
throw new teradata_exceptions_1.OperationalError(msg);
}
}
finally {
this.logger.traceLog("< leave cancel TeradataConnection");
}
}
commit() {
this.logger.traceLog("> enter commit TeradataConnection");
try {
this.cursor().execute("{fn teradata_commit}");
}
finally {
this.logger.traceLog("< leave commit TeradataConnection");
}
}
rollback() {
this.logger.traceLog("> enter rollback TeradataConnection");
try {
this.cursor().execute("{fn teradata_rollback}");
}
finally {
this.logger.traceLog("< leave rollback TeradataConnection");
}
}
}
exports.TeradataConnection = TeradataConnection;
//# sourceMappingURL=teradata-connection.js.map