ts-hdb
Version:
hdb driver with typescript
258 lines • 7.36 kB
JavaScript
;
/* 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