Skip to content

Commit c004343

Browse files
authored
Merge pull request #10 from ods/configurability
Improve configurability: params in DSN, session timeout
2 parents 4ab3eb8 + f9876e1 commit c004343

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

aiochsa/pool.py

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import asyncio
2-
from urllib.parse import urlsplit, urlunsplit
1+
from typing import Optional, Union
2+
from urllib.parse import parse_qsl, urlsplit, urlunsplit
33

4-
from aiohttp.client import ClientSession
4+
from aiohttp.client import ClientSession, ClientTimeout
55

66
from .client import Client
77

@@ -22,9 +22,10 @@ def dsn_to_params(dsn):
2222
if not database:
2323
database = 'default'
2424

25-
# XXX Parse parameters from query?
25+
params = dict(parse_qsl(parsed.query))
2626

2727
return {
28+
**params,
2829
'url': urlunsplit(('http', netloc, '', '', '')),
2930
'database': database,
3031
'user': parsed.username,
@@ -34,9 +35,26 @@ def dsn_to_params(dsn):
3435

3536
class Pool:
3637

37-
def __init__(self, dsn, client_class=Client, **params):
38-
# TODO Session and connector parameters
39-
self._session = ClientSession()
38+
DEFAULT_TIMEOUT = {
39+
'total': 5*60,
40+
'connect': None,
41+
'sock_read': 10,
42+
'sock_connect': 10,
43+
}
44+
45+
def __init__(
46+
self, dsn, session_class=ClientSession,
47+
session_timeout: Optional[Union[float, int, dict]] = None,
48+
client_class=Client, **params,
49+
):
50+
timeout_params = self.DEFAULT_TIMEOUT.copy()
51+
if isinstance(session_timeout, dict):
52+
timeout_params.update(session_timeout)
53+
else:
54+
timeout_params['total'] = session_timeout
55+
self._session = session_class(
56+
timeout=ClientTimeout(**timeout_params)
57+
)
4058
params.update(dsn_to_params(dsn))
4159
self._client = client_class(self._session, **params)
4260

tests/test_pool.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import asyncio
12
import pytest
23

4+
from aiochsa import DBException
35
from aiochsa.pool import dsn_to_params, create_pool
46

57

@@ -39,3 +41,22 @@ async def test_pool_acquire_release(pool):
3941
conn = await pool.acquire()
4042
await conn.execute('SELECT 1')
4143
await pool.release(conn)
44+
45+
46+
async def test_pool_params(dsn):
47+
async with create_pool(dsn, max_execution_time=1) as conn:
48+
with pytest.raises(DBException):
49+
await conn.execute('SELECT sleep(3)')
50+
51+
52+
async def test_pool_dsn_params(dsn):
53+
dsn += '?max_execution_time=1'
54+
async with create_pool(dsn) as conn:
55+
with pytest.raises(DBException):
56+
await conn.execute('SELECT sleep(3)')
57+
58+
59+
async def test_session_timeout(dsn):
60+
async with create_pool(dsn, session_timeout=0.1) as conn:
61+
with pytest.raises(asyncio.TimeoutError):
62+
await conn.execute('SELECT sleep(1)')

0 commit comments

Comments
 (0)