Skip to content

Commit 3d9e902

Browse files
updatedb made fast (#259)
1 parent b124cb3 commit 3d9e902

File tree

2 files changed

+58
-39
lines changed

2 files changed

+58
-39
lines changed

.eslintrc.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
module.exports = {
22
"env": {
3-
"node": true
3+
"node": true,
4+
"es6": true
45
},
56
"extends": "eslint:recommended",
67
"parserOptions": {
7-
"ecmaVersion": 5
8+
"ecmaVersion": 2018
89
},
910
"rules": {
1011
"indent": [

scripts/updatedb.js

+55-37
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var https = require('https');
1010
var path = require('path');
1111
var url = require('url');
1212
var zlib = require('zlib');
13+
var readline = require('readline');
1314

1415
fs.existsSync = fs.existsSync || path.existsSync;
1516

@@ -340,9 +341,9 @@ function processLookupCountry(src, cb){
340341
});
341342
}
342343

343-
function processCountryData(src, dest, cb) {
344+
async function processCountryData(src, dest) {
344345
var lines=0;
345-
function processLine(line) {
346+
async function processLine(line) {
346347
var fields = CSVtoArray(line);
347348

348349
if (!fields || fields.length < 6) {
@@ -389,12 +390,18 @@ function processCountryData(src, dest, cb) {
389390
}
390391

391392
b.write(cc, bsz - 2);
392-
393-
fs.writeSync(datFile, b, 0, bsz, null);
394393
if(Date.now() - tstart > 5000) {
395394
tstart = Date.now();
396395
process.stdout.write('\nStill working (' + lines + ') ...');
397396
}
397+
398+
if(datFile._writableState.needDrain) {
399+
return new Promise((resolve) => {
400+
datFile.write(b, resolve);
401+
});
402+
} else {
403+
return datFile.write(b);
404+
}
398405
}
399406
}
400407

@@ -406,24 +413,25 @@ function processCountryData(src, dest, cb) {
406413

407414
process.stdout.write('Processing Data (may take a moment) ...');
408415
var tstart = Date.now();
409-
var datFile = fs.openSync(dataFile, "w");
416+
var datFile = fs.createWriteStream(dataFile);
410417

411-
lazy(fs.createReadStream(tmpDataFile))
412-
.lines
413-
.map(function(byteArray) {
414-
return iconv.decode(byteArray, 'latin1');
415-
})
416-
.skip(1)
417-
.map(processLine)
418-
.on('pipe', function() {
419-
console.log(chalk.green(' DONE'));
420-
cb();
421-
});
418+
var rl = readline.createInterface({
419+
input: fs.createReadStream(tmpDataFile),
420+
crlfDelay: Infinity
421+
});
422+
var i = 0;
423+
for await (var line of rl) {
424+
i++;
425+
if(i == 1) continue;
426+
await processLine(line);
427+
}
428+
datFile.close();
429+
console.log(' DONE'.green);
422430
}
423431

424-
function processCityData(src, dest, cb) {
432+
async function processCityData(src, dest) {
425433
var lines = 0;
426-
function processLine(line) {
434+
async function processLine(line) {
427435
if (line.match(/^Copyright/) || !line.match(/\d/)) {
428436
return;
429437
}
@@ -500,11 +508,18 @@ function processCityData(src, dest, cb) {
500508
b.writeInt32BE(area,20);
501509
}
502510

503-
fs.writeSync(datFile, b, 0, b.length, null);
504511
if(Date.now() - tstart > 5000) {
505512
tstart = Date.now();
506513
process.stdout.write('\nStill working (' + lines + ') ...');
507514
}
515+
516+
if(datFile._writableState.needDrain) {
517+
return new Promise((resolve) => {
518+
datFile.write(b, resolve);
519+
});
520+
} else {
521+
return datFile.write(b);
522+
}
508523
}
509524

510525
var dataFile = path.join(dataPath, dest);
@@ -514,16 +529,19 @@ function processCityData(src, dest, cb) {
514529

515530
process.stdout.write('Processing Data (may take a moment) ...');
516531
var tstart = Date.now();
517-
var datFile = fs.openSync(dataFile, "w");
532+
var datFile = fs.createWriteStream(dataFile);
518533

519-
lazy(fs.createReadStream(tmpDataFile))
520-
.lines
521-
.map(function(byteArray) {
522-
return iconv.decode(byteArray, 'latin1');
523-
})
524-
.skip(1)
525-
.map(processLine)
526-
.on('pipe', cb);
534+
var rl = readline.createInterface({
535+
input: fs.createReadStream(tmpDataFile),
536+
crlfDelay: Infinity
537+
});
538+
var i = 0;
539+
for await (var line of rl) {
540+
i++;
541+
if(i == 1) continue;
542+
await processLine(line);
543+
}
544+
datFile.close();
527545
}
528546

529547
function processCityDataNames(src, dest, cb) {
@@ -599,10 +617,10 @@ function processData(database, cb) {
599617
if (type === 'country') {
600618
if(Array.isArray(src)){
601619
processLookupCountry(src[0], function() {
602-
processCountryData(src[1], dest[1], function() {
603-
processCountryData(src[2], dest[2], function() {
604-
cb(null, database);
605-
});
620+
processCountryData(src[1], dest[1]).then(() => {
621+
return processCountryData(src[2], dest[2]);
622+
}).then(() => {
623+
cb(null, database);
606624
});
607625
});
608626
}
@@ -613,12 +631,12 @@ function processData(database, cb) {
613631
}
614632
} else if (type === 'city') {
615633
processCityDataNames(src[0], dest[0], function() {
616-
processCityData(src[1], dest[1], function() {
634+
processCityData(src[1], dest[1]).then(() => {
617635
console.log("city data processed");
618-
processCityData(src[2], dest[2], function() {
619-
console.log(chalk.green(' DONE'));
620-
cb(null, database);
621-
});
636+
return processCityData(src[2], dest[2]);
637+
}).then(() => {
638+
console.log(chalk.green(' DONE'));
639+
cb(null, database);
622640
});
623641
});
624642
}

0 commit comments

Comments
 (0)