add logging to pg

This commit is contained in:
Tobe O 2019-02-07 22:48:02 -05:00
parent b01ec41b1f
commit 3fb360147d
3 changed files with 39 additions and 12 deletions

View file

@ -1,3 +1,6 @@
# 1.0.0-dev.2
* Add optional logging.
# 1.0.0-dev.1 # 1.0.0-dev.1
* Changes to work with `package:angel_orm@2.0.0-dev.15`. * Changes to work with `package:angel_orm@2.0.0-dev.15`.

View file

@ -1,16 +1,23 @@
import 'dart:async'; import 'dart:async';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:logging/logging.dart';
import 'package:pool/pool.dart'; import 'package:pool/pool.dart';
import 'package:postgres/postgres.dart'; import 'package:postgres/postgres.dart';
/// A [QueryExecutor] that queries a PostgreSQL database. /// A [QueryExecutor] that queries a PostgreSQL database.
class PostgreSQLExecutor extends QueryExecutor { class PostgreSQLExecutor extends QueryExecutor {
PostgreSQLExecutionContext connection; PostgreSQLExecutionContext _connection;
PostgreSQLExecutor(this.connection); /// An optional [Logger] to print information to.
final Logger logger;
PostgreSQLExecutor(this._connection, {this.logger});
/// The underlying connection.
PostgreSQLExecutionContext get connection => _connection;
/// Closes the connection. /// Closes the connection.
Future close() => (connection as PostgreSQLConnection).close(); Future close() => (_connection as PostgreSQLConnection).close();
@override @override
Future<List<List>> query( Future<List<List>> query(
@ -22,21 +29,25 @@ class PostgreSQLExecutor extends QueryExecutor {
query = '$query $returning'; query = '$query $returning';
} }
return connection.query(query, substitutionValues: substitutionValues); logger?.fine('Query: $query');
logger?.fine('Values: $substitutionValues');
return _connection.query(query, substitutionValues: substitutionValues);
} }
@override @override
Future<T> transaction<T>(FutureOr<T> Function() f) async { Future<T> transaction<T>(FutureOr<T> Function() f) async {
if (connection is! PostgreSQLConnection) return await f(); if (_connection is! PostgreSQLConnection) return await f();
var old = connection; var old = _connection;
T result; T result;
try { try {
await (connection as PostgreSQLConnection).transaction((ctx) async { logger?.fine('Entering transaction');
connection = ctx; await (_connection as PostgreSQLConnection).transaction((ctx) async {
_connection = ctx;
result = await f(); result = await f();
}); });
} finally { } finally {
connection = old; _connection = old;
logger?.fine('Exiting transaction');
return result; return result;
} }
} }
@ -44,13 +55,22 @@ class PostgreSQLExecutor extends QueryExecutor {
/// A [QueryExecutor] that manages a pool of PostgreSQL connections. /// A [QueryExecutor] that manages a pool of PostgreSQL connections.
class PostgreSQLExecutorPool extends QueryExecutor { class PostgreSQLExecutorPool extends QueryExecutor {
/// The maximum amount of concurrent connections.
final int size; final int size;
/// Creates a new [PostgreSQLConnection], on demand.
///
/// The created connection should **not** be open.
final PostgreSQLConnection Function() connectionFactory; final PostgreSQLConnection Function() connectionFactory;
/// An optional [Logger] to print information to.
final Logger logger;
final List<PostgreSQLExecutor> _connections = []; final List<PostgreSQLExecutor> _connections = [];
int _index = 0; int _index = 0;
final Pool _pool, _connMutex = new Pool(1); final Pool _pool, _connMutex = new Pool(1);
PostgreSQLExecutorPool(this.size, this.connectionFactory) PostgreSQLExecutorPool(this.size, this.connectionFactory, {this.logger})
: _pool = new Pool(size) { : _pool = new Pool(size) {
assert(size > 0, 'Connection pool cannot be empty.'); assert(size > 0, 'Connection pool cannot be empty.');
} }
@ -65,8 +85,11 @@ class PostgreSQLExecutorPool extends QueryExecutor {
Future _open() async { Future _open() async {
if (_connections.isEmpty) { if (_connections.isEmpty) {
_connections.addAll(await Future.wait(new List.generate(size, (_) { _connections.addAll(await Future.wait(new List.generate(size, (_) {
logger?.fine('Spawning connections...');
var conn = connectionFactory(); var conn = connectionFactory();
return conn.open().then((_) => new PostgreSQLExecutor(conn)); return conn
.open()
.then((_) => new PostgreSQLExecutor(conn, logger: logger));
}))); })));
} }
} }

View file

@ -1,5 +1,5 @@
name: angel_orm_postgres name: angel_orm_postgres
version: 1.0.0-dev.1 version: 1.0.0-dev.2
description: PostgreSQL support for Angel's ORM. Includes functionality for querying and transactions. description: PostgreSQL support for Angel's ORM. Includes functionality for querying and transactions.
author: Tobe O <thosakwe@gmail.com> author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/orm homepage: https://github.com/angel-dart/orm
@ -7,6 +7,7 @@ environment:
sdk: '>=2.0.0-dev.1.2 <3.0.0' sdk: '>=2.0.0-dev.1.2 <3.0.0'
dependencies: dependencies:
angel_orm: ^2.0.0-dev angel_orm: ^2.0.0-dev
logging: ^0.11.0
pool: ^1.0.0 pool: ^1.0.0
postgres: ^1.0.0 postgres: ^1.0.0
dev_dependencies: dev_dependencies: