Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor date, timestamp and datetime data types handling #257

Merged
merged 11 commits into from
Apr 18, 2017

Conversation

darknos
Copy link
Contributor

@darknos darknos commented Apr 9, 2017

This is a continue of #170.

I propose more correct way (from my point of view) of handling DATE, TIMESTAMP and DATETIME types.

  1. Prevent double converting of date strings received from mysql server to js Date object using dateStrings: true setting for mysql connection.
  2. Add support for timezone settings for cases when MysqlServer timezone is different from local one.
  3. Add different handling of DATETIME and TIMESTAMP types as described in mysql documentation

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time. The time zone can be set on a per-connection basis. As long as the time zone setting remains constant, you get back the same value you store. If you store a TIMESTAMP value, and then change the time zone and retrieve the value, the retrieved value is different from the value you stored. This occurs because the same time zone was not used for conversion in both directions. The current time zone is available as the value of the time_zone system variable.

  1. Correct way of handling DATE type
  2. Ability to work with DATE, TIMESTAMP and DATETIME fields without any conversion (type:String instead of type:Date in property definition)
  3. Added unit tests to check all possible cases, different time zones, and date types.

Related issues

#170

Checklist

  • New tests added or existing tests modified to cover all changes
  • Code conforms with the style
    guide

connected to https://github.com/strongloop-internal/scrum-apex/issues/173

@darknos
Copy link
Contributor Author

darknos commented Apr 9, 2017

ping @ssh24

@slnode
Copy link

slnode commented Apr 9, 2017

Can one of the admins verify this patch? To accept patch and trigger a build add comment ".ok\W+to\W+test."

@slnode
Copy link

slnode commented Apr 9, 2017

Can one of the admins verify this patch?

2 similar comments
@slnode
Copy link

slnode commented Apr 9, 2017

Can one of the admins verify this patch?

@slnode
Copy link

slnode commented Apr 9, 2017

Can one of the admins verify this patch?

@ssh24 ssh24 force-pushed the master branch 2 times, most recently from a118455 to 1bb8e05 Compare April 9, 2017 23:26
@ssh24
Copy link
Contributor

ssh24 commented Apr 9, 2017

@slnode test please


var localTZ = getTimeZone();

describe('MySQL DATE, DATETTIME, TIMESTAMP types on server with local TZ', function() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move these two test cases all under one test file. For example in ./test/datatypes.test.js/.

});
});

it('should create table', function(done) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't have a test case for it. And instead of creating a table like this, create a loopback model directly and automigrate the model to the database. More on automigrate here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I create table via SQL to have a test field with DEFAULT CURRENT_TIMESTAMP:
timestampDefaultField timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,.

for this test case:

  it('timestampField shoud equal DEFAULT CURRENT_TIMESTAMP field', function(done) {
      DateModel.findOne({where: {id: 1}}, function(err, found) {
        assert.ok(!err);
        assert.equal(found.timestampField.toISOString(), found.timestampDefaultField.toISOString());
        done();
      });
  });

It is needed to be sure that time set on server side is the same as time we pass from new Date();

I know how to use auto migration but don't know how to create field with such defaults. I can do auto migrate and then query ALTER TABLE CHANGE timestampDefaultField timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP. Is it acceptable?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and, sure, I'll move it to setup section instead of test case

});
});

function setup(done) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't need any of these setup AFAIK. All the models/tables should be on the default database the test runs against.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I unified setup procedures for both test cases

@darknos
Copy link
Contributor Author

darknos commented Apr 10, 2017

Done. @ssh24, please review.

@ssh24
Copy link
Contributor

ssh24 commented Apr 10, 2017

@darknos Looks like loopback does not support timestamp and datetime as a data type as of yet. Look at the supported data types here. Those are specific to mysql and I am not sure if it is in our roadmap.

@raymondfeng Could you correct me if I am wrong?

@darknos
Copy link
Contributor Author

darknos commented Apr 10, 2017

Js Date type is mapped to mysql datetime, date or timestamp.

I use loopack on tens of clients project and in most cases in their databases were these three types. loopback has to support all of them.

id: {type: Number, id: 1, generated: true},
datetimeField: {type: Date, dataType: 'datetime', null: false},
timestampField: {type: Date, dataType: 'timestamp', null: false},
timestampDefaultField: {type: Date, dataType: 'timestamp', null: false},
Copy link
Contributor

@ssh24 ssh24 Apr 10, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@darknos You would need to change the dataType in that case here then. LoopBack does not support timestamp as an official data type. We support date which is the JavaScript date object. More info on docs.

Same for datetime as a data type.

Sorry totally ignore my comment. I thought for some reason you were invoking the loopback model with dataType timestamp.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://github.com/strongloop/loopback-connector-mysql/blob/master/README.md#loopback-to-mysql-types

Type mappings:
LoopBack to MySQL types
Date -> DATETIME

MySQL to LoopBack types
DATE,TIMESTAMP,DATETIME -> Date

I just want to make this mapping correct. Try my simple and clear test cases with current version of connector to see what is wrong.

Copy link
Contributor

@ssh24 ssh24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@darknos Code LGTM. I did some small cleanups. Please fix the rest of the code with the suggested changes. Make sure to pull the latest before committing any changes.

},
}, function(err, found) {
assert.ok(!err);
assert.ok(found);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could assert for something more than just found?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert.equal(found.id, 1); should be enough - we have to be sure that param of each type is working and found proper recored.

},
}, function(err, found) {
assert.ok(!err);
assert.ok(found);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. Assert more than just found

},
}, function(err, found) {
assert.ok(!err);
assert.ok(found);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. Assert more than just found

lib/mysql.js Outdated
} else if (prop.dataType == 'timestamp' || (prop.mysql && prop.mysql.dataType == 'timestamp')) {
var tz = this.client.config.connectionConfig.timezone;
return dateToMysql(val, tz);
} else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the else. Just return dateToMysql(val); is good.

lib/mysql.js Outdated
}

var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/);
if (m) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One liner for this should be fine: if (m) return (m[1] == '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60;

lib/mysql.js Outdated
} else {
tz = convertTimezone(tz);

if (tz !== false && tz !== 0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change this to: if (tz !== false && tz !== 0) dt.setTime(dt.getTime() + (tz * 60000));

@darknos
Copy link
Contributor Author

darknos commented Apr 11, 2017

Done. @ssh24 please review

});
});

it('should find model instance by date field passing string', function(done) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@darknos Test is failing locally for this. Why is this a valid test case to test for a dateField of type string when it expects a Date object?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All "where" parameters are passed normalize function of "juggler".
https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/dao.js#L1146
If property is one of type Date it does new Date(arg)
https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/dao.js#L1540

for DATE type test case will pass for timezones like my one (+xxxx):
"2016-12-22" -> "Thu Dec 22 2016 02:00:00 GMT+0200 (EET)"
but
will fail for (-xxxx) timezones:
"2016-12-22" -> "Thu Dec 21 2016 22:00:00 GMT-0200"

I'm going to remove this test case but I'd suggest to mean it in documentation.

Copy link
Contributor Author

@darknos darknos Apr 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a question how to pass where parameter to DATE field in different timezone via REST interface.

f.e. server is in GMT-6000 timezone and client is in GMT+2000 timezone. on client side we do:



var filter = {where:{dateFiled:new Date(2016,11,22)}};



it will pass as {"where":{"dateFiled":"2016-12-21T22:00:00.000Z"}}

and dao will convert it to date Wed Dec 21 2016 16:00:00 GMT-0600 (CST) and pass to SQL as 2016-12-21 and we got wrong result. :(

@@ -202,6 +217,18 @@ describe('MySQL DATE, DATETTIME, TIMESTAMP types on server with non local TZ (+0
});
});

it('should find model instance by date field passing string', function(done) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same reason here. Test is failing locally for this. Why is this a valid test case to test for a dateField of type string when it expects a Date object?

@ssh24 ssh24 self-assigned this Apr 11, 2017
@darknos
Copy link
Contributor Author

darknos commented Apr 11, 2017

It is a question how to pass where parameter to DATE field in different timezones via REST interface.

f.e. server is in GMT-6000 timezone and client is in GMT+2000 timezone. on client side we do:



var filter = {where:{dateFiled:new Date(2016,11,22)}};



it will pass via HTTP as {"where":{"dateFiled":"2016-12-21T22:00:00.000Z"}}
and dao will convert it to date Wed Dec 21 2016 16:00:00 GMT-0600 (CST) and pass to SQL as 2016-12-21 and we get wrong result. :(

@ssh24
Copy link
Contributor

ssh24 commented Apr 11, 2017

@darknos Not sure what you mean

it will pass via HTTP as {"where":{"dateFiled":"2016-12-21T22:00:00.000Z"}}
and dao will convert it to date Wed Dec 21 2016 16:00:00 GMT-0600 (CST) and pass to SQL as 2016-12-21 and we get wrong result

What is the wrong result?

@bbito
Copy link
Contributor

bbito commented Apr 11, 2017

I wish I had time right now to really look at the implications of this PR, but unfortunately I do not right now. I do want to comment that I'm concerned about forcing the mysql config: dateStrings: true since users could previously assume that mysql config settings in their datasources.json would be passed to the underlying mysql module. EDIT 20170418 - fix link:
https://github.com/strongloop/loopback-connector-mysql/blob/master/lib/mysql.js#L140
I also want to point to an issue I was involved with that I feel is closely related: https://github.com/strongloop/loopback-connector-mysql/issues/149
That issue identifies that this connector currently does not properly handle MySQL timezone settings and in fact currently stores and retrieves UTC. A fix is a breaking change because datetime comparisons between data created before and after such a fix will be incorrect because of the long-standing behavior of storing UTC despite the docs stating that the default is 'local'.

@darknos
Copy link
Contributor Author

darknos commented Apr 11, 2017

@darknos Not sure what you mean

it will pass via HTTP as {"where":{"dateFiled":"2016-12-21T22:00:00.000Z"}}
and dao will convert it to date Wed Dec 21 2016 16:00:00 GMT-0600 (CST) and pass to SQL as 2016-12-21 and we get wrong result

What is the wrong result?

Pretend we have field dateField with value "2016-12-22" stored in database and I want to get records with this value. I'll do

var filter = {where:{dateFiled:new Date(2016,11,22)}};



but it will execute SQL select * from table where dateField = ' 2016-12-21'

If server is in +0200 timezone and I'll do

var filter = {where:{dateFiled:'20160-12-22'}};



the SQL will be select * from table where dateField = ' 2016-12-22'

If server is in -0500 timezone
the SQL will be select * from table where dateField = ' 2016-12-21'

@darknos
Copy link
Contributor Author

darknos commented Apr 11, 2017

@bbito

That issue identifies that this connector currently does not properly handle MySQL timezone settings and in fact currently stores and retrieves UTC. A fix is a breaking change because datetime comparisons between data created before and after such a fix will be incorrect because of the long-standing behavior of storing UTC despite the docs stating that the default is 'local'.

this PR fixes timezone handling and makes difference between handling DATETIME and TIMESTAMP as described in MySQL documentation.

I found only one way to fix it - make only one conversion from mysql strings to js Date object and do it in the loopback connector but not on node-mysql side.

Probably there are another ways to fix it but I'd ask to keep test/date_types.test.js I made for it and even extend it if you have any ideas about other test cases. I guess you can get ideas of new test cases from #149

@bbito
Copy link
Contributor

bbito commented Apr 11, 2017

@darknos

makes difference between handling DATETIME and TIMESTAMP as described in MySQL documentation.

I don't think there should be a difference in the way this connector handles DATETIME vs TIMESTAMP:

#149 (comment)

@ssh24
Copy link
Contributor

ssh24 commented Apr 11, 2017

Still not sure what is the problem.

Pretend we have field dateField with value "2016-12-22" stored in database and I want to get records with this value. I'll do

var filter = {where:{dateFiled:new Date(2016,11,22)}};



but it will execute SQL select * from table where dateField = ' 2016-12-21'

Why should it execute SQL with dateField's date equal to 21? I am assuming the server is in GMT, and you are accessing it from somewhere GMT-x timezone?

@darknos
Copy link
Contributor Author

darknos commented Apr 12, 2017

@bbito

makes difference between handling DATETIME and TIMESTAMP as described in MySQL documentation.

I don't think there should be a difference in the way this connector handles DATETIME vs TIMESTAMP:
#149 (comment)

There is a simple way to see that the difference is present. It is described in my test cases.

  1. add the same value to DATETIME and TIMESTAMP field
  2. change @session.time_zone value
  3. retrieve values and mysql will return different values for these fields
mysql> create table test (dt  datetime, ts timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values ('2017-04-11 14:38:07', '2017-04-11 14:38:07');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2017-04-11 14:38:07 | 2017-04-11 14:38:07 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> set @@session.time_zone = '+05:30';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2017-04-11 14:38:07 | 2017-04-11 17:08:07 |
+---------------------+---------------------+
1 row in set (0.00 sec)

Just runt test/date_types.test.js with DEBUG=mysql to see mysql data packets.

@darknos
Copy link
Contributor Author

darknos commented Apr 12, 2017

Still not sure what is the problem.

Pretend we have field dateField with value "2016-12-22" stored in database and I want to get records with this value. I'll do
var filter = {where:{dateFiled:new Date(2016,11,22)}};


but it will execute SQL select * from table where dateField = ' 2016-12-21'

Why should it execute SQL with dateField's date equal to 21? I am assuming the server is in GMT, and you are accessing it from somewhere GMT-x timezone?

  1. in GMT+2 tz new Date(2016,11,22) will be converted to "2016-12-21T22:00:00.000Z"
  2. when loopback receive rest route to find it will "normalize" where statement
    https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/dao.js#L1146
    https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/dao.js#L1540
  3. if server is in GMT+0 - no problem. we'll get Wed Dec 22 2016 00:00:00 GMT and in loopback-connector-mysql, toColumnValue function will convert it to string 2016-12-22 and pass to mysql.
  4. BUT if server is not in UTC. (f.e. GMT-05:00 like when you started "strings" test case on your side) it will convert "2016-12-21T22:00:00.000Z" to Wed Dec 21 2016 00:00:00 GMT and toColumnValue function will convert it to string 2016-12-21.

this is connected only to WHERE not to INSERT or UPDATE

this is not issue but I'd suggest to describe it as "notice" in documentation.

@darknos
Copy link
Contributor Author

darknos commented Apr 21, 2017

@DaGaMs

We work with date time as below and I expect such behavior.

let date = new Date();
let dateString = date.toISOString();
DateModel.create({
     id: 1.
     datetimeField: date,
}, function(err, res) {
    DateModel.findOne({where:{dateField: date}, function(err, result) {
      //result.id == 1;
   }     
   //or
    DateModel.findOne({where:{dateField: dateString}, function(err, result) {
      //result.id == 1;
   }     
}

where do you suggest to specify explicit timezone?

@darknos
Copy link
Contributor Author

darknos commented Apr 21, 2017

I'm not sure that understand 'bizarre behavior'. In my TZ:

> console.log(new Date("2016-01-03 00:08:06"))
Sun Jan 03 2016 00:08:06 GMT+0200 (EET)
> console.log(new Date("2016-10-23 00:08:06"))
Sun Oct 23 2016 00:08:06 GMT+0300 (EEST)

one hour difference is Daylight Saving Time difference

> console.log(new Date("2016-01-03 00:08:06").toISOString())
2016-01-02T22:08:06.000Z
> console.log(new Date("2016-10-23 00:08:06").toISOString())
2016-10-22T21:08:06.000Z

@DaGaMs
Copy link
Contributor

DaGaMs commented Apr 21, 2017

I suggest that if you initialise a MySQL datasource with {timezone: "+04:00"}, then all DATETIME columns in the datasource should be assumed to be in that timezone. So, if I did a raw SELECT and got a value of 2016-04-12 11:23:00, I would assume that this is the same as 2016-04-12 07:23:00 UTC.

@darknos
Copy link
Contributor Author

darknos commented Apr 21, 2017

@DaGaMs So, do you just suggest to change this

//if datatype is timestamp and zimezone is not local - convert to proper timezone
if (tz !== 'local' && (prop.dataType == 'timestamp' || (prop.mysql && prop.mysql.dataType == 'timestamp'))) {
        dateString += ' ' + tz;
}

to this

//if   timezone is not local - convert to proper timezone
if (tz !== 'local') {
        dateString += ' ' + tz;
}

?

@DaGaMs
Copy link
Contributor

DaGaMs commented Apr 21, 2017

yes. And correspondingly also make sure that whatever gets written to the db is converted to the tz of the connection

@darknos
Copy link
Contributor Author

darknos commented Apr 21, 2017

sure:

 } else if (prop.dataType == 'timestamp' || (prop.mysql && prop.mysql.dataType == 'timestamp')) {
    var tz = this.client.config.connectionConfig.timezone;
    return dateToMysql(val, tz);
}
return dateToMysql(val);

to

    return dateToMysql(val, this.client.config.connectionConfig.timezone);

@darknos
Copy link
Contributor Author

darknos commented Apr 21, 2017

@DaGaMs
iPublisherUA@fdda36d

all tests are passed.

@DaGaMs
Copy link
Contributor

DaGaMs commented Apr 21, 2017

I had test failures with your branch, strangely. Here is a branch where all tests are passing for me:

DaGaMs@f947c1a

@bbito
Copy link
Contributor

bbito commented Apr 21, 2017

Should discussion about this (loopback-connector-mysql date / time zone issues) continue here or at #149?

@superkhau
Copy link
Contributor

I think @darknos should open up a PR with the legacyBehaviour flag mentioned above and we can reference this issue and #149 to that PR for the fixup and release ASAP so you and @DaGaMs can get their fixes right away with an immediate publish.

cc @ssh24 @kjdelisle

@bbito
Copy link
Contributor

bbito commented Apr 21, 2017

Hey @superkhau , I don't have a 'fix' ready to go. My feeling is that this (#257) goes in the opposite direction from what was discussed at #149 where I was suggesting removing all the code converting dates to UTC and just handing off and receiving js Date objects to/from the underlying mysql module. I do have a fork with that stuff removed that works fine in my limited testing, but I don't have any legacy fallback or the docs for upgrading. This (#257) goes completely the other way and forces the underlying module to produce String values for all date types.

@superkhau
Copy link
Contributor

superkhau commented Apr 22, 2017

@bbito I hear your concern. Maybe the simplest route is to revert #257 and continue the discussion at #149.

My feeling is we need to do:

  • Add a compatibility flag allowing users to opt into old behaviour - this will simplify upgrade from the current version of the connector
  • Provide documentation on how to upgrade data stored in MySQL from the UTC format to the new format, to allow users to eventually switch off the compat flag.

as suggested by @bajtos at #149

Then in a subsequent PR (after continuing some discussion at #149):

  • Change the default behaviour of this connector to match the suggestions in the MySQL documentation
  • Release the changes as a new major version of the connector

Thoughts?

@bbito
Copy link
Contributor

bbito commented Apr 22, 2017

@superkhau That sound best to me! I think what we came up with at #149 was a solid plan.

@DaGaMs
Copy link
Contributor

DaGaMs commented Apr 22, 2017

@superkhau I'm pretty sure that with the updated code (after @darknos and my discussion yesterday) the "compatibility setting" would simply be to make "timezone": "+00:00" the default for all connections. Then all dates going in and out of the db would be interpreted as UTC, AFAICS.

@DaGaMs
Copy link
Contributor

DaGaMs commented Apr 22, 2017

@bbito I'm not sure I agree any more with the idea of leaving all date casting to javascript. In that case, a change in the timezone setting of the server that the loopback instance runs on would change the interpretation of the data. I prefer the more "explicit" setting in the datasource.json file, so it's totally clear that all dates that go in and come out of the database are in a specific timezone (and UTC is a very sensible default ;-) )

@darknos
Copy link
Contributor Author

darknos commented Apr 22, 2017

@superkhau, @ssh24 , @DaGaMs I added new PR: #265 and I'll wait for your decision.

@ssh24
Copy link
Contributor

ssh24 commented Apr 22, 2017

Following up on the discussion between @darknos and @DaGaMs, I am okay with the idea of enabling a flag to allow the previous behavior and the new behavior. If the fixes on #265 are sensible, this PR does not need to be reverted.

@bbito
Copy link
Contributor

bbito commented Apr 24, 2017

@DaGaMs

I prefer the more "explicit" setting in the datasource.json file

I completely agree and this was the crux of #149 (comment). Any fix must honor "timezone":"..." in datasources.json unless the proposed legacy compatibility flag is set in which case the module should continue to ignore the timezone set in datasources. I currently have legacy compatibility default to true - so one needs to opt-in to new behavior, but I'm fine with either true or false for default.

ssh24 pushed a commit that referenced this pull request Apr 24, 2017
ssh24 pushed a commit that referenced this pull request Apr 24, 2017
@ssh24
Copy link
Contributor

ssh24 commented Apr 24, 2017

Reverting this PR as it is a breaking change for other users. Please follow #149 as we try to come up with a cleaner solution.

ssh24 pushed a commit that referenced this pull request Apr 24, 2017
@darknos
Copy link
Contributor Author

darknos commented Apr 24, 2017

got it. after all discussions I see that the best way is to keep own fork of the connector. :(

bbito added a commit to bbito/loopback-connector-mysql that referenced this pull request Apr 25, 2017
bbito pushed a commit to bbito/loopback-connector-mysql that referenced this pull request Apr 25, 2017
kjdelisle pushed a commit that referenced this pull request May 2, 2017
 * Tests for datetime types (Kevin Delisle)
 * Add new type DateString to fromColumnValue (Buck Bito)
 * Remove String manipulations of Date objects (Buck Bito)
 * Properties with mysql custom "columnName" don't get autoupdated (#273) (Sergey Nosenko)
 * Revert PR #257 (#266) (Sakib Hasan)
 * Fix async.each in migration (#262) (Benjamin Schuster-Boeckler)
 * refactor date, timestamp and datetime data types handling (#257) (Sergey Nosenko)
 * Fix too many connection error (#261) (Sakib Hasan)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants