feat: add support for multiple insert in one query
BREAKING CHANGE drop nodejs v12 support and juggler v3 support Signed-off-by: Samarpan Bhattacharya <this.is.samy@gmail.com>
This commit is contained in:
parent
0d546359a7
commit
a3b354b7f4
|
@ -15,11 +15,11 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
node-version: [12, 14, 16]
|
||||
node-version: [14, 16]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- uses: ankane/setup-mysql@v1
|
||||
|
|
|
@ -4,4 +4,4 @@ coverage
|
|||
*.xml
|
||||
.loopbackrc
|
||||
.idea
|
||||
|
||||
.vscode
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "juggler-v3",
|
||||
"version": "3.0.0",
|
||||
"dependencies": {
|
||||
"loopback-datasource-juggler":"3.x",
|
||||
"should": "^8.4.0"
|
||||
}
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright IBM Corp. 2019. All Rights Reserved.
|
||||
// Node module: loopback-connector-mysql
|
||||
// This file is licensed under the MIT License.
|
||||
// License text available at https://opensource.org/licenses/MIT
|
||||
|
||||
'use strict';
|
||||
|
||||
const should = require('should');
|
||||
const juggler = require('loopback-datasource-juggler');
|
||||
const name = require('./package.json').name;
|
||||
|
||||
require('../../test/init');
|
||||
|
||||
describe(name, function() {
|
||||
before(function() {
|
||||
return global.resetDataSourceClass(juggler.DataSource);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
return global.resetDataSourceClass();
|
||||
});
|
||||
|
||||
require('loopback-datasource-juggler/test/common.batch.js');
|
||||
require('loopback-datasource-juggler/test/include.test.js');
|
||||
|
||||
// === Operation hooks ==== //
|
||||
|
||||
const suite = require('loopback-datasource-juggler/test/persistence-hooks.suite.js');
|
||||
const customConfig = Object.assign({}, global.config);
|
||||
suite(global.getDataSource(customConfig, juggler.DataSource), should, {replaceOrCreateReportsNewInstance: false});
|
||||
});
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "juggler-v4",
|
||||
"version": "4.0.0",
|
||||
"dependencies": {
|
||||
"loopback-datasource-juggler":"4.x",
|
||||
"should": "^13.2.3"
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
// Copyright IBM Corp. 2019. All Rights Reserved.
|
||||
// Node module: loopback-connector-mysql
|
||||
// This file is licensed under the MIT License.
|
||||
// License text available at https://opensource.org/licenses/MIT
|
||||
|
||||
'use strict';
|
||||
|
||||
const semver = require('semver');
|
||||
const should = require('should');
|
||||
const juggler = require('loopback-datasource-juggler');
|
||||
const name = require('./package.json').name;
|
||||
|
||||
require('../../test/init');
|
||||
|
||||
describe(name, function() {
|
||||
before(function() {
|
||||
return global.resetDataSourceClass(juggler.DataSource);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
return global.resetDataSourceClass();
|
||||
});
|
||||
|
||||
require('loopback-datasource-juggler/test/common.batch.js');
|
||||
require('loopback-datasource-juggler/test/include.test.js');
|
||||
|
||||
// === Operation hooks ==== //
|
||||
|
||||
const suite = require('loopback-datasource-juggler/test/persistence-hooks.suite.js');
|
||||
const customConfig = Object.assign({}, global.config);
|
||||
suite(global.getDataSource(customConfig, juggler.DataSource), should, {replaceOrCreateReportsNewInstance: false});
|
||||
});
|
16
lib/mysql.js
16
lib/mysql.js
|
@ -74,6 +74,8 @@ function MySQL(settings) {
|
|||
|
||||
require('util').inherits(MySQL, SqlConnector);
|
||||
|
||||
MySQL.prototype.multiInsertSupported = true;
|
||||
|
||||
MySQL.prototype.connect = function(callback) {
|
||||
const self = this;
|
||||
const options = generateOptions(this.settings);
|
||||
|
@ -324,6 +326,20 @@ MySQL.prototype.getInsertedId = function(model, info) {
|
|||
return insertedId;
|
||||
};
|
||||
|
||||
MySQL.prototype.getInsertedIds = function(model, info) {
|
||||
let insertedIds = [];
|
||||
const idProp = this.getDataSource(model).idProperty(model);
|
||||
if (info && info.affectedRows > 0) {
|
||||
insertedIds = new Array(info.affectedRows);
|
||||
for (let i = 0; i < info.affectedRows; i++) {
|
||||
insertedIds[i] = idProp.generated && typeof idProp.type() === 'number' &&
|
||||
typeof info.insertId === 'number' && info.insertId > 0 ?
|
||||
info.insertId + i : undefined;
|
||||
}
|
||||
}
|
||||
return insertedIds;
|
||||
};
|
||||
|
||||
/*!
|
||||
* Convert property name/value to an escaped DB column value
|
||||
* @param {Object} prop Property descriptor
|
||||
|
|
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
|
@ -3,13 +3,13 @@
|
|||
"version": "6.1.0",
|
||||
"description": "MySQL connector for loopback-datasource-juggler",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
"node": "14 || 16"
|
||||
},
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"pretest": "node pretest.js",
|
||||
"lint": "eslint .",
|
||||
"test": "mocha test/*.test.js node_modules/juggler-v3/test.js node_modules/juggler-v4/test.js",
|
||||
"test": "mocha test/*.test.js",
|
||||
"posttest": "npm run lint"
|
||||
},
|
||||
"files": [
|
||||
|
@ -23,21 +23,19 @@
|
|||
"async": "^3.2.0",
|
||||
"debug": "^4.1.1",
|
||||
"lodash": "^4.17.11",
|
||||
"loopback-connector": "^5.0.0",
|
||||
"loopback-connector": "^5.2.0",
|
||||
"mysql": "^2.11.1",
|
||||
"strong-globalize": "^6.0.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/config-conventional": "^12.1.4",
|
||||
"eslint": "^7.7.0",
|
||||
"eslint-config-loopback": "^13.1.0",
|
||||
"juggler-v3": "file:./deps/juggler-v3",
|
||||
"juggler-v4": "file:./deps/juggler-v4",
|
||||
"loopback-datasource-juggler": "^3.0.0 || ^4.0.0",
|
||||
"loopback-datasource-juggler": "^4.28.0",
|
||||
"mocha": "^8.1.2",
|
||||
"rc": "^1.0.0",
|
||||
"should": "^13.2.3",
|
||||
"sinon": "^9.0.3",
|
||||
"@commitlint/config-conventional": "^12.1.4"
|
||||
"sinon": "^9.0.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
@ -126,6 +126,60 @@ describe('mysql', function() {
|
|||
});
|
||||
});
|
||||
|
||||
it('createAll should create an array of instances', function(done) {
|
||||
Post.createAll([
|
||||
{title: 'Title 1', content: 'Content 1'},
|
||||
{title: 'Title 2', content: 'Content 2'},
|
||||
],
|
||||
function(err, posts) {
|
||||
should.not.exist(err);
|
||||
posts.should.be.an.Array;
|
||||
posts.should.have.lengthOf(2);
|
||||
posts[0].should.have.property('id');
|
||||
posts[0].id.should.be.a.Number;
|
||||
posts[0].title.should.be.equal('Title 1');
|
||||
posts[0].content.should.be.equal('Content 1');
|
||||
posts[1].should.have.property('id');
|
||||
posts[1].id.should.be.a.Number;
|
||||
posts[1].title.should.be.equal('Title 2');
|
||||
posts[1].content.should.be.equal('Content 2');
|
||||
|
||||
Post.findById(posts[0].id, function(er, p) {
|
||||
should.not.exist(er);
|
||||
p.id.should.be.equal(posts[0].id);
|
||||
p.content.should.be.equal(posts[0].content);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('createAll should create an array of instances even when id is not auto generated', function(done) {
|
||||
PostWithStringId.createAll([
|
||||
{id: '10', title: 'Title 1', content: 'Content 1'},
|
||||
{id: '20', title: 'Title 2', content: 'Content 2'},
|
||||
],
|
||||
function(err, posts) {
|
||||
should.not.exist(err);
|
||||
posts.should.be.an.Array;
|
||||
posts.should.have.lengthOf(2);
|
||||
posts[0].should.have.property('id');
|
||||
posts[0].id.should.be.a.String;
|
||||
posts[0].title.should.be.equal('Title 1');
|
||||
posts[0].content.should.be.equal('Content 1');
|
||||
posts[1].should.have.property('id');
|
||||
posts[1].id.should.be.a.String;
|
||||
posts[1].title.should.be.equal('Title 2');
|
||||
posts[1].content.should.be.equal('Content 2');
|
||||
|
||||
PostWithStringId.findById(posts[0].id, function(er, p) {
|
||||
should.not.exist(er);
|
||||
p.id.should.be.equal(posts[0].id);
|
||||
p.content.should.be.equal(posts[0].content);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('updateOrCreate should update the instance', function(done) {
|
||||
Post.create({title: 'a', content: 'AAA'}, function(err, post) {
|
||||
post.title = 'b';
|
||||
|
@ -716,7 +770,7 @@ describe('mysql', function() {
|
|||
Post.destroyAll(done);
|
||||
});
|
||||
beforeEach(function createTestFixtures(done) {
|
||||
Post.create([
|
||||
Post.createAll([
|
||||
{title: 'a', content: 'AAA'},
|
||||
{title: 'b', content: 'BBB'},
|
||||
], done);
|
||||
|
@ -928,7 +982,7 @@ describe('mysql', function() {
|
|||
Post.destroyAll(done);
|
||||
});
|
||||
beforeEach(function createTestFixtures(done) {
|
||||
Post.create([
|
||||
Post.createAll([
|
||||
{title: 'About Redis', content: 'Redis is a Database'},
|
||||
{title: 'Usage', content: 'How To Use MySQL database Well'},
|
||||
{title: 'About Mysql', content: 'Mysql is a database'},
|
||||
|
|
Loading…
Reference in New Issue