1
|
|
|
import asyncio |
2
|
|
|
from urllib.parse import urlparse |
3
|
|
|
|
4
|
|
|
from aiogremlin.driver.cluster import Cluster |
5
|
|
|
from gremlin_python.driver import serializer |
6
|
|
|
from aiogremlin.remote.driver_remote_side_effects import ( |
7
|
|
|
AsyncRemoteTraversalSideEffects) |
8
|
|
|
from gremlin_python.driver.remote_connection import RemoteTraversal |
9
|
|
|
|
10
|
|
|
|
11
|
|
|
__author__ = 'David M. Brown ([email protected])' |
12
|
|
|
|
13
|
|
|
|
14
|
|
|
class DriverRemoteConnection: |
15
|
|
|
""" |
16
|
|
|
Remote connection to a Gremlin Server. Do not instantiate directly, |
17
|
|
|
instead use :py:meth:`DriverRemoteConnection.open` or |
18
|
|
|
:py:meth:`DriverRemoteConnection.using` |
19
|
|
|
|
20
|
|
|
:param aiogremlin.driver.client.Client client: |
21
|
|
|
:param asyncio.BaseEventLoop loop: |
22
|
|
|
:param aiogremlin.driver.cluster.Cluster cluster: |
23
|
|
|
""" |
24
|
|
|
|
25
|
|
|
def __init__(self, client, loop, *, cluster=None): |
26
|
|
|
self._client = client |
27
|
|
|
self._loop = loop |
28
|
|
|
self._cluster = cluster |
29
|
|
|
|
30
|
|
|
@property |
31
|
|
|
def client(self): |
32
|
|
|
return self._client |
33
|
|
|
|
34
|
|
|
@property |
35
|
|
|
def config(self): |
36
|
|
|
return self._cluster.config |
37
|
|
|
|
38
|
|
|
@classmethod |
39
|
|
|
async def using(cls, cluster, aliases=None): |
40
|
|
|
""" |
41
|
|
|
Create a :py:class:`DriverRemoteConnection` using a specific |
42
|
|
|
:py:class:`Cluster<aiogremlin.driver.cluster.Cluster>` |
43
|
|
|
|
44
|
|
|
:param aiogremlin.driver.cluster.Cluster cluster: |
45
|
|
|
:param dict aliases: Optional mapping for aliases. Default is `None`. |
46
|
|
|
Also accepts `str` argument which will be assigned to `g` |
47
|
|
|
""" |
48
|
|
|
client = await cluster.connect(aliases=aliases) |
49
|
|
|
loop = cluster._loop |
50
|
|
|
return cls(client, loop) |
51
|
|
|
|
52
|
|
|
@classmethod |
53
|
|
|
async def open(cls, url=None, aliases=None, loop=None, *, |
54
|
|
|
graphson_reader=None, graphson_writer=None, **config): |
55
|
|
|
""" |
56
|
|
|
:param str url: Optional url for host Gremlin Server |
57
|
|
|
|
58
|
|
|
:param dict aliases: Optional mapping for aliases. Default is `None`. |
59
|
|
|
Also accepts `str` argument which will be assigned to `g` |
60
|
|
|
:param asyncio.BaseEventLoop loop: |
61
|
|
|
:param graphson_reader: Custom graphson_reader |
62
|
|
|
:param graphson_writer: Custom graphson_writer |
63
|
|
|
:param config: Optional cluster configuration passed as kwargs or `dict` |
64
|
|
|
""" |
65
|
|
|
if url: |
66
|
|
|
parsed_url = urlparse(url) |
67
|
|
|
config.update({ |
68
|
|
|
'scheme': parsed_url.scheme, |
69
|
|
|
'hosts': [parsed_url.hostname], |
70
|
|
|
'port': parsed_url.port}) |
71
|
|
|
if isinstance(aliases, str): |
72
|
|
|
aliases = {'g': aliases} |
73
|
|
|
if not loop: |
74
|
|
|
loop = asyncio.get_event_loop() |
75
|
|
|
message_serializer = serializer.GraphSONMessageSerializer( |
76
|
|
|
reader=graphson_reader, |
77
|
|
|
writer=graphson_writer) |
78
|
|
|
config.update({'message_serializer': message_serializer}) |
79
|
|
|
cluster = await Cluster.open(loop, aliases=aliases, **config) |
80
|
|
|
client = await cluster.connect() |
81
|
|
|
return cls(client, loop, cluster=cluster) |
82
|
|
|
|
83
|
|
|
async def close(self): |
84
|
|
|
""" |
85
|
|
|
Close underlying cluster if applicable. If created with |
86
|
|
|
:py:meth:`DriverRemoteConnection.using`, cluster is NOT closed. |
87
|
|
|
""" |
88
|
|
|
if self._cluster: |
89
|
|
|
await self._cluster.close() |
90
|
|
|
|
91
|
|
|
async def submit(self, bytecode): |
92
|
|
|
"""Submit bytecode to the Gremlin Server""" |
93
|
|
|
result_set = await self._client.submit(bytecode) |
94
|
|
|
side_effects = AsyncRemoteTraversalSideEffects(result_set.request_id, |
95
|
|
|
self._client) |
96
|
|
|
return RemoteTraversal(result_set, side_effects) |
97
|
|
|
|
98
|
|
|
async def __aenter__(self): |
99
|
|
|
return self |
100
|
|
|
|
101
|
|
|
async def __aexit__(self, exc_type, exc, tb): |
102
|
|
|
await self.close() |
103
|
|
|
self._client = None |
104
|
|
|
self._cluster = None |
105
|
|
|
|