Skip to content

Commit

Permalink
0.1.10: Rapidly calling change method no longer causes error
Browse files Browse the repository at this point in the history
Transferred from numtel:pg package source
Thanks to numtel/meteor-pg#6
  • Loading branch information
numtel committed Jul 14, 2015
1 parent 44929ab commit 090635b
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 67 deletions.
4 changes: 2 additions & 2 deletions .versions
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ jquery@1.11.3_2
json@1.0.3
keyboardjs:keyboardjs@0.4.2_1
less@1.0.14
local-test:numtel:mysql@0.1.9
local-test:numtel:mysql@0.1.10
logging@1.0.7
meteor@1.1.6
minifiers@1.1.5
minimongo@1.0.8
mongo@1.1.0
numtel:benchmark-packages@0.0.1
numtel:mysql@0.1.9
numtel:mysql@0.1.10
observe-sequence@1.0.6
ordered-dict@1.0.3
random@1.0.3
Expand Down
124 changes: 62 additions & 62 deletions lib/MysqlSubscription.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,73 +52,73 @@ MysqlSubscription = function(connection, name /* arguments */){
if(_.filter(buffer, function(sub){
return sub.name === name && sub.connection === connection;
}).length === 1){
registerStore(connection, name);
}

};

var registerStore = function(connection, name){
connection.registerStore(name, {
beginUpdate: function(){},
update: function(msg){
var subBuffer = _.filter(buffer, function(sub){
return sub.subscriptionId === msg.id;
})[0];
var sub = subBuffer.instance;

if(msg.msg === 'added' &&
msg.fields && msg.fields.reset === true){
// This message indicates a reset of a result set
if(subBuffer.resetOnDiff === false){
sub.dispatchEvent('reset', msg);
sub.splice(0, sub.length);
}
}else if(msg.msg === 'added' &&
msg.fields && 'diff' in msg.fields){
// Aggregation of changes has arrived
connection.registerStore(name, {
update: function(msg){
var subBuffers = _.filter(buffer, function(sub){
return sub.subscriptionId === msg.id;
});

if(subBuffer.resetOnDiff === true){
sub.splice(0, sub.length);
subBuffer.resetOnDiff = false;
}
// If no existing subscriptions match this message's subscriptionId,
// discard message as it is most likely due to a subscription that has
// been destroyed.
// See test/MysqlSubscription :: Quick Change test cases
if(subBuffers.length === 0) return;

var subBuffer = subBuffers[0];
var sub = subBuffer.instance;

if(msg.msg === 'added' &&
msg.fields && msg.fields.reset === true){
// This message indicates a reset of a result set
if(subBuffer.resetOnDiff === false){
sub.dispatchEvent('reset', msg);
sub.splice(0, sub.length);
}
}else if(msg.msg === 'added' &&
msg.fields && 'diff' in msg.fields){
// Aggregation of changes has arrived

msg.fields.diff.forEach(function(event){
var index = event.pop();
var oldRow;
if(subBuffer.resetOnDiff === true){
sub.splice(0, sub.length);
subBuffer.resetOnDiff = false;
}

// Provide generic update event
sub.dispatchEvent('update', index, {
msg: event[0],
collection: msg.collection,
id: msg.id,
fields: event[0] === 'update' ? event[2] : event[1]
msg.fields.diff.forEach(function(event){
var index = event.pop();
var oldRow;

// Provide generic update event
sub.dispatchEvent('update', index, {
msg: event[0],
collection: msg.collection,
id: msg.id,
fields: event[0] === 'update' ? event[2] : event[1]
});

// Provide specific change event and perform change
switch(event[0]){
case 'added':
sub.splice(index, 0, event[1]);
sub.dispatchEvent(event[0], index, event[1]);
break;
case 'changed':
oldRow = _.clone(sub[index]);
sub[index] = _.extend(sub[index], event[2]);
sub.dispatchEvent(event[0], index, oldRow, sub[index]);
break;
case 'removed':
oldRow = _.clone(sub[index]);
sub.splice(index, 1);
sub.dispatchEvent(event[0], index, oldRow);
break;
}
});

// Provide specific change event and perform change
switch(event[0]){
case 'added':
sub.splice(index, 0, event[1]);
sub.dispatchEvent(event[0], index, event[1]);
break;
case 'changed':
oldRow = _.clone(sub[index]);
sub[index] = _.extend(sub[index], event[2]);
sub.dispatchEvent(event[0], index, oldRow, sub[index]);
break;
case 'removed':
oldRow = _.clone(sub[index]);
sub.splice(index, 1);
sub.dispatchEvent(event[0], index, oldRow);
break;
}
});
}
sub.changed();
}
sub.changed();
},
endUpdate: function(){},
saveOriginals: function(){},
retrieveOriginals: function(){}
});
});
}

};

// Inherit from Array and Tracker.Dependency
Expand Down
2 changes: 1 addition & 1 deletion package.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package.describe({
name: 'numtel:mysql',
summary: 'MySQL support with Reactive Select Subscriptions',
version: '0.1.9',
version: '0.1.10',
git: 'https://github.com/numtel/meteor-mysql.git'
});

Expand Down
51 changes: 49 additions & 2 deletions test/MysqlSubscription.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ function(test, done){
// Limit players sub to 0 row
players.change(0);
test.isFalse(players.ready());

Meteor.setTimeout(function() {
test.equal(players.length, 0);
test.isTrue(players.ready());
Expand All @@ -282,7 +282,7 @@ function(test, done){
// Limit players sub to 1 row
players.change(1);
test.isFalse(players.ready());

Meteor.setTimeout(function() {
test.equal(players.length, 1);
test.isTrue(players.ready());
Expand All @@ -296,3 +296,50 @@ function(test, done){
}, POLL_WAIT);
}, POLL_WAIT);
});


Tinytest.addAsync(SUITE_PREFIX + 'Quick Change Synchronously',
function(test, done){
// Change players sub multiple times synchronously
for (var i = 0; i < 10; i++) {
players.change(i);
}

// Reset to original state
players.change();

Meteor.setTimeout(function () {
test.equal(players.length, expectedRows.length);
done();
}, POLL_WAIT);
});

Tinytest.addAsync(SUITE_PREFIX + 'Quick Change Asynchronously',
function(test, done){
// How many times to change sub arguments?
var LIMIT_MAX = 10;
// Milliseconds between each change
var CHANGE_TIMEOUT = 5;
// Change players sub multiple times asynchronously
var limitArg = 0;

var nextChange = function() {
// Change to the next state, without necessarily waiting for it to be ready
if(limitArg < LIMIT_MAX) {
limitArg++;

players.change(limitArg);
Meteor.setTimeout(nextChange, CHANGE_TIMEOUT);
} else {
// At end of possible states
// Reset to original state
players.change();

Meteor.setTimeout(function () {
test.equal(players.length, expectedRows.length);
done();
}, POLL_WAIT);
}
};
nextChange();
});

0 comments on commit 090635b

Please sign in to comment.