diff --git a/benchmark/Benchmark.ts b/benchmark/Benchmark.ts index 2c2000ca..1eec33b7 100644 --- a/benchmark/Benchmark.ts +++ b/benchmark/Benchmark.ts @@ -62,17 +62,23 @@ export class Benchmark { request: any; beforeEach: () => Promise; afterEach: () => Promise; + beforeAll: () => Promise; + afterAll: () => Promise; private readonly bmExpressApp: BMExpressApp; constructor(name: string, request: any = {}, beforeEach?: () => Promise, - afterEach?: () => Promise) { + afterEach?: () => Promise, + beforeAll?: () => Promise, + afterAll?: () => Promise) { this.name = name; this.request = request; this.beforeEach = beforeEach; this.afterEach = afterEach; + this.beforeAll = beforeAll; + this.afterAll = afterAll; this.bmExpressApp = new BMExpressApp(this); } @@ -81,11 +87,22 @@ export class Benchmark { } async run(RUNS: number): Promise { - const ret = [await this.runAnExperiment(RUNS)]; + const ret: BenchmarkResult[] = []; + const r = async (): Promise => { + if (this.beforeAll) { + await this.beforeAll(); + } + ret.push(await this.runAnExperiment(RUNS)); + if (this.afterAll) { + await this.afterAll(); + } + }; + + await r(); for (const exp of Object.values(Experiments)) { for (const group of Object.values(exp.groups)) { ActiveExperiments[exp.name] = group; - ret.push(await this.runAnExperiment(RUNS)); + await r(); ret[ret.length - 1].experiment = exp.name + '=' + group; } delete ActiveExperiments[exp.name]; diff --git a/benchmark/BenchmarkRunner.ts b/benchmark/BenchmarkRunner.ts index 82101a3c..352c4920 100644 --- a/benchmark/BenchmarkRunner.ts +++ b/benchmark/BenchmarkRunner.ts @@ -84,10 +84,13 @@ export class BenchmarkRunner { } async bmSaveDirectory(): Promise { - await this.init(); - await this.resetDB(); const dir = await DiskMangerWorker.scanDirectory(this.biggestDirPath); - const bm = new Benchmark('Saving directory to DB', null, (): Promise => this.resetDB()); + const bm = new Benchmark('Saving directory to DB', null, + (): Promise => this.resetDB(), null, + async (): Promise => { + await this.init(); + await this.setupDB(); + }); bm.addAStep({ name: 'Saving directory to DB', fn: (): Promise => { @@ -100,7 +103,11 @@ export class BenchmarkRunner { async bmScanDirectory(): Promise { await this.init(); - const bm = new Benchmark('Scanning directory'); + const bm = new Benchmark('Scanning directory', {}, null, + null, + async (): Promise => { + await this.init(); + }); bm.addAStep({ name: 'Scanning directory', fn: async (): Promise => new ContentWrapper(await DiskMangerWorker.scanDirectory(this.biggestDirPath)) @@ -109,27 +116,31 @@ export class BenchmarkRunner { } async bmListDirectory(): Promise { - Config.Server.Indexing.reIndexingSensitivity = ReIndexingSensitivity.low; - await this.init(); - await this.setupDB(); const req = Utils.clone(this.requestTemplate); req.params.directory = this.biggestDirPath; const bm = new Benchmark('List directory', req, async (): Promise => { await ObjectManagers.reset(); await ObjectManagers.InitSQLManagers(); + }, null, + async (): Promise => { + Config.Server.Indexing.reIndexingSensitivity = ReIndexingSensitivity.low; + await this.init(); + await this.setupDB(); }); BMGalleryRouter.addDirectoryList(bm.BmExpressApp); return await bm.run(this.RUNS); } async bmListPersons(): Promise { - await this.setupDB(); - Config.Server.Indexing.reIndexingSensitivity = ReIndexingSensitivity.low; const bm = new Benchmark('Listing Faces', Utils.clone(this.requestTemplate), async (): Promise => { - await ObjectManagers.reset(); - await ObjectManagers.InitSQLManagers(); - }); + await ObjectManagers.reset(); + await ObjectManagers.InitSQLManagers(); + }, null, + async (): Promise => { + Config.Server.Indexing.reIndexingSensitivity = ReIndexingSensitivity.low; + await this.setupDB(); + }); BMPersonRouter.addGetPersons(bm.BmExpressApp); return await bm.run(this.RUNS); } @@ -234,7 +245,10 @@ export class BenchmarkRunner { const req = Utils.clone(this.requestTemplate); req.params.searchQueryDTO = JSON.stringify(entry.query); - const bm = new Benchmark('Searching for `' + entry.description + '`', req); + const bm = new Benchmark('Searching for `' + entry.description + '`', req, null, null, + async (): Promise => { + await this.setupDB(); + }); BMGalleryRouter.addSearch(bm.BmExpressApp); results.push({result: await bm.run(this.RUNS), searchQuery: entry.query}); @@ -244,10 +258,12 @@ export class BenchmarkRunner { async bmAutocomplete(text: string): Promise { - await this.setupDB(); const req = Utils.clone(this.requestTemplate); req.params.text = text; - const bm = new Benchmark('Auto complete for `' + text + '`', req); + const bm = new Benchmark('Auto complete for `' + text + '`', req, null, null, + async (): Promise => { + await this.setupDB(); + }); BMGalleryRouter.addAutoComplete(bm.BmExpressApp); return await bm.run(this.RUNS); } diff --git a/benchmark/Experiments.ts b/benchmark/Experiments.ts index fb5e9a70..4bfa5b7f 100644 --- a/benchmark/Experiments.ts +++ b/benchmark/Experiments.ts @@ -1,8 +1,8 @@ export const Experiments = { - loadPhotoMetadata: { - name: 'loadPhotoMetadata', + db: { + name: 'SQlite', groups: { - exifr: 'exifr', exifrAll: 'exifrAll', exifrSelected: 'exifrSelected', exifreader: 'exifreader', exiftool: 'exiftool' + betterSqlite: 'better-sqlite' } } }; diff --git a/benchmark/docker-compose/docker-compose.yml b/benchmark/docker-compose/docker-compose.yml index b39b9742..fcfaa25c 100644 --- a/benchmark/docker-compose/docker-compose.yml +++ b/benchmark/docker-compose/docker-compose.yml @@ -9,7 +9,7 @@ services: volumes: - "./pigallery2/benchmark_config:/app/data/config" # CHANGE ME - "db-benchmark-data:/app/data/db" - - "./pigallery2/images:/app/data/images" # CHANGE ME, ':ro' mean read-only + - "./pigallery2/images:/app/data/images:ro" # CHANGE ME, ':ro' mean read-only - "./pigallery2/tmp:/app/data/tmp" # CHANGE ME expose: - "80" diff --git a/package-lock.json b/package-lock.json index c423dd0b..cdc1773b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4630,6 +4630,15 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "better-sqlite3": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.0.tgz", + "integrity": "sha512-6FdG9DoytYGDhLW7VWW1vxjEz7xHkqK6LnaUQYA8d6GHNgZhu9PFX2xwKEEnSBRoT1J4PjTUPeg217ShxNmuPg==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.0.0" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4648,6 +4657,14 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", @@ -4684,15 +4701,6 @@ } } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", @@ -6821,6 +6829,7 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { "ms": "^2.1.1" }, @@ -6828,7 +6837,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -8351,6 +8361,11 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "filelist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", @@ -8584,14 +8599,6 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -8626,29 +8633,6 @@ "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -8924,6 +8908,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -9059,7 +9044,8 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.5", @@ -9869,6 +9855,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -12544,27 +12531,6 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, "minipass-collect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", @@ -12735,14 +12701,6 @@ } } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -13199,6 +13157,8 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "optional": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -13387,43 +13347,6 @@ "request-promise": "^4.2.2" } }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "optional": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "optional": true - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -13495,15 +13418,6 @@ "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -13546,6 +13460,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } @@ -13573,7 +13488,8 @@ "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true }, "npm-package-arg": { "version": "8.1.0", @@ -13606,16 +13522,6 @@ } } }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-pick-manifest": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", @@ -14593,24 +14499,11 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-finally": { "version": "1.0.0", @@ -17037,7 +16930,8 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "semver-dsl": { "version": "1.0.1", @@ -17948,76 +17842,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sqlite3": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz", - "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==", - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp": "3.x", - "node-pre-gyp": "^0.11.0" - }, - "dependencies": { - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, "sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -18489,17 +18313,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -19078,9 +18891,9 @@ } }, "typeconfig": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.20.tgz", - "integrity": "sha512-QxS0gL7wLa9pU8HEMCuv69HT+MDKab3DS0QwV5dCxGcrQHyqe3uhNffppTlpm0Gn7iZPqhnmE4wR7pF/lKYZGw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/typeconfig/-/typeconfig-2.0.21.tgz", + "integrity": "sha512-HfzTnl7R8+TUZ5ZlUp0Qwk57GJ5qPF9Bl1cIHrT05kxba3jjZ/cOLipVU/hMtgsS2Yr/QwyKeNTP/0UaMFgvEg==", "requires": { "minimist": "1.2.5" }, @@ -19967,6 +19780,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -20682,6 +20496,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } }, diff --git a/package.json b/package.json index 06ddbf82..99a0aaa5 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "dependencies": { "archiver": "5.3.0", "bcrypt": "5.0.1", + "better-sqlite3": "7.5.0", "cookie-parser": "1.4.6", "cookie-session": "2.0.0", "csurf": "1.11.0", @@ -49,10 +50,9 @@ "node-geocoder": "3.28.0", "reflect-metadata": "0.1.13", "sharp": "0.30.1", - "sqlite3": "5.0.2", "ts-exif-parser": "0.2.2", "ts-node-iptc": "1.0.11", - "typeconfig": "2.0.20", + "typeconfig": "2.0.21", "typeorm": "0.2.41" }, "devDependencies": { diff --git a/src/backend/model/database/sql/SQLConnection.ts b/src/backend/model/database/sql/SQLConnection.ts index 825613db..795385b0 100644 --- a/src/backend/model/database/sql/SQLConnection.ts +++ b/src/backend/model/database/sql/SQLConnection.ts @@ -55,7 +55,7 @@ export class SQLConnection { if (Config.Server.Log.sqlLevel !== SQLLogLevel.none) { options.logging = SQLLogLevel[Config.Server.Log.sqlLevel]; } - Logger.debug(LOG_TAG, 'Creating connection: ' + DatabaseType[Config.Server.Database.type]); + Logger.debug(LOG_TAG, 'Creating connection: ' + DatabaseType[Config.Server.Database.type], ', with driver:', options.type); this.connection = await this.createConnection(options); await SQLConnection.schemeSync(this.connection); } @@ -153,7 +153,7 @@ export class SQLConnection { } private static async createConnection(options: ConnectionOptions): Promise { - if (options.type === 'sqlite') { + if (options.type === 'sqlite' || options.type === 'better-sqlite3') { return await createConnection(options); } try { @@ -220,9 +220,10 @@ export class SQLConnection { }; } else if (config.type === DatabaseType.sqlite) { driver = { - type: 'sqlite', + type: 'better-sqlite3', database: path.join(ProjectPath.getAbsolutePath(config.dbFolder), config.sqlite.DBFileName) }; + } return driver; }