userver
C++ Async Framework
Toggle main menu visibility
Loading...
Searching...
No Matches
connection.py
1
import
dataclasses
2
import
urllib.parse
3
4
_BOOL_TO_STR = {
True
:
'true'
,
False
:
'false'
}
5
_STR_TO_BOOL = {value: key
for
key, value
in
_BOOL_TO_STR.items()}
6
7
8
@dataclasses.dataclass(frozen=True)
9
class
ConnectionInfo
:
10
"""Mongodb connection uri parameters"""
11
12
host: str
13
port: int
14
dbname: str |
None
=
None
15
retry_writes: bool |
None
=
None
16
17
def
get_uri
(
18
self,
19
dbname: str |
None
=
None
,
20
retry_writes: bool |
None
=
None
,
21
) -> str:
22
"""Get mongodb connection uri"""
23
if
dbname
is
None
:
24
dbname = self.
dbname
25
if
retry_writes
is
None
:
26
retry_writes = self.
retry_writes
27
result = f
'mongodb://{self.host}:{self.port}/'
28
if
dbname
is
not
None
:
29
result += dbname
30
if
retry_writes
is
not
None
:
31
retry_writes_str = _BOOL_TO_STR[retry_writes]
32
result += f
'?retryWrites={retry_writes_str}'
33
return
result
34
35
36
def
parse_connection_uri(uri: str) -> ConnectionInfo:
37
url = urllib.parse.urlparse(uri)
38
if
url.scheme !=
'mongodb'
:
39
raise
ValueError(f
'Invalid scheme in mongodb uri {uri}'
)
40
parsed_query = urllib.parse.parse_qs(url.query)
41
path = url.path.lstrip(
'/'
)
42
return
ConnectionInfo
(
43
host=url.hostname
or
'localhost'
,
44
port=url.port
or
27017,
45
dbname=path
or
None
,
46
retry_writes=_get_boolean_param(parsed_query,
'retryWrites'
),
47
)
48
49
50
def
_get_boolean_param(
51
parsed_query: dict[str, list[str]],
52
key: str,
53
) -> bool |
None
:
54
values = parsed_query.get(key,
None
)
55
if
not
values
or
not
values[0]:
56
return
None
57
if
len(values) > 1:
58
raise
ValueError(f
'Multiple values of {key!r}: {values}'
)
59
value = values[0].lower()
60
if
value
not
in
_STR_TO_BOOL:
61
raise
ValueError(f
'Invalid {key!r} value: {values[0]}'
)
62
return
_STR_TO_BOOL[value]
en
testsuite
databases
mongo
connection.py
Generated on
for userver by
Doxygen
1.17.0