@hebcal/geo-sqlite 3.4.2 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @hebcal/geo-sqlite v3.4.2 */
1
+ /*! @hebcal/geo-sqlite v3.6.0 */
2
2
  'use strict';
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -55,6 +55,7 @@ FROM ZIPCodes_Primary`;
55
55
  const ZIP_COMPLETE_SQL = `SELECT ZipCode,CityMixedCase,State,Latitude,Longitude,TimeZone,DayLightSaving
56
56
  FROM ZIPCodes_Primary
57
57
  WHERE ZipCode LIKE ?
58
+ ORDER BY Population DESC
58
59
  LIMIT 10`;
59
60
  const GEONAME_COMPLETE_SQL = `SELECT geonameid, asciiname, admin1, country,
60
61
  population, latitude, longitude, timezone
@@ -74,11 +75,11 @@ class GeoDb {
74
75
  constructor(logger, zipsFilename, geonamesFilename) {
75
76
  this.logger = logger;
76
77
  if (logger) logger.info(`GeoDb: opening ${zipsFilename}...`);
77
- this.zipsDb = new Database__default['default'](zipsFilename, {
78
+ this.zipsDb = new Database__default["default"](zipsFilename, {
78
79
  fileMustExist: true
79
80
  });
80
81
  if (logger) logger.info(`GeoDb: opening ${geonamesFilename}...`);
81
- this.geonamesDb = new Database__default['default'](geonamesFilename, {
82
+ this.geonamesDb = new Database__default["default"](geonamesFilename, {
82
83
  fileMustExist: true
83
84
  });
84
85
  this.zipStmt = this.zipsDb.prepare(ZIPCODE_SQL);
@@ -244,6 +245,7 @@ class GeoDb {
244
245
  latitude: res.Latitude,
245
246
  longitude: res.Longitude,
246
247
  timezone: core.Location.getUsaTzid(res.State, res.TimeZone, res.DayLightSaving),
248
+ population: res.Population,
247
249
  geo: 'zip'
248
250
  };
249
251
  return obj;
@@ -316,13 +318,6 @@ class GeoDb {
316
318
 
317
319
  }
318
320
 
319
- const logger = pino__default['default']({
320
- // level: argv.quiet ? 'warn' : 'info',
321
- prettyPrint: {
322
- translateTime: true,
323
- ignore: 'pid,hostname'
324
- }
325
- });
326
321
  /**
327
322
  * Builds `geonames.sqlite3` from files downloaded from geonames.org
328
323
  * @param {string} dbFilename
@@ -334,9 +329,16 @@ const logger = pino__default['default']({
334
329
  */
335
330
 
336
331
  async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, citiesPatch, admin1CodesASCIItxt, ILtxt) {
337
- const db = new Database__default['default'](dbFilename);
332
+ const logger = pino__default["default"]({
333
+ // level: argv.quiet ? 'warn' : 'info',
334
+ prettyPrint: {
335
+ translateTime: true,
336
+ ignore: 'pid,hostname'
337
+ }
338
+ });
339
+ const db = new Database__default["default"](dbFilename);
338
340
  db.pragma('journal_mode = MEMORY');
339
- doSql(db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
341
+ doSql(logger, db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
340
342
  ISO TEXT PRIMARY KEY,
341
343
  ISO3 TEXT NOT NULL,
342
344
  IsoNumeric TEXT NOT NULL,
@@ -357,8 +359,8 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
357
359
  neighbours TEXT NOT NULL,
358
360
  EquivalentFipsCode TEXT NOT NULL
359
361
  );`);
360
- await doFile(db, countryInfotxt, 'country', 19);
361
- doSql(db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
362
+ await doFile(logger, db, countryInfotxt, 'country', 19);
363
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
362
364
  geonameid int PRIMARY KEY,
363
365
  name nvarchar(200),
364
366
  asciiname nvarchar(200),
@@ -378,28 +380,28 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
378
380
  gtopo30 int,
379
381
  timezone nvarchar(40),
380
382
  moddate date);`);
381
- await doFile(db, cities5000txt, 'geoname', 19);
382
- await doFile(db, citiesPatch, 'geoname', 19);
383
- await doFile(db, ILtxt, 'geoname', 19, a => {
383
+ await doFile(logger, db, cities5000txt, 'geoname', 19);
384
+ await doFile(logger, db, citiesPatch, 'geoname', 19);
385
+ await doFile(logger, db, ILtxt, 'geoname', 19, a => {
384
386
  return a[6] == 'P' && (a[7] == 'PPL' || a[7] == 'STLMT');
385
387
  });
386
- doSql(db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
388
+ doSql(logger, db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
387
389
  key TEXT PRIMARY KEY,
388
390
  name nvarchar(200) NOT NULL,
389
391
  asciiname nvarchar(200) NOT NULL,
390
392
  geonameid int NOT NULL
391
393
  );`);
392
- await doFile(db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
394
+ await doFile(logger, db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
393
395
 
394
- doSql(db, `UPDATE geoname
396
+ doSql(logger, db, `UPDATE geoname
395
397
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
396
398
  WHERE geonameid = 4140963;`, `UPDATE admin1
397
399
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
398
400
  WHERE key = 'US.DC';`);
399
- doSql(db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
400
- await doFile(db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
401
- doSql(db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
402
- doSql(db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
401
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
402
+ await doFile(logger, db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
403
+ doSql(logger, db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
404
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
403
405
  USING fts3(geonameid int, longname text,
404
406
  asciiname text, admin1 text, country text,
405
407
  population int, latitude real, longitude real, timezone text
@@ -454,7 +456,7 @@ function filterPlacesHebrew(a) {
454
456
  const firstchar = name[0];
455
457
 
456
458
  if (firstchar >= '\u05D0' && firstchar <= '\u05EA') {
457
- a[1] = name; // replace 'name' field with Hebrew
459
+ a[1] = core.Locale.hebrewStripNikkud(name); // replace 'name' field with Hebrew
458
460
 
459
461
  return true;
460
462
  }
@@ -463,18 +465,20 @@ function filterPlacesHebrew(a) {
463
465
  return false;
464
466
  }
465
467
  /**
468
+ * @param {pino.Logger} logger
466
469
  * @param {Database} db
467
470
  * @param {...string} sqls
468
471
  */
469
472
 
470
473
 
471
- function doSql(db, ...sqls) {
474
+ function doSql(logger, db, ...sqls) {
472
475
  for (let i = 0; i < sqls.length; i++) {
473
476
  logger.info(sqls[i]);
474
477
  db.exec(sqls[i]);
475
478
  }
476
479
  }
477
480
  /**
481
+ * @param {pino.Logger} logger
478
482
  * @param {Database} db
479
483
  * @param {string} infile
480
484
  * @param {string} tableName
@@ -483,7 +487,7 @@ function doSql(db, ...sqls) {
483
487
  */
484
488
 
485
489
 
486
- async function doFile(db, infile, tableName, expectedFields, callback) {
490
+ async function doFile(logger, db, infile, tableName, expectedFields, callback) {
487
491
  logger.info(`${infile} => ${tableName}`);
488
492
  db.exec('BEGIN');
489
493
  let sql = `INSERT OR IGNORE INTO ${tableName} VALUES (?`;
@@ -497,8 +501,8 @@ async function doFile(db, infile, tableName, expectedFields, callback) {
497
501
  const stmt = db.prepare(sql);
498
502
  return new Promise((resolve, reject) => {
499
503
  try {
500
- const rl = readline__default['default'].createInterface({
501
- input: fs__default['default'].createReadStream(infile),
504
+ const rl = readline__default["default"].createInterface({
505
+ input: fs__default["default"].createReadStream(infile),
502
506
  crlfDelay: Infinity
503
507
  });
504
508
  let num = 0;
@@ -532,7 +536,7 @@ async function doFile(db, infile, tableName, expectedFields, callback) {
532
536
  logger.info(`Inserted ${accepted} / ${num} into ${tableName} from ${infile}`);
533
537
  db.exec('COMMIT');
534
538
  });
535
- return resolve(events__default['default'].once(rl, 'close'));
539
+ return resolve(events__default["default"].once(rl, 'close'));
536
540
  } catch (err) {
537
541
  logger.error(err);
538
542
  return reject(err);
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- /*! @hebcal/geo-sqlite v3.4.2 */
1
+ /*! @hebcal/geo-sqlite v3.6.0 */
2
2
  import Database from 'better-sqlite3';
3
- import { Location } from '@hebcal/core';
3
+ import { Location, Locale } from '@hebcal/core';
4
4
  import pino from 'pino';
5
5
  import events from 'events';
6
6
  import fs from 'fs';
@@ -43,6 +43,7 @@ FROM ZIPCodes_Primary`;
43
43
  const ZIP_COMPLETE_SQL = `SELECT ZipCode,CityMixedCase,State,Latitude,Longitude,TimeZone,DayLightSaving
44
44
  FROM ZIPCodes_Primary
45
45
  WHERE ZipCode LIKE ?
46
+ ORDER BY Population DESC
46
47
  LIMIT 10`;
47
48
  const GEONAME_COMPLETE_SQL = `SELECT geonameid, asciiname, admin1, country,
48
49
  population, latitude, longitude, timezone
@@ -232,6 +233,7 @@ class GeoDb {
232
233
  latitude: res.Latitude,
233
234
  longitude: res.Longitude,
234
235
  timezone: Location.getUsaTzid(res.State, res.TimeZone, res.DayLightSaving),
236
+ population: res.Population,
235
237
  geo: 'zip'
236
238
  };
237
239
  return obj;
@@ -304,13 +306,6 @@ class GeoDb {
304
306
 
305
307
  }
306
308
 
307
- const logger = pino({
308
- // level: argv.quiet ? 'warn' : 'info',
309
- prettyPrint: {
310
- translateTime: true,
311
- ignore: 'pid,hostname'
312
- }
313
- });
314
309
  /**
315
310
  * Builds `geonames.sqlite3` from files downloaded from geonames.org
316
311
  * @param {string} dbFilename
@@ -322,9 +317,16 @@ const logger = pino({
322
317
  */
323
318
 
324
319
  async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, citiesPatch, admin1CodesASCIItxt, ILtxt) {
320
+ const logger = pino({
321
+ // level: argv.quiet ? 'warn' : 'info',
322
+ prettyPrint: {
323
+ translateTime: true,
324
+ ignore: 'pid,hostname'
325
+ }
326
+ });
325
327
  const db = new Database(dbFilename);
326
328
  db.pragma('journal_mode = MEMORY');
327
- doSql(db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
329
+ doSql(logger, db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
328
330
  ISO TEXT PRIMARY KEY,
329
331
  ISO3 TEXT NOT NULL,
330
332
  IsoNumeric TEXT NOT NULL,
@@ -345,8 +347,8 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
345
347
  neighbours TEXT NOT NULL,
346
348
  EquivalentFipsCode TEXT NOT NULL
347
349
  );`);
348
- await doFile(db, countryInfotxt, 'country', 19);
349
- doSql(db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
350
+ await doFile(logger, db, countryInfotxt, 'country', 19);
351
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
350
352
  geonameid int PRIMARY KEY,
351
353
  name nvarchar(200),
352
354
  asciiname nvarchar(200),
@@ -366,28 +368,28 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
366
368
  gtopo30 int,
367
369
  timezone nvarchar(40),
368
370
  moddate date);`);
369
- await doFile(db, cities5000txt, 'geoname', 19);
370
- await doFile(db, citiesPatch, 'geoname', 19);
371
- await doFile(db, ILtxt, 'geoname', 19, a => {
371
+ await doFile(logger, db, cities5000txt, 'geoname', 19);
372
+ await doFile(logger, db, citiesPatch, 'geoname', 19);
373
+ await doFile(logger, db, ILtxt, 'geoname', 19, a => {
372
374
  return a[6] == 'P' && (a[7] == 'PPL' || a[7] == 'STLMT');
373
375
  });
374
- doSql(db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
376
+ doSql(logger, db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
375
377
  key TEXT PRIMARY KEY,
376
378
  name nvarchar(200) NOT NULL,
377
379
  asciiname nvarchar(200) NOT NULL,
378
380
  geonameid int NOT NULL
379
381
  );`);
380
- await doFile(db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
382
+ await doFile(logger, db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
381
383
 
382
- doSql(db, `UPDATE geoname
384
+ doSql(logger, db, `UPDATE geoname
383
385
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
384
386
  WHERE geonameid = 4140963;`, `UPDATE admin1
385
387
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
386
388
  WHERE key = 'US.DC';`);
387
- doSql(db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
388
- await doFile(db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
389
- doSql(db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
390
- doSql(db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
389
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
390
+ await doFile(logger, db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
391
+ doSql(logger, db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
392
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
391
393
  USING fts3(geonameid int, longname text,
392
394
  asciiname text, admin1 text, country text,
393
395
  population int, latitude real, longitude real, timezone text
@@ -442,7 +444,7 @@ function filterPlacesHebrew(a) {
442
444
  const firstchar = name[0];
443
445
 
444
446
  if (firstchar >= '\u05D0' && firstchar <= '\u05EA') {
445
- a[1] = name; // replace 'name' field with Hebrew
447
+ a[1] = Locale.hebrewStripNikkud(name); // replace 'name' field with Hebrew
446
448
 
447
449
  return true;
448
450
  }
@@ -451,18 +453,20 @@ function filterPlacesHebrew(a) {
451
453
  return false;
452
454
  }
453
455
  /**
456
+ * @param {pino.Logger} logger
454
457
  * @param {Database} db
455
458
  * @param {...string} sqls
456
459
  */
457
460
 
458
461
 
459
- function doSql(db, ...sqls) {
462
+ function doSql(logger, db, ...sqls) {
460
463
  for (let i = 0; i < sqls.length; i++) {
461
464
  logger.info(sqls[i]);
462
465
  db.exec(sqls[i]);
463
466
  }
464
467
  }
465
468
  /**
469
+ * @param {pino.Logger} logger
466
470
  * @param {Database} db
467
471
  * @param {string} infile
468
472
  * @param {string} tableName
@@ -471,7 +475,7 @@ function doSql(db, ...sqls) {
471
475
  */
472
476
 
473
477
 
474
- async function doFile(db, infile, tableName, expectedFields, callback) {
478
+ async function doFile(logger, db, infile, tableName, expectedFields, callback) {
475
479
  logger.info(`${infile} => ${tableName}`);
476
480
  db.exec('BEGIN');
477
481
  let sql = `INSERT OR IGNORE INTO ${tableName} VALUES (?`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hebcal/geo-sqlite",
3
- "version": "3.4.2",
3
+ "version": "3.6.0",
4
4
  "author": "Michael J. Radwin (https://github.com/mjradwin)",
5
5
  "keywords": [
6
6
  "hebcal"
@@ -28,10 +28,10 @@
28
28
  "geo-sqlite.d.ts"
29
29
  ],
30
30
  "dependencies": {
31
- "@hebcal/core": "^3.21.1",
32
- "better-sqlite3": "^7.4.3",
33
- "pino": "^7.0.0-rc.1",
34
- "pino-pretty": "^5.1.2"
31
+ "@hebcal/core": "^3.32.0",
32
+ "better-sqlite3": "^7.4.6",
33
+ "pino": "^7.6.2",
34
+ "pino-pretty": "^7.3.0"
35
35
  },
36
36
  "scripts": {
37
37
  "build": "rollup -c",
@@ -60,19 +60,19 @@
60
60
  "license": "BSD-2-Clause",
61
61
  "devDependencies": {
62
62
  "@ava/babel": "^2.0.0",
63
- "@babel/core": "^7.14.8",
63
+ "@babel/core": "^7.16.7",
64
64
  "@babel/polyfill": "^7.12.1",
65
- "@babel/preset-env": "^7.14.8",
66
- "@babel/register": "^7.14.5",
65
+ "@babel/preset-env": "^7.16.7",
66
+ "@babel/register": "^7.16.7",
67
67
  "@rollup/plugin-babel": "^5.3.0",
68
- "@rollup/plugin-commonjs": "^19.0.1",
68
+ "@rollup/plugin-commonjs": "^21.0.1",
69
69
  "@rollup/plugin-json": "^4.1.0",
70
- "@rollup/plugin-node-resolve": "^13.0.2",
70
+ "@rollup/plugin-node-resolve": "^13.1.3",
71
71
  "ava": "^3.15.0",
72
- "eslint": "^7.31.0",
72
+ "eslint": "^8.6.0",
73
73
  "eslint-config-google": "^0.14.0",
74
74
  "jsdoc": "^3.6.7",
75
- "jsdoc-to-markdown": "^7.0.1",
76
- "rollup": "^2.53.3"
75
+ "jsdoc-to-markdown": "^7.1.0",
76
+ "rollup": "^2.63.0"
77
77
  }
78
78
  }
package/zips-dummy.sql CHANGED
@@ -6,5 +6,5 @@ CREATE TABLE ZIPCodes_Primary (
6
6
  Longitude decimal(12, 6),
7
7
  TimeZone char(2) NULL,
8
8
  DayLightSaving char(1) NULL,
9
- Elevation int NULL
9
+ Population int NULL
10
10
  );