From 6116f05e58726da902a67b53fe07793046a366ae Mon Sep 17 00:00:00 2001 From: keke001009 Date: Sun, 27 Feb 2022 09:00:13 +0900 Subject: [PATCH] Add query-logger --- lib/connectors/mysql-connector.ts | 3 +++ lib/connectors/postgres-connector.ts | 3 +++ lib/connectors/sqlite3-connector.ts | 4 ++++ lib/database.ts | 5 +++++ lib/query-logger.ts | 32 ++++++++++++++++++++++++++++ tests/connection.ts | 6 ++++++ 6 files changed, 53 insertions(+) create mode 100644 lib/query-logger.ts diff --git a/lib/connectors/mysql-connector.ts b/lib/connectors/mysql-connector.ts index 866716a..5f473a7 100644 --- a/lib/connectors/mysql-connector.ts +++ b/lib/connectors/mysql-connector.ts @@ -4,6 +4,7 @@ import type { Connector, ConnectorOptions } from "./connector.ts"; import { SQLTranslator } from "../translators/sql-translator.ts"; import type { SupportedSQLDatabaseDialect } from "../translators/sql-translator.ts"; import type { QueryDescription } from "../query-builder.ts"; +import { QueryLogger } from "../query-logger.ts"; export interface MySQLOptions extends ConnectorOptions { database: string; @@ -67,6 +68,7 @@ export class MySQLConnector implements Connector { client?: MySQLClient | MySQLConnection, // deno-lint-ignore no-explicit-any ): Promise { + const start = QueryLogger.start(); await this._makeConnection(); const queryClient = client ?? this._client; @@ -80,6 +82,7 @@ export class MySQLConnector implements Connector { const result = await queryClient[queryMethod](subqueries[i]); if (i === subqueries.length - 1) { + QueryLogger.end(start, query); return result; } } diff --git a/lib/connectors/postgres-connector.ts b/lib/connectors/postgres-connector.ts index c1c838f..86b6e25 100644 --- a/lib/connectors/postgres-connector.ts +++ b/lib/connectors/postgres-connector.ts @@ -3,6 +3,7 @@ import type { Connector, ConnectorOptions } from "./connector.ts"; import { SQLTranslator } from "../translators/sql-translator.ts"; import type { SupportedSQLDatabaseDialect } from "../translators/sql-translator.ts"; import type { QueryDescription } from "../query-builder.ts"; +import { QueryLogger } from "../query-logger.ts"; import type { Values } from "../data-types.ts"; interface PostgresOptionsWithConfig extends ConnectorOptions { @@ -70,11 +71,13 @@ export class PostgresConnector implements Connector { // deno-lint-ignore no-explicit-any async query(queryDescription: QueryDescription): Promise { + const start = QueryLogger.start(); await this._makeConnection(); const query = this._translator.translateToQuery(queryDescription); const response = await this._client.queryObject(query); const results = response.rows as Values[]; + QueryLogger.end(start, query); if (queryDescription.type === "insert") { return results.length === 1 ? results[0] : results; diff --git a/lib/connectors/sqlite3-connector.ts b/lib/connectors/sqlite3-connector.ts index 7b3e254..0a703ff 100644 --- a/lib/connectors/sqlite3-connector.ts +++ b/lib/connectors/sqlite3-connector.ts @@ -1,6 +1,7 @@ import { SQLiteClient } from "../../deps.ts"; import type { Connector, ConnectorOptions } from "./connector.ts"; import type { QueryDescription } from "../query-builder.ts"; +import { QueryLogger } from "../query-logger.ts"; import type { FieldValue } from "../data-types.ts"; import { SQLTranslator } from "../translators/sql-translator.ts"; import type { SupportedSQLDatabaseDialect } from "../translators/sql-translator.ts"; @@ -50,6 +51,7 @@ export class SQLite3Connector implements Connector { // deno-lint-ignore no-explicit-any query(queryDescription: QueryDescription): Promise { + const start = QueryLogger.start(); this._makeConnection(); const query = this._translator.translateToQuery(queryDescription); @@ -65,6 +67,7 @@ export class SQLite3Connector implements Connector { } if (response.length === 0) { + QueryLogger.end(start, query); if (queryDescription.type === "insert" && queryDescription.values) { return { affectedRows: this._client.changes, @@ -96,6 +99,7 @@ export class SQLite3Connector implements Connector { result[columnName] = value as FieldValue; } } + QueryLogger.end(start, query); return result; }); }); diff --git a/lib/database.ts b/lib/database.ts index 48e884e..c0237dc 100644 --- a/lib/database.ts +++ b/lib/database.ts @@ -6,6 +6,7 @@ import type { ModelSchema, } from "./model.ts"; import { QueryBuilder, QueryDescription } from "./query-builder.ts"; +import { QueryLogger, LoggerOptions } from "./query-logger.ts"; import { formatResultToModelInstance } from "./helpers/results.ts"; import { Translator } from "./translators/translator.ts"; import { connectorFactory } from "./connectors/factory.ts"; @@ -106,6 +107,10 @@ export class Database { } this._queryBuilder = new QueryBuilder(); + const loggerOptions = connectionOptions as LoggerOptions; + if (typeof loggerOptions?.queryLogger === "function") { + QueryLogger.init(loggerOptions.queryLogger); + } } private static _isInDialectForm( diff --git a/lib/query-logger.ts b/lib/query-logger.ts new file mode 100644 index 0000000..0dd5478 --- /dev/null +++ b/lib/query-logger.ts @@ -0,0 +1,32 @@ +export type LogHandler = (query: string, execTime?: number) => void; +export interface LoggerOptions { + queryLogger: LogHandler; +} + +export class QueryLogger { + private static _single: QueryLogger; + private _logger: LogHandler; + constructor(logger: LogHandler) { + this._logger = logger; + } + + static init(logger: LogHandler) { + if (this._single) { + return this._single; + } + this._single = new QueryLogger(logger); + return this._single; + } + + static start(): Date { + const start = new Date(); + return start; + } + + static end(start: Date, query: string) { + if (!this._single) return; + const end = new Date(); + const execTime = end.getTime() - start.getTime(); + this._single._logger(query, execTime); + } +} diff --git a/tests/connection.ts b/tests/connection.ts index ba54c23..1166ff3 100644 --- a/tests/connection.ts +++ b/tests/connection.ts @@ -21,6 +21,9 @@ const getMySQLConnection = (options = {}, debug = true): Database => { { ...defaultMySQLOptions, ...options, + queryLogger : (query : string, execTime : number)=>{ + console.log(`[${execTime} ms] ${query}`) + } }, ); @@ -33,6 +36,9 @@ const getSQLiteConnection = (options = {}, debug = true): Database => { { ...defaultSQLiteOptions, ...options, + queryLogger : (query : string, execTime : number)=>{ + console.log(`[${execTime} ms] ${query}`) + } }, );