Skip to content

Commit 9893433

Browse files
authored
implement SqliteAdapter.logger (#110)
* implement SqliteAdapter.logger * use setLogLevel function * 2.10.0
1 parent 0d871b0 commit 9893433

6 files changed

Lines changed: 62 additions & 15 deletions

File tree

jest.setup.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
require('dotenv').config();
22
const { JsonLogger } = require('@themost/json-logger');
33
const { TraceUtils } = require('@themost/common');
4+
5+
if (typeof JsonLogger.prototype.setLogLevel !== 'function') {
6+
Object.assign(JsonLogger.prototype, {
7+
/**
8+
* @param {string} level
9+
*/
10+
setLogLevel(level) {
11+
const logLevel = [ 'error', 'warn', 'info', 'verbose', 'debug' ].indexOf(level);
12+
if (logLevel > -1) {
13+
this.level = logLevel;
14+
}
15+
}
16+
})
17+
}
18+
419
process.env.NODE_ENV = 'development';
520
TraceUtils.useLogger(new JsonLogger({
621
format: 'raw'

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@themost/sqlite",
3-
"version": "2.9.3",
3+
"version": "2.10.0",
44
"description": "MOST Web Framework SQLite Adapter",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

spec/TestApplication.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {DataApplication, DataConfigurationStrategy, DataCacheStrategy, DataConte
33
import { createInstance } from '../src';
44

55
const testConnectionOptions = {
6-
'database': 'spec/db/local.db'
6+
'database': 'spec/db/local.db',
7+
'logLevel': 'debug'
78
};
89

910

src/SqliteAdapter.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11

22
// MOST Web Framework Codename Zero Gravity Copyright (c) 2017-2022, THEMOST LP
3-
import { DataAdapterBase, DataAdapterIndexes, DataAdapterMigration, DataAdapterTable, DataAdapterView } from '@themost/common';
3+
import { DataAdapterBase, DataAdapterIndexes, DataAdapterMigration, DataAdapterTable, DataAdapterView, TraceLogger } from '@themost/common';
44
import { QueryExpression, SqlFormatter } from '@themost/query';
55
import {AsyncSeriesEventEmitter} from '@themost/events';
66

77
export declare class SqliteAdapter implements DataAdapterBase {
88
executing: AsyncSeriesEventEmitter<{target: SqliteAdapter, query: (string|QueryExpression), params?: unknown[]}>;
99
executed: AsyncSeriesEventEmitter<{target: SqliteAdapter, query: (string|QueryExpression), params?: unknown[], results: uknown[]}>;
1010

11-
constructor(options: { database: string, extensions?: { [key: string]: string }, retry?: number, retryInterval?: number });
11+
logger: TraceLogger;
12+
13+
constructor(options: { database: string, extensions?: { [key: string]: string }, retry?: number, retryInterval?: number, logLevel?: 'error' | 'warn' | 'info' | 'verbose' | 'debug' });
1214
rawConnection?: any;
1315
options?: { database: string, extensions?: { [key: string]: string }, retry?: number, retryInterval?: number };
1416
selectIdentityAsync(entity: string, attribute: string): Promise<any>;

src/SqliteAdapter.js

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,29 @@ function onReceivingJsonObject(event) {
6363
}
6464
}
6565

66+
/**
67+
*
68+
* @returns {import('@themost/common').TraceLogger}
69+
*/
70+
function createLogger() {
71+
if (typeof TraceUtils.newLogger === 'function') {
72+
return TraceUtils.newLogger();
73+
}
74+
const [loggerProperty] = Object.getOwnPropertySymbols(TraceUtils);
75+
const logger = TraceUtils[loggerProperty];
76+
const newLogger = Object.create(TraceUtils[loggerProperty]);
77+
newLogger.options = Object.assign({}, logger.options);
78+
return newLogger;
79+
}
80+
6681

6782
class SqliteAdapter {
6883
/**
6984
* @param {*} options
7085
*/
7186
constructor(options) {
7287
/**
73-
* @type {{database: string,retry: number=,retryInterval: number=}}
88+
* @type {{database: string,retry: number=,retryInterval: number=,logLevel:string=}}
7489
*/
7590
this.options = options || { database: ':memory:' };
7691
// set defaults
@@ -88,7 +103,22 @@ class SqliteAdapter {
88103
this.executed = new AsyncSeriesEventEmitter();
89104

90105
this.executed.subscribe(onReceivingJsonObject);
91-
106+
/**
107+
* create a new instance of logger
108+
* @type {import('@themost/common').TraceLogger}
109+
*/
110+
this.logger = createLogger();
111+
// use log level from connection options, if any
112+
if (typeof this.options.logLevel === 'string' && this.options.logLevel.length) {
113+
// if the logger has level(string) function
114+
if (typeof this.logger.level === 'function') {
115+
// try to set log level
116+
this.logger.level(this.options.logLevel);
117+
// otherwise, check if logger has setLogLevel(string) function
118+
} else if (typeof this.logger.setLogLevel === 'function') {
119+
this.logger.setLogLevel(this.options.logLevel);
120+
}
121+
}
92122
}
93123
open(callback) {
94124
const self = this;
@@ -147,8 +177,8 @@ class SqliteAdapter {
147177
}
148178
}
149179
catch (err) {
150-
TraceUtils.log('An error occurred while closing database.');
151-
TraceUtils.log(err);
180+
this.logger.warn('An error occurred while closing database.');
181+
this.logger.warn(err);
152182
//call callback without error
153183
callback();
154184
}
@@ -1153,8 +1183,7 @@ class SqliteAdapter {
11531183
}
11541184
else {
11551185
//log statement (optional)
1156-
if (process.env.NODE_ENV === 'development')
1157-
TraceUtils.log(sprintf('SQL:%s, Parameters:%s', sql, JSON.stringify(values)));
1186+
self.logger.debug(`SQL:${sql}, Parameters:${JSON.stringify(values)}`);
11581187
//prepare statement - the traditional way
11591188
const prepared = self.prepare(sql, values);
11601189
let fn;
@@ -1173,7 +1202,7 @@ class SqliteAdapter {
11731202
if (err.code === 'SQLITE_BUSY') {
11741203
const shouldRetry = typeof self.options.retry === 'number' && self.options.retry > 0;
11751204
if (shouldRetry === false) {
1176-
TraceUtils.error(`SQL Error: ${prepared}`);
1205+
self.logger.error(`SQL Error: ${prepared}`);
11771206
return callback(err);
11781207
}
11791208
const retry = self.options.retry;
@@ -1196,7 +1225,7 @@ class SqliteAdapter {
11961225
}
11971226
// retry
11981227
callback.retry += retryInterval;
1199-
TraceUtils.warn(`'SQL Error:${prepared}. Retrying in ${callback.retry} ms.'`);
1228+
self.logger.warn(`'SQL Error:${prepared}. Retrying in ${callback.retry} ms.'`);
12001229
return setTimeout(function () {
12011230
self.execute(query, values, callback);
12021231
}, callback.retry);
@@ -1205,7 +1234,7 @@ class SqliteAdapter {
12051234
if (Object.prototype.hasOwnProperty.call(callback, 'retry')) {
12061235
delete callback.retry;
12071236
}
1208-
TraceUtils.error(`SQL Error: ${prepared}`);
1237+
self.logger.error(`SQL Error: ${prepared}`);
12091238
callback(err);
12101239
}
12111240
else {

0 commit comments

Comments
 (0)