diff --git a/package-lock.json b/package-lock.json
index 3b588d250..eb4048395 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -44,7 +44,7 @@
"jsdom": "19.0.0",
"mime-types": "2.1.34",
"multer": "1.4.4",
- "node-abi": "3.5.0",
+ "node-abi": "3.7.0",
"normalize-strings": "1.1.1",
"open": "8.4.0",
"portscanner": "2.2.0",
@@ -7765,9 +7765,9 @@
"dev": true
},
"node_modules/node-abi": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz",
- "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.7.0.tgz",
+ "integrity": "sha512-3J+U4CvxVNEk9+lGdJkmYbN8cIN0HMTDT9R0ezX7pmp7aD6BaKsfAHwVn3IvVg6pYIRUuQ+gHW1eawrvywnSQQ==",
"dependencies": {
"semver": "^7.3.5"
},
@@ -17345,9 +17345,9 @@
"dev": true
},
"node-abi": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz",
- "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.7.0.tgz",
+ "integrity": "sha512-3J+U4CvxVNEk9+lGdJkmYbN8cIN0HMTDT9R0ezX7pmp7aD6BaKsfAHwVn3IvVg6pYIRUuQ+gHW1eawrvywnSQQ==",
"requires": {
"semver": "^7.3.5"
}
diff --git a/package.json b/package.json
index c9be06397..97e1bbb24 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
"jsdom": "19.0.0",
"mime-types": "2.1.34",
"multer": "1.4.4",
- "node-abi": "3.5.0",
+ "node-abi": "3.7.0",
"normalize-strings": "1.1.1",
"open": "8.4.0",
"portscanner": "2.2.0",
diff --git a/src/public/app/dialogs/options/advanced.js b/src/public/app/dialogs/options/advanced.js
index 930fa5669..1c8c1b10e 100644
--- a/src/public/app/dialogs/options/advanced.js
+++ b/src/public/app/dialogs/options/advanced.js
@@ -13,6 +13,12 @@ const TPL = `
+
Database integrity check
+
+This will check that the database is not corrupted on the SQLite level. It might take some time, depending on the DB size.
+
+
+
Consistency checks
@@ -37,9 +43,9 @@ export default class AdvancedOptions {
this.$forceFullSyncButton = $("#force-full-sync-button");
this.$fillEntityChangesButton = $("#fill-entity-changes-button");
this.$anonymizeButton = $("#anonymize-button");
- this.$backupDatabaseButton = $("#backup-database-button");
this.$vacuumDatabaseButton = $("#vacuum-database-button");
this.$findAndFixConsistencyIssuesButton = $("#find-and-fix-consistency-issues-button");
+ this.$checkIntegrityButton = $("#check-integrity-button");
this.$forceFullSyncButton.on('click', async () => {
await server.post('sync/force-full-sync');
@@ -75,5 +81,16 @@ export default class AdvancedOptions {
toastService.showMessage("Consistency issues should be fixed.");
});
+
+ this.$checkIntegrityButton.on('click', async () => {
+ const {results} = await server.get('database/check-integrity');
+
+ if (results.length === 1 && results[0].integrity_check === "ok") {
+ toastService.showMessage("Integrity check succeeded - no problems found.");
+ }
+ else {
+ toastService.showMessage("Integrity check failed: " + JSON.stringify(results, null, 2), 15000);
+ }
+ });
}
}
diff --git a/src/routes/api/database.js b/src/routes/api/database.js
index 286135171..40b22f9cf 100644
--- a/src/routes/api/database.js
+++ b/src/routes/api/database.js
@@ -22,6 +22,16 @@ function vacuumDatabase() {
log.info("Database has been vacuumed.");
}
+function checkIntegrity() {
+ const results = sql.getRows("PRAGMA integrity_check");
+
+ log.info("Integrity check result: " + JSON.stringify(results));
+
+ return {
+ results
+ };
+}
+
function findAndFixConsistencyIssues() {
consistencyChecksService.runOnDemandChecks(true);
}
@@ -30,5 +40,6 @@ module.exports = {
backupDatabase,
vacuumDatabase,
findAndFixConsistencyIssues,
- anonymize
+ anonymize,
+ checkIntegrity
};
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 1e7eb5674..9681211e8 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -334,6 +334,8 @@ function register(app) {
route(POST, '/api/database/find-and-fix-consistency-issues', [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.findAndFixConsistencyIssues, apiResultHandler, false);
+ apiRoute(GET, '/api/database/check-integrity', databaseRoute.checkIntegrity);
+
apiRoute(POST, '/api/script/exec', scriptRoute.exec);
apiRoute(POST, '/api/script/run/:noteId', scriptRoute.run);
apiRoute(GET, '/api/script/startup', scriptRoute.getStartupBundles);
@@ -387,7 +389,7 @@ function register(app) {
apiRoute(DELETE, '/api/etapi-tokens/:etapiTokenId', etapiTokensApiRoutes.deleteToken);
shareRoutes.register(router);
-
+
etapiAuthRoutes.register(router);
etapiAttributeRoutes.register(router);
etapiBranchRoutes.register(router);