Skip to content

Commit a45c696

Browse files
committed
[ProblemSet] Get problems of databse/shell.
* WIP * refs #54 Signed-off-by: Eric Wang <[email protected]>
1 parent a7f7a90 commit a45c696

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

Diff for: lib/core.js

+25-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var log = require('loglevel');
88
var cache = require('./cache');
99
var config = require('./config');
1010
var client = require('./leetcode_client');
11+
var queue = require('./queue');
1112
var h = require('./helper');
1213

1314
var KEY_USER = '.user';
@@ -37,17 +38,38 @@ var core = {};
3738
core.getProblems = function(cb) {
3839
var problems = cache.get(KEY_PROBLEMS);
3940
if (problems) {
40-
log.debug('loading from all.json');
41+
log.debug('loading from problems.json');
4142
return cb(null, problems);
4243
}
4344

44-
log.debug('running getProblems');
4545
var user = this.getUser();
46-
client.getProblems('algorithms', user, function(e, problems) {
46+
var CATEGORIES = ['algorithms', 'database', 'shell'];
47+
var KEY_TMP = '.tmp';
48+
49+
var doTask = function(category, taskDone) {
50+
log.debug(category + ': running getProblems');
51+
client.getProblems(category, user, function(e, problems) {
52+
if (e) {
53+
log.debug(category + ': failed to getProblems: ' + e);
54+
} else {
55+
log.debug(category + ': getProblems got ' +
56+
problems.length + ' problems');
57+
problems = cache.get(KEY_TMP).concat(problems);
58+
cache.set(KEY_TMP, problems);
59+
}
60+
return taskDone(e);
61+
});
62+
};
63+
64+
cache.set(KEY_TMP, []);
65+
queue.run(CATEGORIES, doTask, function(e) {
4766
if (e) return cb(e);
4867

4968
saveUser(user);
69+
var problems = cache.get(KEY_TMP);
5070
cache.set(KEY_PROBLEMS, problems);
71+
cache.del(KEY_TMP);
72+
5173
return cb(null, problems);
5274
});
5375
};

Diff for: lib/queue.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ var config = require('./config');
22

33
var queue = {};
44

5-
function startWorker(ctx) {
5+
function workerRun(ctx) {
66
// no more tasks, quit now
77
if (ctx.tasks.length === 0) {
88
if (--ctx.workers === 0 && ctx.cb)
9-
ctx.cb();
9+
ctx.cb(ctx.error);
1010
return;
1111
}
1212

1313
var task = ctx.tasks.shift();
1414
ctx.doTask(task, function(e) {
15+
if (e) ctx.error = e;
16+
1517
// TODO: could retry failed task here.
16-
startWorker(ctx);
18+
setImmediate(workerRun, ctx);
1719
});
1820
}
1921

@@ -22,11 +24,12 @@ queue.run = function(tasks, doTask, cb) {
2224
tasks: tasks,
2325
doTask: doTask,
2426
cb: cb,
25-
workers: config.MAX_WORKERS
27+
workers: config.MAX_WORKERS || 1,
28+
error: null
2629
};
2730

2831
for (var i = 0; i < ctx.workers; ++i) {
29-
startWorker(ctx);
32+
setImmediate(workerRun, ctx);
3033
}
3134
};
3235

Diff for: test/test_core.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,16 @@ describe('core', function() {
134134
cache.del('problems');
135135

136136
client.getProblems = function(category, user, cb) {
137-
return cb(null, PROBLEMS);
137+
return cb(null, [{category: category}]);
138138
};
139139

140140
core.getProblems(function(e, problems) {
141141
assert.equal(e, null);
142-
assert.deepEqual(problems, PROBLEMS);
142+
assert.deepEqual(problems, [
143+
{category: 'algorithms'},
144+
{category: 'database'},
145+
{category: 'shell'}
146+
]);
143147
done();
144148
});
145149
});

0 commit comments

Comments
 (0)