UNPKG

ts-hdb

Version:

hdb driver with typescript

258 lines 7.36 kB
"use strict"; /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable max-len */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (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.HDBClient = void 0; const Mutex_1 = require("@newdash/newdash/functional/Mutex"); const hdb = __importStar(require("hdb")); const node_util_1 = require("node:util"); const util_1 = require("util"); const Statement_1 = require("./Statement"); const utils_1 = require("./utils"); const logger = (0, util_1.debuglog)("hdb-client"); /** * HDB Client */ class HDBClient { /** * configurations */ #options; /** * mutex lock for single client */ #lock = new Mutex_1.Mutex(); /** * node-hdb native client */ #client; constructor(options) { this.#options = options; } async _connect() { if (this.#client === undefined) { const release = await this.#lock.acquire(); if (this.#client === undefined) { logger("connecting"); const client = hdb.createClient(this.#options); client.on("error", (err) => { logger(`hdb client error: ${(0, node_util_1.inspect)(err)}`); }); return new Promise((resolve, reject) => { client.connect((err) => { if (err) { logger(`connect error ${(0, node_util_1.inspect)(err)}`); reject(err); } else { logger("connected"); this.#client = client; resolve(this); } release(); }); }); } } return this; } /** * read state of connection */ get readyState() { return this.#client?.readyState; } /** * client of connection */ get clientId() { return this.#client?.clientId; } async exec(sql) { await this._connect(); return new Promise((resolve, reject) => { this.#client.exec(sql, (err, result) => { if (err) { reject(err); } else { resolve(result); } }); }); } async prepare(sql) { await this._connect(); return new Promise((resolve, reject) => { this.#client.prepare(sql, (err, stat) => { if (err) { reject(err); } else { resolve(new Statement_1.Statement(stat)); } }); }); } /** * If you use the execute function of the client or statement instead of the exec function, * a resultSet object is returned in the callback instead of an array of all rows. * * The resultSet object allows you to create an object based row stream or an array based stream of rows which can be piped to an writer object. * * Don't forget to **close** the resultSet if you use the execute function * * @param query * @returns */ async streamQuery(query) { await this._connect(); return new Promise((resolve, reject) => { this.#client.execute(query, (err, rs) => { if (err) { reject(err); } else { resolve(rs); } }); }); } /** * query object stream * * @param query * @returns async object iterator * * * @example * * ```ts * for await (const row of client.streamQueryObject(`SELECT ID, NAME FROM t1`)) { * expect(row.ID).not.toBeUndefined(); * expect(row.NAME).not.toBeUndefined(); * } * ``` * */ streamQueryObject(query) { return (0, utils_1.createAsyncStream)(this, "createObjectStream", [query]); } /** * query object list stream * * @param query * @returns async object iterator * * @example * * ```ts * for await (const rows of client.streamQueryObject(`SELECT ID, NAME FROM t1`)) { * expect(rows[0].ID).not.toBeUndefined(); * expect(rows[0].NAME).not.toBeUndefined(); * } * ``` * */ streamQueryList(query) { return (0, utils_1.createAsyncStream)(this, "createArrayStream", [query]); } /** * set auto commit * * @param autoCommit */ async setAutoCommit(autoCommit) { await this._connect(); this.#client.setAutoCommit(autoCommit); } /** * commit transaction * * @returns */ async commit() { await this._connect(); return new Promise((resolve, reject) => { this.#client.commit((err) => { if (err) { reject(err); } else { resolve(undefined); } }); }); } /** * rollback transaction * * @returns */ async rollback() { await this._connect(); return new Promise((resolve, reject) => { this.#client.rollback((err) => { if (err) { reject(err); } else { resolve(undefined); } }); }); } /** * disconnect form HANA server * * @returns */ async disconnect() { if (this.#client) { return new Promise((resolve, reject) => { this.#client.disconnect((err) => { if (err) { reject(err); } else { resolve(undefined); } }); }); } } /** * close TCP connection */ close() { if (this.#client !== undefined) { this.#client.close(); this.#client = undefined; } } } exports.HDBClient = HDBClient; //# sourceMappingURL=HDBClient.js.map