ali-rds-fix
Advanced tools
Comparing version 3.3.2 to 6.2.0
@@ -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" | ||
} |
199
README.md
@@ -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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
91919
2
21
1245
0
444
9
1
+ Added@types/mysql@^2.15.21
+ Added@types/mysql@2.15.26(transitive)
+ Added@types/node@22.13.1(transitive)
+ Addedundici-types@6.20.0(transitive)
- Removedco-wrap-all@^1.0.0
- Removeddebug@^2.2.0
- Removedpify@^2.3.0
- Removedco@4.6.0(transitive)
- Removedco-wrap-all@1.0.0(transitive)
- Removeddebug@2.6.9(transitive)
- Removedms@2.0.0(transitive)
- Removedpify@2.3.0(transitive)
Updatedmysql@^2.18.1