mirror of
https://github.com/frappe/books.git
synced 2024-12-22 02:49:03 +00:00
chore: switch to better-sqlite3
This commit is contained in:
parent
ca5514417e
commit
905829ca20
@ -65,7 +65,7 @@ export class BespokeQueries {
|
||||
.select('name')
|
||||
.where('accountType', 'in', ['Cash', 'Bank'])
|
||||
.andWhere('isGroup', false);
|
||||
const dateAsMonthYear = db.knex!.raw('strftime("%Y-%m", ??)', 'date');
|
||||
const dateAsMonthYear = db.knex!.raw(`strftime('%Y-%m', ??)`, 'date');
|
||||
return await db.knex!('AccountingLedgerEntry')
|
||||
.where('reverted', false)
|
||||
.sum({
|
||||
|
@ -59,16 +59,10 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
super();
|
||||
this.dbPath = dbPath ?? ':memory:';
|
||||
this.connectionParams = {
|
||||
client: 'sqlite3',
|
||||
client: 'better-sqlite3',
|
||||
connection: {
|
||||
filename: this.dbPath,
|
||||
},
|
||||
pool: {
|
||||
afterCreate(conn: { run: (query: string) => void }, done: () => void) {
|
||||
conn.run('PRAGMA foreign_keys=ON');
|
||||
done();
|
||||
},
|
||||
},
|
||||
useNullAsDefault: true,
|
||||
asyncStackTraces: process.env.NODE_ENV === 'development',
|
||||
};
|
||||
@ -77,7 +71,7 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
static async getCountryCode(dbPath: string): Promise<string> {
|
||||
let countryCode = 'in';
|
||||
const db = new DatabaseCore(dbPath);
|
||||
db.connect();
|
||||
await db.connect();
|
||||
|
||||
let query: { value: string }[] = [];
|
||||
try {
|
||||
@ -101,11 +95,12 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
this.schemaMap = schemaMap;
|
||||
}
|
||||
|
||||
connect() {
|
||||
async connect() {
|
||||
this.knex = knex(this.connectionParams);
|
||||
this.knex.on('query-error', (error) => {
|
||||
error.type = this.#getError(error);
|
||||
});
|
||||
await this.knex.raw('PRAGMA foreign_keys=ON');
|
||||
}
|
||||
|
||||
async close() {
|
||||
@ -113,8 +108,13 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
}
|
||||
|
||||
async commit() {
|
||||
/**
|
||||
* this auto commits, commit is not required
|
||||
* will later wrap the outermost functions in
|
||||
* transactions.
|
||||
*/
|
||||
try {
|
||||
await this.knex!.raw('commit');
|
||||
// await this.knex!.raw('commit');
|
||||
} catch (err) {
|
||||
const type = this.#getError(err as Error);
|
||||
if (type !== CannotCommitError) {
|
||||
|
@ -29,7 +29,7 @@ export class DatabaseManager extends DatabaseDemuxBase {
|
||||
countryCode ??= await DatabaseCore.getCountryCode(dbPath);
|
||||
|
||||
this.db = new DatabaseCore(dbPath);
|
||||
this.db.connect();
|
||||
await this.db.connect();
|
||||
|
||||
const schemaMap = getSchemas(countryCode);
|
||||
this.db.setSchemaMap(schemaMap);
|
||||
|
@ -35,8 +35,8 @@ describe('DatabaseCore: Connect Migrate Close', function () {
|
||||
assert.strictEqual(schemaMap, db.schemaMap);
|
||||
});
|
||||
|
||||
specify('connect', function () {
|
||||
assert.doesNotThrow(() => db.connect());
|
||||
specify('connect', async function () {
|
||||
await assertDoesNotThrow(async () => await db.connect());
|
||||
assert.notStrictEqual(db.knex, undefined);
|
||||
});
|
||||
|
||||
@ -54,7 +54,7 @@ describe('DatabaseCore: Migrate and Check Db', function () {
|
||||
|
||||
this.beforeEach(async function () {
|
||||
db = new DatabaseCore();
|
||||
db.connect();
|
||||
await db.connect();
|
||||
db.setSchemaMap(schemaMap);
|
||||
});
|
||||
|
||||
@ -147,7 +147,7 @@ describe('DatabaseCore: CRUD', function () {
|
||||
|
||||
this.beforeEach(async function () {
|
||||
db = new DatabaseCore();
|
||||
db.connect();
|
||||
await db.connect();
|
||||
db.setSchemaMap(schemaMap);
|
||||
await db.migrate();
|
||||
});
|
||||
|
@ -261,7 +261,7 @@ function toDocCheck(value: RawValue, field: Field): boolean {
|
||||
}
|
||||
|
||||
if (typeof value === 'string') {
|
||||
return value === '1';
|
||||
return !!parseFloat(value);
|
||||
}
|
||||
|
||||
if (typeof value === 'number') {
|
||||
|
@ -17,8 +17,7 @@ export class DatabaseDemux extends DatabaseDemuxBase {
|
||||
|
||||
if (response.error?.name) {
|
||||
const { name, message, stack } = response.error;
|
||||
const dberror = new DatabaseError(message);
|
||||
dberror.name = name;
|
||||
const dberror = new DatabaseError(`${name}\n${message}`);
|
||||
dberror.stack = stack;
|
||||
|
||||
throw dberror;
|
||||
|
@ -1,13 +1,9 @@
|
||||
import { t } from './translation';
|
||||
|
||||
export class BaseError extends Error {
|
||||
label: string;
|
||||
message: string;
|
||||
statusCode: number;
|
||||
|
||||
constructor(statusCode: number, message: string) {
|
||||
super(message);
|
||||
this.label = t`Base Error`;
|
||||
this.name = 'BaseError';
|
||||
this.statusCode = statusCode;
|
||||
this.message = message;
|
||||
@ -17,7 +13,6 @@ export class BaseError extends Error {
|
||||
export class ValidationError extends BaseError {
|
||||
constructor(message: string) {
|
||||
super(417, message);
|
||||
this.label = t`Validation Error`;
|
||||
this.name = 'ValidationError';
|
||||
}
|
||||
}
|
||||
@ -25,7 +20,6 @@ export class ValidationError extends BaseError {
|
||||
export class NotFoundError extends BaseError {
|
||||
constructor(message: string) {
|
||||
super(404, message);
|
||||
this.label = t`Not Found Error`;
|
||||
this.name = 'NotFoundError';
|
||||
}
|
||||
}
|
||||
@ -33,7 +27,6 @@ export class NotFoundError extends BaseError {
|
||||
export class ForbiddenError extends BaseError {
|
||||
constructor(message: string) {
|
||||
super(403, message);
|
||||
this.label = t`Forbidden Error`;
|
||||
this.name = 'ForbiddenError';
|
||||
}
|
||||
}
|
||||
@ -41,7 +34,6 @@ export class ForbiddenError extends BaseError {
|
||||
export class DuplicateEntryError extends ValidationError {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.label = t`Duplicate Entry Error`;
|
||||
this.name = 'DuplicateEntryError';
|
||||
}
|
||||
}
|
||||
@ -49,7 +41,6 @@ export class DuplicateEntryError extends ValidationError {
|
||||
export class LinkValidationError extends ValidationError {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.label = t`Link Validation Error`;
|
||||
this.name = 'LinkValidationError';
|
||||
}
|
||||
}
|
||||
@ -57,7 +48,6 @@ export class LinkValidationError extends ValidationError {
|
||||
export class MandatoryError extends ValidationError {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.label = t`Mandatory Error`;
|
||||
this.name = 'MandatoryError';
|
||||
}
|
||||
}
|
||||
@ -65,7 +55,6 @@ export class MandatoryError extends ValidationError {
|
||||
export class DatabaseError extends BaseError {
|
||||
constructor(message: string) {
|
||||
super(500, message);
|
||||
this.label = t`Database Error`;
|
||||
this.name = 'DatabaseError';
|
||||
}
|
||||
}
|
||||
@ -73,7 +62,6 @@ export class DatabaseError extends BaseError {
|
||||
export class CannotCommitError extends DatabaseError {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.label = t`Cannot Commit Error`;
|
||||
this.name = 'CannotCommitError';
|
||||
}
|
||||
}
|
||||
@ -81,7 +69,6 @@ export class CannotCommitError extends DatabaseError {
|
||||
export class NotImplemented extends BaseError {
|
||||
constructor() {
|
||||
super(501, '');
|
||||
this.label = t`Not Implemented`;
|
||||
this.name = 'NotImplemented';
|
||||
}
|
||||
}
|
||||
|
14
package.json
14
package.json
@ -11,25 +11,26 @@
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"lint": "vue-cli-service lint",
|
||||
"postinstall": "electron-rebuild",
|
||||
"postuninstall": "electron-rebuild",
|
||||
"electron:build": "vue-cli-service electron:build",
|
||||
"electron:serve": "vue-cli-service electron:serve",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"postuninstall": "electron-builder install-app-deps",
|
||||
"script:translate": "ts-node -O '{\"module\":\"commonjs\"}' scripts/generateTranslations.ts",
|
||||
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --reporter nyan --require ts-node/register --require tsconfig-paths/register ./**/tests/**/*.spec.ts --exit"
|
||||
"script:translate": "scripts/runner.sh scripts/generateTranslations.ts",
|
||||
"script:profile": "scripts/profile.sh",
|
||||
"test": "scripts/runner.sh ./node_modules/.bin/mocha ./**/tests/**/*.spec.ts --exit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@popperjs/core": "^2.10.2",
|
||||
"better-sqlite3": "^7.5.3",
|
||||
"core-js": "^3.19.0",
|
||||
"csvjson-csv2json": "^5.0.6",
|
||||
"electron-store": "^8.0.1",
|
||||
"feather-icons": "^4.28.0",
|
||||
"knex": "^0.95.12",
|
||||
"knex": "^2.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"luxon": "^2.0.2",
|
||||
"node-fetch": "2",
|
||||
"pesa": "^1.1.11",
|
||||
"sqlite3": "npm:@vscode/sqlite3@^5.0.7",
|
||||
"vue": "^3.2.30",
|
||||
"vue-router": "^4.0.12"
|
||||
},
|
||||
@ -57,6 +58,7 @@
|
||||
"electron-builder": "^23.0.3",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-notarize": "^1.1.1",
|
||||
"electron-rebuild": "^3.2.7",
|
||||
"electron-updater": "^4.3.9",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
|
@ -1,4 +1,4 @@
|
||||
#! /bin/sh
|
||||
#! /usr/bin/env zsh
|
||||
|
||||
# https://nodejs.org/en/docs/guides/simple-profiling/
|
||||
|
||||
@ -7,9 +7,12 @@ export TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}'
|
||||
rm ./isolate-*-v8.log 2> /dev/null
|
||||
rm ./profiler-output.log 2> /dev/null
|
||||
|
||||
export ELECTRON_RUN_AS_NODE=true
|
||||
alias electron_node=./node_modules/.bin/electron
|
||||
|
||||
echo "running profile.ts"
|
||||
node --require ts-node/register --require tsconfig-paths/register --prof ./scripts/profile.ts
|
||||
electron_node --require ts-node/register --require tsconfig-paths/register --prof ./scripts/profile.ts
|
||||
|
||||
echo "processing tick file"
|
||||
node --prof-process ./isolate-*-v8.log > ./profiler-output.log && echo "generated profiler-output.log"
|
||||
electron_node --prof-process ./isolate-*-v8.log > ./profiler-output.log && echo "generated profiler-output.log"
|
||||
rm ./isolate-*-v8.log
|
10
scripts/runner.sh
Executable file
10
scripts/runner.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#! /usr/bin/env zsh
|
||||
|
||||
# basically uses electron's node to prevent
|
||||
# mismatch in NODE_MODULE_VERSION when running
|
||||
# better-sqlite3
|
||||
|
||||
export TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}'
|
||||
export ELECTRON_RUN_AS_NODE=true
|
||||
alias electron_node="./node_modules/.bin/electron --require ts-node/register --require tsconfig-paths/register"
|
||||
electron_node $@
|
@ -3,7 +3,7 @@ import { t } from 'fyo';
|
||||
import { ConfigKeys } from 'fyo/core/types';
|
||||
import { Doc } from 'fyo/model/doc';
|
||||
import { TelemetrySetting } from 'fyo/telemetry/types';
|
||||
import { BaseError, MandatoryError, ValidationError } from 'fyo/utils/errors';
|
||||
import { MandatoryError, ValidationError } from 'fyo/utils/errors';
|
||||
import { ErrorLog } from 'fyo/utils/types';
|
||||
import { IPC_ACTIONS, IPC_MESSAGES } from 'utils/messages';
|
||||
import { fyo } from './initFyo';
|
||||
@ -45,7 +45,7 @@ async function reportError(errorLogObj: ErrorLog, cb?: Function) {
|
||||
|
||||
function getToastProps(errorLogObj: ErrorLog, canLog: boolean, cb?: Function) {
|
||||
const props: ToastOptions = {
|
||||
message: t`Error: ` + errorLogObj.name,
|
||||
message: errorLogObj.name ?? t`Error`,
|
||||
type: 'error',
|
||||
};
|
||||
|
||||
@ -93,7 +93,6 @@ export function handleError(
|
||||
|
||||
const errorLogObj = getErrorLogObject(error, more ?? {});
|
||||
|
||||
// @ts-ignore
|
||||
const canLog = getCanLog();
|
||||
if (canLog) {
|
||||
reportError(errorLogObj, cb);
|
||||
@ -106,7 +105,7 @@ export async function handleErrorWithDialog(error: Error, doc?: Doc) {
|
||||
const errorMessage = getErrorMessage(error, doc);
|
||||
handleError(false, error, { errorMessage, doc });
|
||||
|
||||
const name = (error as BaseError).label ?? error.name;
|
||||
const name = error.name ?? t`Error`;
|
||||
await showMessageDialog({ message: name, detail: errorMessage });
|
||||
throw error;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user