@hebcal/geo-sqlite 3.4.1 → 3.5.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.
Files changed (3) hide show
  1. package/dist/index.js +33 -30
  2. package/dist/index.mjs +28 -25
  3. package/package.json +15 -15
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @hebcal/geo-sqlite v3.4.1 */
1
+ /*! @hebcal/geo-sqlite v3.5.0 */
2
2
  'use strict';
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -74,11 +74,11 @@ class GeoDb {
74
74
  constructor(logger, zipsFilename, geonamesFilename) {
75
75
  this.logger = logger;
76
76
  if (logger) logger.info(`GeoDb: opening ${zipsFilename}...`);
77
- this.zipsDb = new Database__default['default'](zipsFilename, {
77
+ this.zipsDb = new Database__default["default"](zipsFilename, {
78
78
  fileMustExist: true
79
79
  });
80
80
  if (logger) logger.info(`GeoDb: opening ${geonamesFilename}...`);
81
- this.geonamesDb = new Database__default['default'](geonamesFilename, {
81
+ this.geonamesDb = new Database__default["default"](geonamesFilename, {
82
82
  fileMustExist: true
83
83
  });
84
84
  this.zipStmt = this.zipsDb.prepare(ZIPCODE_SQL);
@@ -253,6 +253,7 @@ class GeoDb {
253
253
  this.geonamesCompStmt = this.geonamesDb.prepare(GEONAME_COMPLETE_SQL);
254
254
  }
255
255
 
256
+ qraw = qraw.replace(/\"/g, '""');
256
257
  return this.geonamesCompStmt.all(`"${qraw}*"`).map(res => {
257
258
  const country = res.country || '';
258
259
  const admin1 = res.admin1 || '';
@@ -315,13 +316,6 @@ class GeoDb {
315
316
 
316
317
  }
317
318
 
318
- const logger = pino__default['default']({
319
- // level: argv.quiet ? 'warn' : 'info',
320
- prettyPrint: {
321
- translateTime: true,
322
- ignore: 'pid,hostname'
323
- }
324
- });
325
319
  /**
326
320
  * Builds `geonames.sqlite3` from files downloaded from geonames.org
327
321
  * @param {string} dbFilename
@@ -333,9 +327,16 @@ const logger = pino__default['default']({
333
327
  */
334
328
 
335
329
  async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, citiesPatch, admin1CodesASCIItxt, ILtxt) {
336
- const db = new Database__default['default'](dbFilename);
330
+ const logger = pino__default["default"]({
331
+ // level: argv.quiet ? 'warn' : 'info',
332
+ prettyPrint: {
333
+ translateTime: true,
334
+ ignore: 'pid,hostname'
335
+ }
336
+ });
337
+ const db = new Database__default["default"](dbFilename);
337
338
  db.pragma('journal_mode = MEMORY');
338
- doSql(db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
339
+ doSql(logger, db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
339
340
  ISO TEXT PRIMARY KEY,
340
341
  ISO3 TEXT NOT NULL,
341
342
  IsoNumeric TEXT NOT NULL,
@@ -356,8 +357,8 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
356
357
  neighbours TEXT NOT NULL,
357
358
  EquivalentFipsCode TEXT NOT NULL
358
359
  );`);
359
- await doFile(db, countryInfotxt, 'country', 19);
360
- doSql(db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
360
+ await doFile(logger, db, countryInfotxt, 'country', 19);
361
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
361
362
  geonameid int PRIMARY KEY,
362
363
  name nvarchar(200),
363
364
  asciiname nvarchar(200),
@@ -377,28 +378,28 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
377
378
  gtopo30 int,
378
379
  timezone nvarchar(40),
379
380
  moddate date);`);
380
- await doFile(db, cities5000txt, 'geoname', 19);
381
- await doFile(db, citiesPatch, 'geoname', 19);
382
- await doFile(db, ILtxt, 'geoname', 19, a => {
381
+ await doFile(logger, db, cities5000txt, 'geoname', 19);
382
+ await doFile(logger, db, citiesPatch, 'geoname', 19);
383
+ await doFile(logger, db, ILtxt, 'geoname', 19, a => {
383
384
  return a[6] == 'P' && (a[7] == 'PPL' || a[7] == 'STLMT');
384
385
  });
385
- doSql(db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
386
+ doSql(logger, db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
386
387
  key TEXT PRIMARY KEY,
387
388
  name nvarchar(200) NOT NULL,
388
389
  asciiname nvarchar(200) NOT NULL,
389
390
  geonameid int NOT NULL
390
391
  );`);
391
- await doFile(db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
392
+ await doFile(logger, db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
392
393
 
393
- doSql(db, `UPDATE geoname
394
+ doSql(logger, db, `UPDATE geoname
394
395
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
395
396
  WHERE geonameid = 4140963;`, `UPDATE admin1
396
397
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
397
398
  WHERE key = 'US.DC';`);
398
- doSql(db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
399
- await doFile(db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
400
- doSql(db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
401
- doSql(db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
399
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
400
+ await doFile(logger, db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
401
+ 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;`);
402
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
402
403
  USING fts3(geonameid int, longname text,
403
404
  asciiname text, admin1 text, country text,
404
405
  population int, latitude real, longitude real, timezone text
@@ -453,7 +454,7 @@ function filterPlacesHebrew(a) {
453
454
  const firstchar = name[0];
454
455
 
455
456
  if (firstchar >= '\u05D0' && firstchar <= '\u05EA') {
456
- a[1] = name; // replace 'name' field with Hebrew
457
+ a[1] = core.Locale.hebrewStripNikkud(name); // replace 'name' field with Hebrew
457
458
 
458
459
  return true;
459
460
  }
@@ -462,18 +463,20 @@ function filterPlacesHebrew(a) {
462
463
  return false;
463
464
  }
464
465
  /**
466
+ * @param {pino.Logger} logger
465
467
  * @param {Database} db
466
468
  * @param {...string} sqls
467
469
  */
468
470
 
469
471
 
470
- function doSql(db, ...sqls) {
472
+ function doSql(logger, db, ...sqls) {
471
473
  for (let i = 0; i < sqls.length; i++) {
472
474
  logger.info(sqls[i]);
473
475
  db.exec(sqls[i]);
474
476
  }
475
477
  }
476
478
  /**
479
+ * @param {pino.Logger} logger
477
480
  * @param {Database} db
478
481
  * @param {string} infile
479
482
  * @param {string} tableName
@@ -482,7 +485,7 @@ function doSql(db, ...sqls) {
482
485
  */
483
486
 
484
487
 
485
- async function doFile(db, infile, tableName, expectedFields, callback) {
488
+ async function doFile(logger, db, infile, tableName, expectedFields, callback) {
486
489
  logger.info(`${infile} => ${tableName}`);
487
490
  db.exec('BEGIN');
488
491
  let sql = `INSERT OR IGNORE INTO ${tableName} VALUES (?`;
@@ -496,8 +499,8 @@ async function doFile(db, infile, tableName, expectedFields, callback) {
496
499
  const stmt = db.prepare(sql);
497
500
  return new Promise((resolve, reject) => {
498
501
  try {
499
- const rl = readline__default['default'].createInterface({
500
- input: fs__default['default'].createReadStream(infile),
502
+ const rl = readline__default["default"].createInterface({
503
+ input: fs__default["default"].createReadStream(infile),
501
504
  crlfDelay: Infinity
502
505
  });
503
506
  let num = 0;
@@ -531,7 +534,7 @@ async function doFile(db, infile, tableName, expectedFields, callback) {
531
534
  logger.info(`Inserted ${accepted} / ${num} into ${tableName} from ${infile}`);
532
535
  db.exec('COMMIT');
533
536
  });
534
- return resolve(events__default['default'].once(rl, 'close'));
537
+ return resolve(events__default["default"].once(rl, 'close'));
535
538
  } catch (err) {
536
539
  logger.error(err);
537
540
  return reject(err);
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- /*! @hebcal/geo-sqlite v3.4.1 */
1
+ /*! @hebcal/geo-sqlite v3.5.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';
@@ -241,6 +241,7 @@ class GeoDb {
241
241
  this.geonamesCompStmt = this.geonamesDb.prepare(GEONAME_COMPLETE_SQL);
242
242
  }
243
243
 
244
+ qraw = qraw.replace(/\"/g, '""');
244
245
  return this.geonamesCompStmt.all(`"${qraw}*"`).map(res => {
245
246
  const country = res.country || '';
246
247
  const admin1 = res.admin1 || '';
@@ -303,13 +304,6 @@ class GeoDb {
303
304
 
304
305
  }
305
306
 
306
- const logger = pino({
307
- // level: argv.quiet ? 'warn' : 'info',
308
- prettyPrint: {
309
- translateTime: true,
310
- ignore: 'pid,hostname'
311
- }
312
- });
313
307
  /**
314
308
  * Builds `geonames.sqlite3` from files downloaded from geonames.org
315
309
  * @param {string} dbFilename
@@ -321,9 +315,16 @@ const logger = pino({
321
315
  */
322
316
 
323
317
  async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, citiesPatch, admin1CodesASCIItxt, ILtxt) {
318
+ const logger = pino({
319
+ // level: argv.quiet ? 'warn' : 'info',
320
+ prettyPrint: {
321
+ translateTime: true,
322
+ ignore: 'pid,hostname'
323
+ }
324
+ });
324
325
  const db = new Database(dbFilename);
325
326
  db.pragma('journal_mode = MEMORY');
326
- doSql(db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
327
+ doSql(logger, db, `DROP TABLE IF EXISTS country`, `CREATE TABLE country (
327
328
  ISO TEXT PRIMARY KEY,
328
329
  ISO3 TEXT NOT NULL,
329
330
  IsoNumeric TEXT NOT NULL,
@@ -344,8 +345,8 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
344
345
  neighbours TEXT NOT NULL,
345
346
  EquivalentFipsCode TEXT NOT NULL
346
347
  );`);
347
- await doFile(db, countryInfotxt, 'country', 19);
348
- doSql(db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
348
+ await doFile(logger, db, countryInfotxt, 'country', 19);
349
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname`, `CREATE TABLE geoname (
349
350
  geonameid int PRIMARY KEY,
350
351
  name nvarchar(200),
351
352
  asciiname nvarchar(200),
@@ -365,28 +366,28 @@ async function buildGeonamesSqlite(dbFilename, countryInfotxt, cities5000txt, ci
365
366
  gtopo30 int,
366
367
  timezone nvarchar(40),
367
368
  moddate date);`);
368
- await doFile(db, cities5000txt, 'geoname', 19);
369
- await doFile(db, citiesPatch, 'geoname', 19);
370
- await doFile(db, ILtxt, 'geoname', 19, a => {
369
+ await doFile(logger, db, cities5000txt, 'geoname', 19);
370
+ await doFile(logger, db, citiesPatch, 'geoname', 19);
371
+ await doFile(logger, db, ILtxt, 'geoname', 19, a => {
371
372
  return a[6] == 'P' && (a[7] == 'PPL' || a[7] == 'STLMT');
372
373
  });
373
- doSql(db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
374
+ doSql(logger, db, `DROP TABLE IF EXISTS admin1`, `CREATE TABLE admin1 (
374
375
  key TEXT PRIMARY KEY,
375
376
  name nvarchar(200) NOT NULL,
376
377
  asciiname nvarchar(200) NOT NULL,
377
378
  geonameid int NOT NULL
378
379
  );`);
379
- await doFile(db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
380
+ await doFile(logger, db, admin1CodesASCIItxt, 'admin1', 4); // fix inconsistencies with the USA capitol
380
381
 
381
- doSql(db, `UPDATE geoname
382
+ doSql(logger, db, `UPDATE geoname
382
383
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
383
384
  WHERE geonameid = 4140963;`, `UPDATE admin1
384
385
  SET name = 'Washington, D.C.', asciiname = 'Washington, D.C.'
385
386
  WHERE key = 'US.DC';`);
386
- doSql(db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
387
- await doFile(db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
388
- doSql(db, `update admin1 set name='',asciiname='' where key like 'PS.%';`, `update country set country = '' where iso = 'PS';`, `delete from geoname where geonameid = 7303419;`);
389
- doSql(db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
387
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_he`, `CREATE TABLE geoname_he AS SELECT * FROM geoname LIMIT 0`);
388
+ await doFile(logger, db, ILtxt, 'geoname_he', 19, filterPlacesHebrew);
389
+ 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;`);
390
+ doSql(logger, db, `DROP TABLE IF EXISTS geoname_fulltext`, `CREATE VIRTUAL TABLE geoname_fulltext
390
391
  USING fts3(geonameid int, longname text,
391
392
  asciiname text, admin1 text, country text,
392
393
  population int, latitude real, longitude real, timezone text
@@ -441,7 +442,7 @@ function filterPlacesHebrew(a) {
441
442
  const firstchar = name[0];
442
443
 
443
444
  if (firstchar >= '\u05D0' && firstchar <= '\u05EA') {
444
- a[1] = name; // replace 'name' field with Hebrew
445
+ a[1] = Locale.hebrewStripNikkud(name); // replace 'name' field with Hebrew
445
446
 
446
447
  return true;
447
448
  }
@@ -450,18 +451,20 @@ function filterPlacesHebrew(a) {
450
451
  return false;
451
452
  }
452
453
  /**
454
+ * @param {pino.Logger} logger
453
455
  * @param {Database} db
454
456
  * @param {...string} sqls
455
457
  */
456
458
 
457
459
 
458
- function doSql(db, ...sqls) {
460
+ function doSql(logger, db, ...sqls) {
459
461
  for (let i = 0; i < sqls.length; i++) {
460
462
  logger.info(sqls[i]);
461
463
  db.exec(sqls[i]);
462
464
  }
463
465
  }
464
466
  /**
467
+ * @param {pino.Logger} logger
465
468
  * @param {Database} db
466
469
  * @param {string} infile
467
470
  * @param {string} tableName
@@ -470,7 +473,7 @@ function doSql(db, ...sqls) {
470
473
  */
471
474
 
472
475
 
473
- async function doFile(db, infile, tableName, expectedFields, callback) {
476
+ async function doFile(logger, db, infile, tableName, expectedFields, callback) {
474
477
  logger.info(`${infile} => ${tableName}`);
475
478
  db.exec('BEGIN');
476
479
  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.1",
3
+ "version": "3.5.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.13.0",
32
- "better-sqlite3": "^7.1.2",
33
- "pino": "^6.11.2",
34
- "pino-pretty": "^4.7.1"
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",
@@ -59,20 +59,20 @@
59
59
  },
60
60
  "license": "BSD-2-Clause",
61
61
  "devDependencies": {
62
- "@ava/babel": "^1.0.1",
63
- "@babel/core": "^7.13.14",
62
+ "@ava/babel": "^2.0.0",
63
+ "@babel/core": "^7.16.7",
64
64
  "@babel/polyfill": "^7.12.1",
65
- "@babel/preset-env": "^7.13.12",
66
- "@babel/register": "^7.13.14",
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": "^18.0.0",
68
+ "@rollup/plugin-commonjs": "^21.0.1",
69
69
  "@rollup/plugin-json": "^4.1.0",
70
- "@rollup/plugin-node-resolve": "^11.2.1",
70
+ "@rollup/plugin-node-resolve": "^13.1.3",
71
71
  "ava": "^3.15.0",
72
- "eslint": "^7.23.0",
72
+ "eslint": "^8.6.0",
73
73
  "eslint-config-google": "^0.14.0",
74
- "jsdoc": "^3.6.6",
75
- "jsdoc-to-markdown": "^6.0.1",
76
- "rollup": "^2.44.0"
74
+ "jsdoc": "^3.6.7",
75
+ "jsdoc-to-markdown": "^7.1.0",
76
+ "rollup": "^2.63.0"
77
77
  }
78
78
  }