New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

ali-rds-fix

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ali-rds-fix - npm Package Compare versions

Comparing version 3.3.2 to 6.2.0

lib/channels.d.ts

427

lib/client.js

@@ -1,154 +0,285 @@

'use strict';
const util = require('util');
const mysql = require('mysql');
const wrap = require('co-wrap-all');
const Operator = require('./operator');
const RDSConnection = require('./connection');
const RDSTransaction = require('./transaction');
const promisify = require('pify');
module.exports = RDSClient;
module.exports.literals = require('./literals');
function RDSClient(options) {
if (!(this instanceof RDSClient)) {
return new RDSClient(options);
}
Operator.call(this);
this.pool = mysql.createPool(options);
[
'query',
'getConnection',
].forEach(method => {
this.pool[method] = promisify(this.pool[method]);
});
}
util.inherits(RDSClient, Operator);
const proto = RDSClient.prototype;
proto._query = function(sql) {
return this.pool.query(sql);
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
proto.getConnection = function() {
return this.pool.getConnection().then(onConnection, onError);
function onConnection(conn) {
return new RDSConnection(conn);
}
function onError(err) {
if (err.name === 'Error') {
err.name = 'RDSClientGetConnectionError';
Object.defineProperty(exports, "__esModule", { value: true });
exports.RDSClient = void 0;
const node_async_hooks_1 = require("node:async_hooks");
const node_util_1 = require("node:util");
const mysql_1 = __importDefault(require("mysql"));
const operator_1 = require("./operator");
const connection_1 = require("./connection");
const transaction_1 = require("./transaction");
const PoolConfig_1 = require("./PoolConfig");
const literals_1 = __importDefault(require("./literals"));
const channels_1 = __importDefault(require("./channels"));
class RDSClient extends operator_1.Operator {
static get literals() { return literals_1.default; }
static get escape() { return mysql_1.default.escape; }
static get escapeId() { return mysql_1.default.escapeId; }
static get format() { return mysql_1.default.format; }
static get raw() { return mysql_1.default.raw; }
static #DEFAULT_STORAGE_KEY = Symbol('RDSClient#storage#default');
static #TRANSACTION_NEST_COUNT = Symbol('RDSClient#transaction#nestCount');
#pool;
#connectionStorage;
#connectionStorageKey;
constructor(options) {
super();
const { connectionStorage, connectionStorageKey, ...mysqlOptions } = options;
// get connection options from getConnectionConfig method every time
if (mysqlOptions.getConnectionConfig) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const MySQLPool = require('mysql/lib/Pool');
this.#pool = new MySQLPool({
config: new PoolConfig_1.RDSPoolConfig(mysqlOptions, mysqlOptions.getConnectionConfig),
});
// override _needsChangeUser to return false
this.#pool._needsChangeUser = () => false;
}
else {
this.#pool = mysql_1.default.createPool(mysqlOptions);
}
[
'query',
'getConnection',
'end',
].forEach(method => {
this.#pool[method] = (0, node_util_1.promisify)(this.#pool[method]);
});
this.#connectionStorage = connectionStorage || new node_async_hooks_1.AsyncLocalStorage();
this.#connectionStorageKey = connectionStorageKey || RDSClient.#DEFAULT_STORAGE_KEY;
// https://github.com/mysqljs/mysql#pool-events
this.#pool.on('connection', (connection) => {
channels_1.default.connectionNew.publish({
client: this,
connection,
});
});
this.#pool.on('enqueue', () => {
channels_1.default.connectionEnqueue.publish({
client: this,
});
});
this.#pool.on('acquire', (connection) => {
channels_1.default.connectionAcquire.publish({
client: this,
connection,
});
});
this.#pool.on('release', (connection) => {
channels_1.default.connectionRelease.publish({
client: this,
connection,
});
});
}
throw err;
}
};
/**
* Begin a transaction
*
* @return {Transaction} transaction instance
*/
proto.beginTransaction = function* () {
const conn = yield this.getConnection();
try {
yield conn.beginTransaction();
} catch (err) {
conn.release();
throw err;
}
return new RDSTransaction(conn);
};
/**
* Auto commit or rollback on a transaction scope
*
* @param {Function} scope - scope with code
* @param {Object} [ctx] - transaction env context, like koa's ctx.
* To make sure only one active transaction on this ctx.
* @return {Object} - scope return result
*/
proto.beginTransactionScope = function* (scope, ctx) {
ctx = ctx || {};
if (!ctx._transactionConnection) {
ctx._transactionConnection = yield this.beginTransaction();
ctx._transactionScopeCount = 1;
} else {
ctx._transactionScopeCount++;
}
const tran = ctx._transactionConnection;
try {
const result = yield scope(tran);
ctx._transactionScopeCount--;
if (ctx._transactionScopeCount === 0) {
ctx._transactionConnection = null;
yield tran.commit();
async query(sql, values) {
const conn = await this.getConnection();
try {
return await conn.query(sql, values);
}
finally {
conn.release();
}
}
return result;
} catch (err) {
if (ctx._transactionConnection) {
ctx._transactionConnection = null;
yield tran.rollback();
get pool() {
return this.#pool;
}
throw err;
}
};
/**
* doomed to be rollbacked after transaction scope
* useful on writing test that depend on database
*
* @param {Function} scope - scope with code
* @param {Object} [ctx] - transaction env context, like koa's ctx.
* To make sure only one active transaction on this ctx.
* @return {Object} - scope return result
*/
proto.beginDoomedTransactionScope = function* (scope, ctx) {
ctx = ctx || {};
if (!ctx._transactionConnection) {
ctx._transactionConnection = yield this.beginTransaction();
ctx._transactionScopeCount = 1;
} else {
ctx._transactionScopeCount++;
}
const tran = ctx._transactionConnection;
try {
const result = yield scope(tran);
ctx._transactionScopeCount--;
if (ctx._transactionScopeCount === 0) {
ctx._transactionConnection = null;
get stats() {
return {
acquiringConnections: this.#pool._acquiringConnections.length,
allConnections: this.#pool._allConnections.length,
freeConnections: this.#pool._freeConnections.length,
connectionQueue: this.#pool._connectionQueue.length,
};
}
return result;
} catch (err) {
if (ctx._transactionConnection) {
ctx._transactionConnection = null;
async getConnection() {
try {
const _conn = await this.#pool.getConnection();
const conn = new connection_1.RDSConnection(_conn);
if (this.beforeQueryHandlers.length > 0) {
for (const handler of this.beforeQueryHandlers) {
conn.beforeQuery(handler);
}
}
if (this.afterQueryHandlers.length > 0) {
for (const handler of this.afterQueryHandlers) {
conn.afterQuery(handler);
}
}
return conn;
}
catch (err) {
if (err.name === 'Error') {
err.name = 'RDSClientGetConnectionError';
}
throw err;
}
}
throw err;
} finally {
yield tran.rollback();
}
};
proto.end = function(callback) {
// callback style
if (callback) {
return this.pool.end(callback);
}
// promise style
const that = this;
return new Promise(function(resolve, reject) {
that.pool.end(function(err) {
if (err) {
return reject(err);
}
resolve();
});
});
};
wrap(proto);
/**
* Begin a transaction
*
* @return {RDSTransaction} transaction instance
*/
async beginTransaction() {
const conn = await this.getConnection();
try {
await conn.beginTransaction();
}
catch (err) {
conn.release();
throw err;
}
const tran = new transaction_1.RDSTransaction(conn);
tran[RDSClient.#TRANSACTION_NEST_COUNT] = 1;
if (this.beforeQueryHandlers.length > 0) {
for (const handler of this.beforeQueryHandlers) {
tran.beforeQuery(handler);
}
}
if (this.afterQueryHandlers.length > 0) {
for (const handler of this.afterQueryHandlers) {
tran.afterQuery(handler);
}
}
return tran;
}
/**
* Auto commit or rollback on a transaction scope
*
* @param {Function} scope - scope with code
* @param {Object} [ctx] - transaction context
* @return {Object} - scope return result
*/
async #beginTransactionScope(scope, ctx) {
let tran;
let shouldRelease = false;
if (!ctx[this.#connectionStorageKey]) {
// there is no transaction in ctx, create a new one
tran = await this.beginTransaction();
ctx[this.#connectionStorageKey] = tran;
shouldRelease = true;
}
else {
// use transaction in ctx
tran = ctx[this.#connectionStorageKey];
tran[RDSClient.#TRANSACTION_NEST_COUNT]++;
}
let result;
let scopeError;
let internalError;
try {
result = await scope(tran);
}
catch (err) {
scopeError = err;
}
tran[RDSClient.#TRANSACTION_NEST_COUNT]--;
// null connection means the nested scope has been rollback, we can do nothing here
if (tran.conn) {
try {
// execution error, should rollback
if (scopeError) {
await tran.rollback();
}
else if (tran[RDSClient.#TRANSACTION_NEST_COUNT] < 1) {
// nestedCount smaller than 1 means all the nested scopes have executed successfully
await tran.commit();
}
}
catch (err) {
internalError = err;
}
}
// remove transaction in ctx
if (shouldRelease && tran[RDSClient.#TRANSACTION_NEST_COUNT] < 1) {
ctx[this.#connectionStorageKey] = null;
}
if (internalError) {
if (scopeError) {
internalError.cause = scopeError;
}
throw internalError;
}
if (scopeError) {
throw scopeError;
}
return result;
}
/**
* Auto commit or rollback on a transaction scope
*
* @param scope - scope with code
* @return {Object} - scope return result
*/
async beginTransactionScope(scope) {
let ctx = this.#connectionStorage.getStore();
if (ctx) {
return await this.#beginTransactionScope(scope, ctx);
}
ctx = {};
return await this.#connectionStorage.run(ctx, async () => {
return await this.#beginTransactionScope(scope, ctx);
});
}
/**
* doomed to be rollbacked after transaction scope
* useful on writing tests which are related with database
*
* @param scope - scope with code
* @param ctx - transaction context
* @return {Object} - scope return result
*/
async #beginDoomedTransactionScope(scope, ctx) {
let tran;
if (!ctx[this.#connectionStorageKey]) {
// there is no transaction in ctx, create a new one
tran = await this.beginTransaction();
ctx[this.#connectionStorageKey] = tran;
}
else {
// use transaction in ctx
tran = ctx[this.#connectionStorageKey];
tran[RDSClient.#TRANSACTION_NEST_COUNT]++;
}
try {
const result = await scope(tran);
tran[RDSClient.#TRANSACTION_NEST_COUNT]--;
if (tran[RDSClient.#TRANSACTION_NEST_COUNT] === 0) {
ctx[this.#connectionStorageKey] = null;
await tran.rollback();
}
return result;
}
catch (err) {
if (ctx[this.#connectionStorageKey]) {
ctx[this.#connectionStorageKey] = null;
await tran.rollback();
}
throw err;
}
}
/**
* doomed to be rollbacked after transaction scope
* useful on writing tests which are related with database
*
* @param scope - scope with code
* @return {Object} - scope return result
*/
async beginDoomedTransactionScope(scope) {
let ctx = this.#connectionStorage.getStore();
if (ctx) {
return await this.#beginDoomedTransactionScope(scope, ctx);
}
ctx = {};
return await this.#connectionStorage.run(ctx, async () => {
return await this.#beginDoomedTransactionScope(scope, ctx);
});
}
async end() {
await this.#pool.end();
}
}
exports.RDSClient = RDSClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBcUQ7QUFDckQseUNBQXNDO0FBQ3RDLGtEQUEwQjtBQUcxQix5Q0FBc0M7QUFDdEMsNkNBQTZDO0FBQzdDLCtDQUErQztBQUMvQyw2Q0FBNkM7QUFDN0MsMERBQWtDO0FBQ2xDLDBEQUFrQztBQWFsQyxNQUFhLFNBQVUsU0FBUSxtQkFBUTtJQUNyQyxNQUFNLEtBQUssUUFBUSxLQUFLLE9BQU8sa0JBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLE1BQU0sS0FBSyxPQUFPLGVBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sS0FBSyxRQUFRLEtBQUssT0FBTyxlQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxPQUFPLGVBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXRDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUNsRSxNQUFNLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFFM0UsS0FBSyxDQUFnQjtJQUNyQixrQkFBa0IsQ0FBd0M7SUFDMUQscUJBQXFCLENBQWtCO0lBRXZDLFlBQVksT0FBeUI7UUFDbkMsS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0Usb0VBQW9FO1FBQ3BFLElBQUksWUFBWSxDQUFDLG1CQUFtQixFQUFFO1lBQ3BDLDhEQUE4RDtZQUM5RCxNQUFNLFNBQVMsR0FBRyxP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

@@ -1,51 +0,41 @@

'use strict';
/**
* Module dependencies.
*/
const util = require('util');
const Operator = require('./operator');
const promisify = require('pify');
module.exports = RDSConnection;
function RDSConnection(conn) {
Operator.call(this);
this.conn = conn;
if (!conn._wrapToRDS) {
[
'query',
'beginTransaction',
'commit',
'rollback',
].forEach(key => {
this.conn[key] = promisify(this.conn[key]);
});
conn._wrapToRDS = true;
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RDSConnection = void 0;
const node_util_1 = require("node:util");
const operator_1 = require("./operator");
const kWrapToRDS = Symbol('kWrapToRDS');
class RDSConnection extends operator_1.Operator {
conn;
constructor(conn) {
super(conn);
this.conn = conn;
if (!this.conn[kWrapToRDS]) {
[
'query',
'beginTransaction',
'commit',
'rollback',
].forEach(key => {
this.conn[key] = (0, node_util_1.promisify)(this.conn[key]);
});
this.conn[kWrapToRDS] = true;
}
}
release() {
return this.conn.release();
}
async _query(sql) {
return await this.conn.query(sql);
}
async beginTransaction() {
return await this.conn.beginTransaction();
}
async commit() {
return await this.conn.commit();
}
async rollback() {
return await this.conn.rollback();
}
}
util.inherits(RDSConnection, Operator);
const proto = RDSConnection.prototype;
proto.release = function() {
this.conn.release();
};
proto._query = function(sql) {
return this.conn.query(sql);
};
proto.beginTransaction = function() {
return this.conn.beginTransaction();
};
proto.commit = function() {
return this.conn.commit();
};
proto.rollback = function() {
return this.conn.rollback();
};
exports.RDSConnection = RDSConnection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFzQztBQUN0Qyx5Q0FBc0M7QUFHdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDLE1BQWEsYUFBYyxTQUFRLG1CQUFRO0lBQ3pDLElBQUksQ0FBMEI7SUFDOUIsWUFBWSxJQUE2QjtRQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQjtnQkFDRSxPQUFPO2dCQUNQLGtCQUFrQjtnQkFDbEIsUUFBUTtnQkFDUixVQUFVO2FBQ1gsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLHFCQUFTLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQ3RCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTTtRQUNWLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQXJDRCxzQ0FxQ0MifQ==

@@ -1,20 +0,18 @@

'use strict';
/**
* Module dependencies.
*/
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Literal = void 0;
class Literal {
#text;
constructor(text) {
this.#text = text;
}
toString() {
return this.#text;
}
}
exports.Literal = Literal;
function Literal(text) {
if (!(this instanceof Literal)) {
return new Literal(text);
}
this.text = text;
}
Literal.prototype.toString = function() {
return this.text;
exports.default = {
now: new Literal('now()'),
Literal,
};
exports.now = new Literal('now()');
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl0ZXJhbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbGl0ZXJhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxPQUFPO0lBQ2xCLEtBQUssQ0FBUztJQUNkLFlBQVksSUFBWTtRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFURCwwQkFTQztBQUVELGtCQUFlO0lBQ2IsR0FBRyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUN6QixPQUFPO0NBQ1IsQ0FBQyJ9

@@ -1,392 +0,497 @@

'use strict';
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Operator = void 0;
const node_util_1 = require("node:util");
const sqlstring_1 = require("./sqlstring");
const literals_1 = __importDefault(require("./literals"));
const channels_1 = __importDefault(require("./channels"));
const debug = (0, node_util_1.debuglog)('ali-rds:operator');
/**
* Module dependencies.
*/
const debug = require('debug')('ali-rds:operator');
const SqlString = require('./sqlstring');
const literals = require('./literals');
const wrap = require('co-wrap-all');
module.exports = Operator;
/**
* Operator Interface
*/
function Operator() {}
const proto = Operator.prototype;
proto.literals = literals;
proto.escape = function(value, stringifyObjects, timeZone) {
return SqlString.escape(value, stringifyObjects, timeZone);
};
proto.escapeId = function(value, forbidQualified) {
return SqlString.escapeId(value, forbidQualified);
};
proto.format = function(sql, values, stringifyObjects, timeZone) {
// if values is object, not null, not Array;
if (!Array.isArray(values) && typeof values === 'object' && values !== null) {
// object not support replace column like ??;
return sql.replace(/\:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return SqlString.escape(values[key]);
}
// if values don't hasOwnProperty, return origin txt;
return txt;
});
}
return SqlString.format(sql, values, stringifyObjects, timeZone);
};
proto.query = function* (sql, values) {
// query(sql, values)
if (arguments.length >= 2) {
sql = this.format(sql, values);
}
debug('query %j', sql);
try {
const rows = yield this._query(sql);
debug('query get %d rows', rows.length);
return rows;
} catch (err) {
err.stack = err.stack + '\n sql: ' + sql;
debug('query error: %s', err);
throw err;
}
};
proto.queryOne = function* (sql, values) {
const rows = yield this.query(sql, values);
return rows && rows[0] || null;
};
proto._query = function(/* sql */) {
throw new Error('SubClass must impl this');
};
proto.count = function* (table, where) {
const sql = this.format('SELECT COUNT(*) as count FROM ??', [ table ]) +
this._where(where);
debug('count(%j, %j) \n=> %j', table, where, sql);
const rows = yield this.query(sql);
return rows[0].count;
};
/**
* Select rows from a table
*
* @param {String} table table name
* @param {Object} [options] optional params
* - {Object} where query condition object
* - {Array|String} columns select columns, default is `'*'`
* - {Array|String} orders result rows sort condition
* - {Number} limit result limit count, default is no limit
* - {Number} offset result offset, default is `0`
* @return {Array} result rows
*/
proto.select = function* (table, options) {
options = options || {};
const sql = this._selectColumns(table, options.columns) +
this._where(options.where) +
this._orders(options.orders) +
this._limit(options.limit, options.offset);
debug('select(%j, %j) \n=> %j', table, options, sql);
return yield this.query(sql);
};
proto.get = function* (table, where, options) {
options = options || {};
options.where = where;
options.limit = 1;
options.offset = 0;
const rows = yield this.select(table, options);
return rows && rows[0] || null;
};
proto.insert = function* (table, rows, options) {
options = options || {};
let firstObj;
// insert(table, rows)
if (Array.isArray(rows)) {
firstObj = rows[0];
} else {
// insert(table, row)
firstObj = rows;
rows = [ rows ];
}
if (!options.columns) {
options.columns = Object.keys(firstObj);
}
const params = [ table, options.columns ];
const strs = [];
for (let i = 0; i < rows.length; i++) {
const values = [];
const row = rows[i];
for (let j = 0; j < options.columns.length; j++) {
values.push(row[options.columns[j]]);
class Operator {
#connection;
constructor(connection) {
if (connection) {
this.#connection = connection;
}
}
strs.push('(?)');
params.push(values);
}
const sql = this.format('INSERT INTO ??(??) VALUES' + strs.join(', '), params);
debug('insert(%j, %j, %j) \n=> %j', table, rows, options, sql);
return yield this.query(sql);
};
proto.update = function* (table, row, options) {
options = options || {};
if (!options.columns) {
options.columns = Object.keys(row);
}
if (!options.where) {
if (!('id' in row)) {
throw new Error('Can not auto detect update condition, please set options.where, or make sure obj.id exists');
beforeQueryHandlers = [];
afterQueryHandlers = [];
get literals() { return literals_1.default; }
get threadId() {
return this.#connection?.threadId;
}
options.where = {
id: row.id,
};
}
const sets = [];
const values = [];
for (let i = 0; i < options.columns.length; i++) {
const column = options.columns[i];
sets.push('?? = ?');
values.push(column);
values.push(row[column]);
}
const sql = this.format('UPDATE ?? SET ', [ table ]) +
this.format(sets.join(', '), values) +
this._where(options.where);
debug('update(%j, %j, %j) \n=> %j', table, row, options, sql);
return yield this.query(sql);
};
/**
*
* Update multiple rows from a table
*
* UPDATE `table_name` SET
* `column1` CASE
* WHEN condition1 THEN 'value11'
* WHEN condition2 THEN 'value12'
* WHEN condition3 THEN 'value13'
* ELSE `column1` END,
* `column2` CASE
* WHEN condition1 THEN 'value21'
* WHEN condition2 THEN 'value22'
* WHEN condition3 THEN 'value23'
* ELSE `column2` END
* WHERE condition
*
* See MySQL Case Syntax: https://dev.mysql.com/doc/refman/5.7/en/case.html
*
* @param {String} table table name
* @param {Array<Object>} options Object Arrays
* each Object needs a primary key `id`, or each Object has `row` and `where` properties
* e.g.
* [{ id: 1, name: 'fengmk21' }]
* or [{ row: { name: 'fengmk21' }, where: { id: 1 } }]
* @return {object} update result
*/
proto.updateRows = function* (table, options) {
if (!Array.isArray(options)) {
throw new Error('Options should be array');
}
/**
* {
* column: {
* when: [ 'WHEN condition1 THEN ?', 'WHEN condition12 THEN ?' ],
* then: [ value1, value1 ]
* }
* }
*/
const SQL_CASE = {};
// e.g. { id: [], column: [] }
const WHERE = {};
options.forEach(option => {
if (!option.hasOwnProperty('id') && !(option.row && option.where)) {
throw new Error('Can not auto detect updateRows condition, please set option.row and option.where, or make sure option.id exists');
beforeQuery(beforeQueryHandler) {
this.beforeQueryHandlers.push(beforeQueryHandler);
}
// convert { id, column } to { row: { column }, where: { id } }
if (option.hasOwnProperty('id')) {
const where = { id: option.id };
const row = Object.keys(option).reduce((result, key) => {
if (key !== 'id') {
result[key] = option[key];
afterQuery(afterQueryHandler) {
this.afterQueryHandlers.push(afterQueryHandler);
}
escape(value, stringifyObjects, timeZone) {
return sqlstring_1.SqlString.escape(value, stringifyObjects, timeZone);
}
escapeId(value, forbidQualified) {
return sqlstring_1.SqlString.escapeId(value, forbidQualified);
}
format(sql, values, stringifyObjects, timeZone) {
// if values is object, not null, not Array;
if (!Array.isArray(values) && typeof values === 'object' && values !== null) {
// object not support replace column like ??;
return sql.replace(/\:(\w+)/g, (text, key) => {
if (values.hasOwnProperty(key)) {
return sqlstring_1.SqlString.escape(values[key]);
}
// if values don't hasOwnProperty, return origin text;
return text;
});
}
return result;
}, {});
option = { row, where };
return sqlstring_1.SqlString.format(sql, values, stringifyObjects, timeZone);
}
let where = this._where(option.where);
where = where.indexOf('WHERE') === -1 ? where : where.substring(where.indexOf('WHERE') + 5);
for (const key in option.row) {
if (!SQL_CASE[key]) {
SQL_CASE[key] = { when: [], then: [] };
}
SQL_CASE[key].when.push(' WHEN ' + where + ' THEN ? ');
SQL_CASE[key].then.push(option.row[key]);
async query(sql, values) {
// query(sql, values)
if (values) {
sql = this.format(sql, values);
}
if (this.beforeQueryHandlers.length > 0) {
for (const beforeQueryHandler of this.beforeQueryHandlers) {
const newSql = beforeQueryHandler(sql);
if (newSql) {
sql = newSql;
}
}
}
debug('[connection#%s] query %o', this.threadId, sql);
const queryStart = performance.now();
let rows;
let lastError;
channels_1.default.queryStart.publish({
sql,
connection: this.#connection,
});
try {
rows = await this._query(sql);
if (Array.isArray(rows)) {
debug('[connection#%s] query get %o rows', this.threadId, rows.length);
}
else {
debug('[connection#%s] query result: %o', this.threadId, rows);
}
return rows;
}
catch (err) {
lastError = err;
err.stack = `${err.stack}\n sql: ${sql}`;
debug('[connection#%s] query error: %o', this.threadId, err);
throw err;
}
finally {
const duration = Math.floor((performance.now() - queryStart) * 1000) / 1000;
channels_1.default.queryEnd.publish({
sql,
connection: this.#connection,
duration,
error: lastError,
});
if (this.afterQueryHandlers.length > 0) {
for (const afterQueryHandler of this.afterQueryHandlers) {
afterQueryHandler(sql, rows, duration, lastError);
}
}
}
}
for (const key in option.where) {
if (!WHERE[key]) {
WHERE[key] = [];
}
if (WHERE[key].indexOf(option.where[key]) === -1) {
WHERE[key].push(option.where[key]);
}
async queryOne(sql, values) {
const rows = await this.query(sql, values);
return rows && rows[0] || null;
}
});
let SQL = [ 'UPDATE ?? SET ' ];
let VALUES = [ table ];
const TEMPLATE = [];
for (const key in SQL_CASE) {
let templateSql = ' ?? = CASE ';
VALUES.push(key);
templateSql += SQL_CASE[key].when.join(' ');
VALUES = VALUES.concat(SQL_CASE[key].then);
templateSql += ' ELSE ?? END ';
TEMPLATE.push(templateSql);
VALUES.push(key);
}
SQL += TEMPLATE.join(' , ');
SQL += this._where(WHERE);
/**
* e.g.
*
* updateRows(table, [
* {id: 1, name: 'fengmk21', email: 'm@fengmk21.com'},
* {id: 2, name: 'fengmk22', email: 'm@fengmk22.com'},
* {id: 3, name: 'fengmk23', email: 'm@fengmk23.com'},
* ])
*
* UPDATE `ali-sdk-test-user` SET
* `name` =
* CASE
* WHEN `id` = 1 THEN 'fengmk21'
* WHEN `id` = 2 THEN 'fengmk22'
* WHEN `id` = 3 THEN 'fengmk23'
* ELSE `name` END,
* `email` =
* CASE
* WHEN `id` = 1 THEN 'm@fengmk21.com'
* WHEN `id` = 2 THEN 'm@fengmk22.com'
* WHEN `id` = 3 THEN 'm@fengmk23.com'
* ELSE `email` END
* WHERE `id` IN (1, 2, 3)
*/
const sql = this.format(SQL, VALUES);
debug('updateRows(%j, %j) \n=> %j', table, options, sql);
return yield this.query(sql);
};
proto.delete = function* (table, where) {
const sql = this.format('DELETE FROM ??', [ table ]) +
this._where(where);
debug('delete(%j, %j) \n=> %j', table, where, sql);
return yield this.query(sql);
};
proto._where = function(where) {
if (!where) {
return '';
}
const wheres = [];
const values = [];
for (const key in where) {
let value = where[key];
if (Array.isArray(value)) {
wheres.push('?? IN (?)');
} else {
if (value === null || value === undefined) {
wheres.push('?? IS ?');
} else {
if(typeof value == 'object' && value.operator){
wheres.push('?? '+value.operator+' ?');
value = value.value;
}else{
wheres.push('?? = ?');
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async _query(_sql) {
throw new Error('SubClass must impl this');
}
async count(table, where) {
const sql = this.format('SELECT COUNT(*) as count FROM ??', [table]) +
this._where(where);
debug('count(%j, %j) \n=> %j', table, where, sql);
const rows = await this.query(sql);
return rows[0].count;
}
/**
* Select rows from a table
*
* @param {String} table table name
* @param {Object} [option] optional params
* - {Object} where query condition object
* - {Array|String} columns select columns, default is `'*'`
* - {Array|String} orders result rows sort condition
* - {Number} limit result limit count, default is no limit
* - {Number} offset result offset, default is `0`
* @return {Array} result rows
*/
async select(table, option) {
option = option || {};
const sql = this._selectColumns(table, option.columns) +
this._where(option.where) +
this._orders(option.orders) +
this._limit(option.limit, option.offset);
debug('select(%o, %o) \n=> %o', table, option, sql);
return await this.query(sql);
}
async get(table, where, option) {
option = option || {};
option.where = where;
option.limit = 1;
option.offset = 0;
const rows = await this.select(table, option);
return rows && rows[0] || null;
}
async insert(table, rows, option) {
option = option || {};
let insertRows;
let firstObj;
// insert(table, rows)
if (Array.isArray(rows)) {
firstObj = rows[0];
insertRows = rows;
}
}
else {
// insert(table, row)
firstObj = rows;
insertRows = [rows];
}
if (!option.columns) {
option.columns = Object.keys(firstObj);
}
const params = [table, option.columns];
const strs = [];
for (const row of insertRows) {
const values = [];
for (const column of option.columns) {
values.push(row[column]);
}
strs.push('(?)');
params.push(values);
}
const sql = this.format('INSERT INTO ??(??) VALUES' + strs.join(', '), params);
debug('insert(%o, %o, %o) \n=> %o', table, rows, option, sql);
return await this.query(sql);
}
values.push(key);
values.push(value);
}
if (wheres.length > 0) {
return this.format(' WHERE ' + wheres.join(' AND '), values);
}
return '';
};
proto._selectColumns = function(table, columns) {
if (!columns) {
columns = '*';
}
let sql;
if (columns === '*') {
sql = this.format('SELECT * FROM ??', [ table ]);
} else {
sql = this.format('SELECT ?? FROM ??', [ columns, table ]);
}
return sql;
};
proto._orders = function(orders) {
if (!orders) {
return '';
}
if (typeof orders === 'string') {
orders = [ orders ];
}
const values = [];
for (let i = 0; i < orders.length; i++) {
const value = orders[i];
if (typeof value === 'string') {
values.push(this.escapeId(value));
} else if (Array.isArray(value)) {
// value format: ['name', 'desc'], ['name'], ['name', 'asc']
let sort = String(value[1]).toUpperCase();
if (sort !== 'ASC' && sort !== 'DESC') {
sort = null;
}
if (sort) {
values.push(this.escapeId(value[0]) + ' ' + sort);
} else {
values.push(this.escapeId(value[0]));
}
async update(table, row, option) {
option = option || {};
if (!option.columns) {
option.columns = Object.keys(row);
}
if (!option.where) {
if (!('id' in row)) {
throw new Error('Can not auto detect update condition, please set option.where, or make sure obj.id exists');
}
option.where = {
id: row.id,
};
}
const sets = [];
const values = [];
for (const column of option.columns) {
sets.push('?? = ?');
values.push(column);
values.push(row[column]);
}
const sql = this.format('UPDATE ?? SET ', [table]) +
this.format(sets.join(', '), values) +
this._where(option.where);
debug('update(%o, %o, %o) \n=> %o', table, row, option, sql);
return await this.query(sql);
}
}
return ' ORDER BY ' + values.join(', ');
};
proto._limit = function(limit, offset) {
if (!limit || typeof limit !== 'number') {
return '';
}
if (typeof offset !== 'number') {
offset = 0;
}
return ' LIMIT ' + offset + ', ' + limit;
};
wrap(proto);
/**
* Update multiple rows from a table
*
* UPDATE `table_name` SET
* `column1` CASE
* WHEN condition1 THEN 'value11'
* WHEN condition2 THEN 'value12'
* WHEN condition3 THEN 'value13'
* ELSE `column1` END,
* `column2` CASE
* WHEN condition1 THEN 'value21'
* WHEN condition2 THEN 'value22'
* WHEN condition3 THEN 'value23'
* ELSE `column2` END
* WHERE condition
*
* See MySQL Case Syntax: https://dev.mysql.com/doc/refman/5.7/en/case.html
*
* @param {String} table table name
* @param {Array<Object>} updateRows Object Arrays
* each Object needs a primary key `id`, or each Object has `row` and `where` properties
* e.g.
* [{ id: 1, name: 'fengmk21' }]
* or [{ row: { name: 'fengmk21' }, where: { id: 1 } }]
* @return {object} update result
*/
async updateRows(table, updateRows) {
if (!Array.isArray(updateRows)) {
throw new Error('updateRows should be array');
}
/**
* {
* column: {
* when: [ 'WHEN condition1 THEN ?', 'WHEN condition12 THEN ?' ],
* then: [ value1, value1 ]
* }
* }
*/
const SQL_CASE = {};
// e.g. { id: [], column: [] }
const WHERE = {};
for (const updateRow of updateRows) {
const row = updateRow.row ?? updateRow;
let where = updateRow.where;
const hasId = 'id' in row;
if (!hasId && !where) {
throw new Error('Can not auto detect updateRows condition, please set updateRow.where, or make sure updateRow.id exists');
}
// convert { id, column } to { row: { column }, where: { id } }
if (hasId) {
where = { id: updateRow.id };
}
let whereString = this._where(where);
whereString = !whereString.includes('WHERE') ? whereString : whereString.substring(whereString.indexOf('WHERE') + 5);
for (const key in row) {
if (key === 'id')
continue;
if (!SQL_CASE[key]) {
SQL_CASE[key] = { when: [], then: [] };
}
SQL_CASE[key].when.push(' WHEN ' + whereString + ' THEN ? ');
SQL_CASE[key].then.push(row[key]);
}
for (const key in where) {
if (!WHERE[key]) {
WHERE[key] = [];
}
if (!WHERE[key].includes(where[key])) {
WHERE[key].push(where[key]);
}
}
}
let SQL = 'UPDATE ?? SET ';
let VALUES = [table];
const TEMPLATE = [];
for (const key in SQL_CASE) {
let templateSql = ' ?? = CASE ';
VALUES.push(key);
templateSql += SQL_CASE[key].when.join(' ');
VALUES = VALUES.concat(SQL_CASE[key].then);
templateSql += ' ELSE ?? END ';
TEMPLATE.push(templateSql);
VALUES.push(key);
}
SQL += TEMPLATE.join(' , ');
SQL += this._where(WHERE);
/**
* e.g.
*
* updateRows(table, [
* {id: 1, name: 'fengmk21', email: 'm@fengmk21.com'},
* {id: 2, name: 'fengmk22', email: 'm@fengmk22.com'},
* {id: 3, name: 'fengmk23', email: 'm@fengmk23.com'},
* ])
*
* UPDATE `ali-sdk-test-user` SET
* `name` =
* CASE
* WHEN `id` = 1 THEN 'fengmk21'
* WHEN `id` = 2 THEN 'fengmk22'
* WHEN `id` = 3 THEN 'fengmk23'
* ELSE `name` END,
* `email` =
* CASE
* WHEN `id` = 1 THEN 'm@fengmk21.com'
* WHEN `id` = 2 THEN 'm@fengmk22.com'
* WHEN `id` = 3 THEN 'm@fengmk23.com'
* ELSE `email` END
* WHERE `id` IN (1, 2, 3)
*/
const sql = this.format(SQL, VALUES);
debug('updateRows(%o, %o) \n=> %o', table, updateRows, sql);
return await this.query(sql);
}
async delete(table, where) {
const sql = this.format('DELETE FROM ??', [table]) +
this._where(where);
debug('delete(%j, %j) \n=> %j', table, where, sql);
return await this.query(sql);
}
_where(where) {
if (!where) {
return '';
}
const wheres = [];
const values = [];
for (const key in where) {
const value = where[key];
if (Array.isArray(value)) {
wheres.push('?? IN (?)');
}
else if (typeof value === 'object' && !Array.isArray(value)) {
Object.keys(value).forEach(o => {
o = o.toLowerCase();
((o === 'like') && wheres.push('?? LIKE ?')) ||
((o === 'gte' || o === '>=') && wheres.push('?? >= ?')) ||
((o === 'gt' || o === '>') && wheres.push('?? > ?')) ||
((o === 'lte' || o === '<=') && wheres.push('?? <= ?')) ||
((o === 'lt' || o === '<') && wheres.push('?? < ?')) ||
((o === 'sql') && wheres.push('?? ?'));
values.push(key, value[o] || value);
});
}
else {
if (value === null || value === undefined) {
wheres.push('?? IS ?');
}
else {
wheres.push('?? = ?');
}
}
values.push(key);
values.push(value);
}
if (wheres.length > 0) {
return this.format(' WHERE ' + wheres.join(' AND '), values);
}
return '';
}
_selectColumns(table, columns) {
if (!columns || columns.length === 0) {
columns = '*';
}
if (columns === '*') {
return this.format('SELECT * FROM ??', [table]);
}
return this.format('SELECT ?? FROM ??', [columns, table]);
}
_orders(orders) {
if (!orders) {
return '';
}
if (typeof orders === 'string') {
orders = [orders];
}
const values = [];
for (const value of orders) {
if (typeof value === 'string') {
values.push(this.escapeId(value));
}
else if (Array.isArray(value)) {
// value format: ['name', 'desc'], ['name'], ['name', 'asc']
let sort = String(value[1]).toUpperCase();
if (sort !== 'ASC' && sort !== 'DESC') {
sort = '';
}
if (sort) {
values.push(this.escapeId(value[0]) + ' ' + sort);
}
else {
values.push(this.escapeId(value[0]));
}
}
}
return ' ORDER BY ' + values.join(', ');
}
_limit(limit, offset) {
if (!limit || typeof limit !== 'number') {
return '';
}
if (typeof offset !== 'number') {
offset = 0;
}
return ' LIMIT ' + offset + ', ' + limit;
}
/**
* Lock tables.
* @param {object[]} lockTableOptions table lock descriptions.
* @description
* LOCK TABLES
* tbl_name [[AS] alias] lock_type
* [, tbl_name [[AS] alias] lock_type] ...
* lock_type: {
* READ [LOCAL]
* | [LOW_PRIORITY] WRITE
* }
* For more details:
* https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
* @example
* await locks([{ tableName: 'posts', lockType: 'READ', tableAlias: 't' }]);
*/
async locks(lockTableOptions) {
const sql = this.#locks(lockTableOptions);
debug('lock tables \n=> %o', sql);
return await this.query(sql);
}
/**
* Lock a single table.
* @param {string} tableName table name
* @param {string} lockType lock type
* @param {string} tableAlias table alias
* @description
* LOCK TABLES
* tbl_name [[AS] alias] lock_type
* [, tbl_name [[AS] alias] lock_type] ...
* lock_type: {
* READ [LOCAL]
* | [LOW_PRIORITY] WRITE
* }
* For more details:
* https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
* @example
* await lockOne('posts_table', 'READ', 't'); // LOCK TABLS 'posts_table' AS t READ
*/
async lockOne(tableName, lockType, tableAlias) {
const sql = this.#locks([{ tableName, lockType, tableAlias }]);
debug('lock one table \n=> %o', sql);
return await this.query(sql);
}
#locks(lockTableOptions) {
if (lockTableOptions.length === 0) {
throw new Error('Cannot lock empty tables.');
}
let sql = 'LOCK TABLES ';
for (const [index, lockTableOption] of lockTableOptions.entries()) {
const { tableName, lockType, tableAlias } = lockTableOption;
if (!tableName) {
throw new Error('No table_name provided while trying to lock table');
}
if (!lockType) {
throw new Error('No lock_type provided while trying to lock table `' + tableName + '`');
}
if (!['READ', 'WRITE', 'READ LOCAL', 'LOW_PRIORITY WRITE'].includes(lockType.toUpperCase())) {
throw new Error('lock_type provided while trying to lock table `' + tableName +
'` must be one of the following(CASE INSENSITIVE):\n`READ` | `WRITE` | `READ LOCAL` | `LOW_PRIORITY WRITE`');
}
if (index > 0) {
sql += ', ';
}
sql += ' ' + this.escapeId(tableName) + ' ';
if (tableAlias) {
sql += ' AS ' + this.escapeId(tableAlias) + ' ';
}
sql += ' ' + lockType;
}
return sql + ';';
}
/**
* To unlock all tables locked in current session.
* For more details:
* https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
* @example
* await unlock(); // unlock all tables.
*/
async unlock() {
debug('unlock tables');
return await this.query('UNLOCK TABLES;');
}
}
exports.Operator = Operator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3BlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUNBQXFDO0FBQ3JDLDJDQUF3QztBQUN4QywwREFBa0M7QUFVbEMsMERBQWtDO0FBR2xDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBc0IsUUFBUTtJQUM1QixXQUFXLENBQTBCO0lBQ3JDLFlBQVksVUFBb0M7UUFDOUMsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFUyxtQkFBbUIsR0FBeUIsRUFBRSxDQUFDO0lBQy9DLGtCQUFrQixHQUF3QixFQUFFLENBQUM7SUFFdkQsSUFBSSxRQUFRLEtBQUssT0FBTyxrQkFBUSxDQUFDLENBQUMsQ0FBQztJQUVuQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxXQUFXLENBQUMsa0JBQXNDO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsVUFBVSxDQUFDLGlCQUFvQztRQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFVLEVBQUUsZ0JBQTBCLEVBQUUsUUFBaUI7UUFDOUQsT0FBTyxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVLEVBQUUsZUFBeUI7UUFDNUMsT0FBTyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxD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

@@ -1,21 +0,20 @@

'use strict';
/**
* Module dependencies.
*/
const SqlString = require('mysql/lib/protocol/SqlString');
const Literal = require('./literals').Literal;
module.exports = SqlString;
if (!SqlString.__escape) {
SqlString.__escape = SqlString.escape;
SqlString.escape = function(val, stringifyObjects, timeZone) {
if (val instanceof Literal) {
return val.toString();
}
return SqlString.__escape(val, stringifyObjects, timeZone);
};
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SqlString = void 0;
const SqlString_1 = __importDefault(require("mysql/lib/protocol/SqlString"));
exports.SqlString = SqlString_1.default;
const literals_1 = require("./literals");
const kEscape = Symbol('kEscape');
if (!SqlString_1.default[kEscape]) {
SqlString_1.default[kEscape] = SqlString_1.default.escape;
SqlString_1.default.escape = (val, stringifyObjects, timeZone) => {
if (val instanceof literals_1.Literal) {
return val.toString();
}
return SqlString_1.default[kEscape](val, stringifyObjects, timeZone);
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Fsc3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NxbHN0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2RUFBcUQ7QUFnQjVDLG9CQWhCRixtQkFBUyxDQWdCRTtBQWZsQix5Q0FBcUM7QUFFckMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRWxDLElBQUksQ0FBQyxtQkFBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ3ZCLG1CQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsbUJBQVMsQ0FBQyxNQUFNLENBQUM7SUFFdEMsbUJBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFRLEVBQUUsZ0JBQTBCLEVBQUUsUUFBaUIsRUFBRSxFQUFFO1FBQzdFLElBQUksR0FBRyxZQUFZLGtCQUFPLEVBQUU7WUFDMUIsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDdkI7UUFDRCxPQUFPLG1CQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQztDQUNIIn0=

@@ -1,54 +0,46 @@

'use strict';
/**
* Module dependencies.
*/
const util = require('util');
const wrap = require('co-wrap-all');
const Operator = require('./operator');
module.exports = RDSTransaction;
function RDSTransaction(conn) {
Operator.call(this);
this.conn = conn;
this.isCommit = false;
this.isRollback = false;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RDSTransaction = void 0;
const operator_1 = require("./operator");
class RDSTransaction extends operator_1.Operator {
isCommit = false;
isRollback = false;
conn;
constructor(conn) {
super(conn.conn);
this.conn = conn;
}
async commit() {
this.#check();
try {
return await this.conn.commit();
}
finally {
this.isCommit = true;
this.conn.release();
this.conn = null;
}
}
async rollback() {
this.#check();
try {
return await this.conn.rollback();
}
finally {
this.isRollback = true;
this.conn.release();
this.conn = null;
}
}
async _query(sql) {
this.#check();
return await this.conn._query(sql);
}
#check() {
if (!this.conn) {
throw new Error('transaction was commit or rollback');
}
}
}
util.inherits(RDSTransaction, Operator);
const proto = RDSTransaction.prototype;
proto.commit = function* () {
this._check();
try {
return yield this.conn.commit();
} finally {
this.conn.release();
this.conn = null;
}
};
proto.rollback = function* () {
this._check();
try {
return yield this.conn.rollback();
} finally {
this.conn.release();
this.conn = null;
}
};
proto._query = function* (sql) {
this._check();
return yield this.conn._query(sql);
};
proto._check = function() {
if (!this.conn) {
throw new Error('transaction was commit or rollback');
}
};
wrap(proto);
exports.RDSTransaction = RDSTransaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXNDO0FBRXRDLE1BQWEsY0FBZSxTQUFRLG1CQUFRO0lBQzFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLENBQXVCO0lBQzNCLFlBQVksSUFBbUI7UUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEM7Z0JBQVM7WUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSTtZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3BDO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0NBQ0Y7QUF6Q0Qsd0NBeUNDIn0=
{
"name": "ali-rds-fix",
"version": "3.3.2",
"version": "6.2.0",
"description": "Aliyun RDS client",
"main": "lib/client.js",
"types": "lib/client.d.ts",
"files": [

@@ -10,20 +11,24 @@ "lib"

"scripts": {
"test": "mocha -R spec -t 15000 -r thunk-mocha test/*.test.js",
"ci": "npm run lint && istanbul cover node_modules/mocha/bin/_mocha -- -t 15000 -r thunk-mocha test/*.test.js",
"lint": "eslint ."
"contributor": "git-contributor",
"test": "egg-bin test",
"ci": "npm run lint && egg-bin cov && npm run prepublishOnly",
"lint": "eslint src test --cache",
"build": "tsc -p ./tsconfig.json",
"clean": "tsc --build --clean",
"prepublishOnly": "npm run clean && npm run build"
},
"dependencies": {
"co-wrap-all": "^1.0.0",
"debug": "^2.2.0",
"mysql": "^2.13.0",
"pify": "^2.3.0"
"@types/mysql": "^2.15.21",
"mysql": "^2.18.1"
},
"devDependencies": {
"autod": "*",
"co": "4",
"eslint": "^3.19.0",
"eslint-config-egg": "^3.2.0",
"istanbul": "*",
"mocha": "*",
"thunk-mocha": "*"
"@eggjs/tsconfig": "^1.3.2",
"@types/mocha": "^10.0.1",
"@types/node": "^20.2.5",
"egg-bin": "^6.1.2",
"eslint": "^8.29.0",
"eslint-config-egg": "^12.1.0",
"git-contributor": "^2.0.0",
"mm": "^3.3.0",
"typescript": "^5.1.3"
},

@@ -33,17 +38,16 @@ "homepage": "https://github.com/ali-sdk/ali-rds",

"type": "git",
"url": "git://github.com/reruin/ali-rds.git",
"web": "https://github.com/reruin/ali-rds"
"url": "git://github.com/ali-sdk/ali-rds.git"
},
"bugs": {
"url": "https://github.com/ali-rds/ali-rds/issues",
"email": "fengmk2@gmail.com"
"url": "https://github.com/ali-sdk/ali-rds/issues"
},
"keywords": [
"ali-rds"
"ali-rds",
"mysql"
],
"engines": {
"node": ">= 4.0.0"
"node": ">= 16.17.0"
},
"author": "fengmk2 <fengmk2@gmail.com> (https://fengmk2.com)",
"author": "fengmk2 <fengmk2@gmail.com> (https://github.com/fengmk2)",
"license": "MIT"
}

@@ -1,8 +0,6 @@

ali-rds
=======
# ali-rds
[![NPM version][npm-image]][npm-url]
[![build status][travis-image]][travis-url]
[![Node.js CI](https://github.com/ali-sdk/ali-rds/actions/workflows/nodejs.yml/badge.svg)](https://github.com/ali-sdk/ali-rds/actions/workflows/nodejs.yml)
[![Test coverage][codecov-image]][codecov-url]
[![David deps][david-image]][david-url]
[![npm download][download-image]][download-url]

@@ -12,26 +10,20 @@

[npm-url]: https://npmjs.org/package/ali-rds
[travis-image]: https://img.shields.io/travis/ali-sdk/ali-rds.svg?style=flat-square
[travis-url]: https://travis-ci.org/ali-sdk/ali-rds
[codecov-image]: https://codecov.io/github/ali-sdk/ali-rds/coverage.svg?branch=master
[codecov-url]: https://codecov.io/github/ali-sdk/ali-rds?branch=master
[david-image]: https://img.shields.io/david/ali-sdk/ali-rds.svg?style=flat-square
[david-url]: https://david-dm.org/ali-sdk/ali-rds
[download-image]: https://img.shields.io/npm/dm/ali-rds.svg?style=flat-square
[download-url]: https://npmjs.org/package/ali-rds
Aliyun RDS client. Sub module of [ali-sdk](https://github.com/ali-sdk/ali-sdk).
Aliyun RDS client.
RDS, Relational Database Service. Equal to well know Amazon [RDS](http://aws.amazon.com/rds/).
# RDS Usage
Support `MySQL` protocol only.
RDS, Relational Database Service. Equal to well know Amazon [RDS](http://aws.amazon.com/rds/).
Support `MySQL`, `SQL Server` and `PostgreSQL`.
## Usage
## MySQL Usage
### Create RDS instance
```js
const rds = require('ali-rds');
```ts
import { RDSClient } from 'ali-rds';
const db = rds({
const db = new RDSClient({
host: 'your-rds-address.mysql.rds.aliyuncs.com',

@@ -42,3 +34,2 @@ port: 3306,

database: 'your-database-name',
// optional params

@@ -58,2 +49,6 @@ // The charset for the connection.

// queueLimit: 0,
// Set asyncLocalStorage manually for transaction
// connectionStorage: new AsyncLocalStorage(),
// If create multiple RDSClient instances with the same connectionStorage, use this key to distinguish between the instances
// connectionStorageKey: 'datasource',
});

@@ -67,3 +62,3 @@ ```

```js
let row = {
const row = {
name: 'fengmk2',

@@ -74,3 +69,3 @@ otherField: 'other field value',

};
let result = yield db.insert('table-name', row);
const result = await db.insert('table-name', row);
console.log(result);

@@ -92,3 +87,3 @@ { fieldCount: 0,

```js
let rows = [
const rows = [
{

@@ -109,3 +104,3 @@ name: 'fengmk1',

let results = yield db.insert('table-name', rows);
const results = await db.insert('table-name', rows);
console.log(result);

@@ -127,3 +122,3 @@ { fieldCount: 0,

```js
let row = {
const row = {
id: 123,

@@ -134,3 +129,3 @@ name: 'fengmk2',

};
let result = yield db.update('table-name', row);
const result = await db.update('table-name', row);
console.log(result);

@@ -150,3 +145,3 @@ { fieldCount: 0,

```js
let row = {
const row = {
name: 'fengmk2',

@@ -156,3 +151,3 @@ otherField: 'other field value',

};
let result = yield db.update('table-name', row, {
const result = await db.update('table-name', row, {
where: { name: row.name },

@@ -174,6 +169,6 @@ columns: [ 'otherField', 'modifiedAt' ]

- Update multiple rows with primary key: `id`
- Update multiple rows with primary key: `id`
```js
let options = [{
const options = [{
id: 123,

@@ -191,3 +186,3 @@ name: 'fengmk2',

}]
let result = yield db.updateRows('table-name', options);
const result = await db.updateRows('table-name', options);
console.log(result);

@@ -204,7 +199,6 @@ { fieldCount: 0,

- Update multiple rows with `row` and `where` properties
- Update multiple rows with `row` and `where` properties
```js
let options = [{
const options = [{
row: {

@@ -230,3 +224,3 @@ email: 'm@fengmk2.com',

}]
let result = yield db.updateRows('table-name', options);
const result = await db.updateRows('table-name', options);
console.log(result);

@@ -243,3 +237,2 @@ { fieldCount: 0,

### Get

@@ -250,3 +243,3 @@

```js
let row = yield db.get('table-name', { name: 'fengmk2' });
const row = await db.get('table-name', { name: 'fengmk2' });

@@ -261,3 +254,3 @@ => SELECT * FROM `table-name` WHERE `name` = 'fengmk2'

```js
let rows = yield db.select('table-name');
const rows = await db.select('table-name');

@@ -270,3 +263,3 @@ => SELECT * FROM `table-name`

```js
let rows = yield db.select('table-name', {
const rows = await db.select('table-name', {
where: {

@@ -288,3 +281,3 @@ type: 'javascript'

```js
let result = yield db.delete('table-name', {
const result = await db.delete('table-name', {
name: 'fengmk2'

@@ -301,3 +294,3 @@ });

```js
let count = yield db.count('table-name', {
const count = await db.count('table-name', {
type: 'javascript'

@@ -314,11 +307,11 @@ });

```js
let tran = yield db.beginTransaction();
const tran = await db.beginTransaction();
try {
yield tran.insert(table, row1);
yield tran.update(table, row2);
yield tran.commit();
await tran.insert(table, row1);
await tran.update(table, row2);
await tran.commit();
} catch (err) {
// error, rollback
yield tran.rollback(); // rollback call won't throw err
await tran.rollback(); // rollback call won't throw err
throw err;

@@ -330,3 +323,3 @@ }

API: `*beginTransactionScope(scope)`
API: `async beginTransactionScope(scope)`

@@ -337,6 +330,6 @@ All query run in scope will under a same transaction.

```js
var result = yield db.beginTransactionScope(function* (conn) {
const result = await db.beginTransactionScope(async conn => {
// don't commit or rollback by yourself
yield conn.insert(table, row1);
yield conn.update(table, row2);
await conn.insert(table, row1);
await conn.update(table, row2);
return { success: true };

@@ -347,24 +340,13 @@ });

#### Transaction on koa
In `Promise.all` case, Parallel beginTransactionScope will create isolated transactions.
API: `*beginTransactionScope(scope, ctx)`
Use koa's context to make sure only one active transaction on one ctx.
```js
function* foo(ctx, data1) {
return yield db.beginTransactionScope(function* (conn) {
yield conn.insert(table1, data1);
return { success: true };
}, ctx);
}
function* bar(ctx, data2) {
return yield db.beginTransactionScope(function* (conn) {
// execute foo with the same transaction scope
yield foo(ctx, { foo: 'bar' });
yield conn.insert(table2, data2);
return { success: true };
}, ctx);
}
const result = await Promise.all([
db.beginTransactionScope(async conn => {
// commit and success
}),
db.beginTransactionScope(async conn => {
// throw err and rollback
}),
])
```

@@ -377,3 +359,3 @@

```js
let rows = yield db.query('SELECT * FROM your_table LIMIT 100');
const rows = await db.query('SELECT * FROM your_table LIMIT 100');
console.log(rows);

@@ -385,3 +367,3 @@ ```

```js
let rows = yield db.query('SELECT * FROM your_table WHERE id=?', [ 123 ]);
const rows = await db.query('SELECT * FROM your_table WHERE id=?', [ 123 ]);
console.log(rows);

@@ -393,11 +375,18 @@ ```

```js
let rows = yield db.query('SELECT * FROM your_table WHERE id=:id', { id: 123 });
const rows = await db.query('SELECT * FROM your_table WHERE id=:id', { id: 123 });
console.log(rows);
```
## SQL Server Usage
### Custom query lifecircle
TBD
```ts
db.beforeQuery((sql: string) => {
// change sql string
return `/* add custom format here */ ${sql}`;
});
---
db.afterQuery((sql: string, result: any, execDuration: number, err?: Error) => {
// handle logger here
});
```

@@ -410,16 +399,16 @@ ## APIs

- *query(sql[, values)
- *queryOne(sql[, values)
- *select(table, options)
- *get(table, where, options)
- *insert(table, row[s], options)
- *update(table, row, options)
- *updateRows(table, options)
- *delete(table, where)
- *count(table, where)
- async query(sql[, values)
- async queryOne(sql[, values)
- async select(table, options)
- async get(table, where, options)
- async insert(table, row[s], options)
- async update(table, row, options)
- async updateRows(table, options)
- async delete(table, where)
- async count(table, where)
#### Transactions
### Transactions Helpers
- *beginTransaction()
- *beginTransactionScope(scope)
- async beginTransaction()
- async beginTransactionScope(scope)

@@ -435,3 +424,3 @@ ### Utils

```js
yield db.insert('user', {
await db.insert('user', {
name: 'fengmk2',

@@ -449,12 +438,22 @@ createdAt: db.literals.now,

```js
let session = new db.literals.Literal('session()');
const session = new db.literals.Literal('session()');
```
## TODO
## Class Relation
- [x] MySQL
- [x] Pool
- [ ] Cluster
- [ ] SQL Server
- [ ] PostgreSQL
```txt
+-----------+ +----------------+
| RDSClient +-- beginTransaction() --> + RDSTransaction |
+--+----+---+ +----+----+------+
| | getConnection() .conn | |
| | +---------------+ | |
| +-------->+ RDSConnection +<--------+ |
| +-------+-------+ |
| | extends |
| v |
| extends +-------+-------+ extends |
+------------->+ Operator +<-------------+
| query() |
+---------------+
```

@@ -464,1 +463,13 @@ ## License

[MIT](LICENSE)
<!-- GITCONTRIBUTOR_START -->
## Contributors
|[<img src="https://avatars.githubusercontent.com/u/156269?v=4" width="100px;"/><br/><sub><b>fengmk2</b></sub>](https://github.com/fengmk2)<br/>|[<img src="https://avatars.githubusercontent.com/u/985607?v=4" width="100px;"/><br/><sub><b>dead-horse</b></sub>](https://github.com/dead-horse)<br/>|[<img src="https://avatars.githubusercontent.com/u/32174276?v=4" width="100px;"/><br/><sub><b>semantic-release-bot</b></sub>](https://github.com/semantic-release-bot)<br/>|[<img src="https://avatars.githubusercontent.com/u/6587734?v=4" width="100px;"/><br/><sub><b>AntiMoron</b></sub>](https://github.com/AntiMoron)<br/>|[<img src="https://avatars.githubusercontent.com/u/10287125?v=4" width="100px;"/><br/><sub><b>nodejh</b></sub>](https://github.com/nodejh)<br/>|[<img src="https://avatars.githubusercontent.com/u/4192962?v=4" width="100px;"/><br/><sub><b>fangk</b></sub>](https://github.com/fangk)<br/>|
| :---: | :---: | :---: | :---: | :---: | :---: |
[<img src="https://avatars.githubusercontent.com/u/1619030?v=4" width="100px;"/><br/><sub><b>xujihui1985</b></sub>](https://github.com/xujihui1985)<br/>|[<img src="https://avatars.githubusercontent.com/u/1468366?v=4" width="100px;"/><br/><sub><b>csbun</b></sub>](https://github.com/csbun)<br/>|[<img src="https://avatars.githubusercontent.com/u/360661?v=4" width="100px;"/><br/><sub><b>popomore</b></sub>](https://github.com/popomore)<br/>|[<img src="https://avatars.githubusercontent.com/u/12378108?v=4" width="100px;"/><br/><sub><b>hoythan</b></sub>](https://github.com/hoythan)<br/>|[<img src="https://avatars.githubusercontent.com/u/35927028?v=4" width="100px;"/><br/><sub><b>deadhorse123</b></sub>](https://github.com/deadhorse123)<br/>|[<img src="https://avatars.githubusercontent.com/u/6897780?v=4" width="100px;"/><br/><sub><b>killagu</b></sub>](https://github.com/killagu)<br/>
This project follows the git-contributor [spec](https://github.com/xudafeng/git-contributor), auto updated at `Sat Mar 04 2023 18:57:33 GMT+0800`.
<!-- GITCONTRIBUTOR_END -->

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc