Skip to content

Commit 090635b

Browse files
committed
0.1.10: Rapidly calling change method no longer causes error
Transferred from numtel:pg package source Thanks to numtel/meteor-pg#6
1 parent 44929ab commit 090635b

File tree

4 files changed

+114
-67
lines changed

4 files changed

+114
-67
lines changed

.versions

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ jquery@1.11.3_2
2020
json@1.0.3
2121
keyboardjs:keyboardjs@0.4.2_1
2222
less@1.0.14
23-
local-test:numtel:mysql@0.1.9
23+
local-test:numtel:mysql@0.1.10
2424
logging@1.0.7
2525
meteor@1.1.6
2626
minifiers@1.1.5
2727
minimongo@1.0.8
2828
mongo@1.1.0
2929
numtel:benchmark-packages@0.0.1
30-
numtel:mysql@0.1.9
30+
numtel:mysql@0.1.10
3131
observe-sequence@1.0.6
3232
ordered-dict@1.0.3
3333
random@1.0.3

lib/MysqlSubscription.js

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -52,73 +52,73 @@ MysqlSubscription = function(connection, name /* arguments */){
5252
if(_.filter(buffer, function(sub){
5353
return sub.name === name && sub.connection === connection;
5454
}).length === 1){
55-
registerStore(connection, name);
56-
}
57-
58-
};
59-
60-
var registerStore = function(connection, name){
61-
connection.registerStore(name, {
62-
beginUpdate: function(){},
63-
update: function(msg){
64-
var subBuffer = _.filter(buffer, function(sub){
65-
return sub.subscriptionId === msg.id;
66-
})[0];
67-
var sub = subBuffer.instance;
68-
69-
if(msg.msg === 'added' &&
70-
msg.fields && msg.fields.reset === true){
71-
// This message indicates a reset of a result set
72-
if(subBuffer.resetOnDiff === false){
73-
sub.dispatchEvent('reset', msg);
74-
sub.splice(0, sub.length);
75-
}
76-
}else if(msg.msg === 'added' &&
77-
msg.fields && 'diff' in msg.fields){
78-
// Aggregation of changes has arrived
55+
connection.registerStore(name, {
56+
update: function(msg){
57+
var subBuffers = _.filter(buffer, function(sub){
58+
return sub.subscriptionId === msg.id;
59+
});
7960

80-
if(subBuffer.resetOnDiff === true){
81-
sub.splice(0, sub.length);
82-
subBuffer.resetOnDiff = false;
83-
}
61+
// If no existing subscriptions match this message's subscriptionId,
62+
// discard message as it is most likely due to a subscription that has
63+
// been destroyed.
64+
// See test/MysqlSubscription :: Quick Change test cases
65+
if(subBuffers.length === 0) return;
66+
67+
var subBuffer = subBuffers[0];
68+
var sub = subBuffer.instance;
69+
70+
if(msg.msg === 'added' &&
71+
msg.fields && msg.fields.reset === true){
72+
// This message indicates a reset of a result set
73+
if(subBuffer.resetOnDiff === false){
74+
sub.dispatchEvent('reset', msg);
75+
sub.splice(0, sub.length);
76+
}
77+
}else if(msg.msg === 'added' &&
78+
msg.fields && 'diff' in msg.fields){
79+
// Aggregation of changes has arrived
8480

85-
msg.fields.diff.forEach(function(event){
86-
var index = event.pop();
87-
var oldRow;
81+
if(subBuffer.resetOnDiff === true){
82+
sub.splice(0, sub.length);
83+
subBuffer.resetOnDiff = false;
84+
}
8885

89-
// Provide generic update event
90-
sub.dispatchEvent('update', index, {
91-
msg: event[0],
92-
collection: msg.collection,
93-
id: msg.id,
94-
fields: event[0] === 'update' ? event[2] : event[1]
86+
msg.fields.diff.forEach(function(event){
87+
var index = event.pop();
88+
var oldRow;
89+
90+
// Provide generic update event
91+
sub.dispatchEvent('update', index, {
92+
msg: event[0],
93+
collection: msg.collection,
94+
id: msg.id,
95+
fields: event[0] === 'update' ? event[2] : event[1]
96+
});
97+
98+
// Provide specific change event and perform change
99+
switch(event[0]){
100+
case 'added':
101+
sub.splice(index, 0, event[1]);
102+
sub.dispatchEvent(event[0], index, event[1]);
103+
break;
104+
case 'changed':
105+
oldRow = _.clone(sub[index]);
106+
sub[index] = _.extend(sub[index], event[2]);
107+
sub.dispatchEvent(event[0], index, oldRow, sub[index]);
108+
break;
109+
case 'removed':
110+
oldRow = _.clone(sub[index]);
111+
sub.splice(index, 1);
112+
sub.dispatchEvent(event[0], index, oldRow);
113+
break;
114+
}
95115
});
96-
97-
// Provide specific change event and perform change
98-
switch(event[0]){
99-
case 'added':
100-
sub.splice(index, 0, event[1]);
101-
sub.dispatchEvent(event[0], index, event[1]);
102-
break;
103-
case 'changed':
104-
oldRow = _.clone(sub[index]);
105-
sub[index] = _.extend(sub[index], event[2]);
106-
sub.dispatchEvent(event[0], index, oldRow, sub[index]);
107-
break;
108-
case 'removed':
109-
oldRow = _.clone(sub[index]);
110-
sub.splice(index, 1);
111-
sub.dispatchEvent(event[0], index, oldRow);
112-
break;
113-
}
114-
});
116+
}
117+
sub.changed();
115118
}
116-
sub.changed();
117-
},
118-
endUpdate: function(){},
119-
saveOriginals: function(){},
120-
retrieveOriginals: function(){}
121-
});
119+
});
120+
}
121+
122122
};
123123

124124
// Inherit from Array and Tracker.Dependency

package.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package.describe({
22
name: 'numtel:mysql',
33
summary: 'MySQL support with Reactive Select Subscriptions',
4-
version: '0.1.9',
4+
version: '0.1.10',
55
git: 'https://github.com/numtel/meteor-mysql.git'
66
});
77

test/MysqlSubscription.js

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ function(test, done){
259259
// Limit players sub to 0 row
260260
players.change(0);
261261
test.isFalse(players.ready());
262-
262+
263263
Meteor.setTimeout(function() {
264264
test.equal(players.length, 0);
265265
test.isTrue(players.ready());
@@ -282,7 +282,7 @@ function(test, done){
282282
// Limit players sub to 1 row
283283
players.change(1);
284284
test.isFalse(players.ready());
285-
285+
286286
Meteor.setTimeout(function() {
287287
test.equal(players.length, 1);
288288
test.isTrue(players.ready());
@@ -296,3 +296,50 @@ function(test, done){
296296
}, POLL_WAIT);
297297
}, POLL_WAIT);
298298
});
299+
300+
301+
Tinytest.addAsync(SUITE_PREFIX + 'Quick Change Synchronously',
302+
function(test, done){
303+
// Change players sub multiple times synchronously
304+
for (var i = 0; i < 10; i++) {
305+
players.change(i);
306+
}
307+
308+
// Reset to original state
309+
players.change();
310+
311+
Meteor.setTimeout(function () {
312+
test.equal(players.length, expectedRows.length);
313+
done();
314+
}, POLL_WAIT);
315+
});
316+
317+
Tinytest.addAsync(SUITE_PREFIX + 'Quick Change Asynchronously',
318+
function(test, done){
319+
// How many times to change sub arguments?
320+
var LIMIT_MAX = 10;
321+
// Milliseconds between each change
322+
var CHANGE_TIMEOUT = 5;
323+
// Change players sub multiple times asynchronously
324+
var limitArg = 0;
325+
326+
var nextChange = function() {
327+
// Change to the next state, without necessarily waiting for it to be ready
328+
if(limitArg < LIMIT_MAX) {
329+
limitArg++;
330+
331+
players.change(limitArg);
332+
Meteor.setTimeout(nextChange, CHANGE_TIMEOUT);
333+
} else {
334+
// At end of possible states
335+
// Reset to original state
336+
players.change();
337+
338+
Meteor.setTimeout(function () {
339+
test.equal(players.length, expectedRows.length);
340+
done();
341+
}, POLL_WAIT);
342+
}
343+
};
344+
nextChange();
345+
});

0 commit comments

Comments
 (0)