Skip to content

lock working for async recv #165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Mar 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ jobs:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
surrealdb-version: ["v2.1.0", "v2.1.1", "v2.1.2", "v2.1.3", "v2.1.4"] # v2.0.0 has different UPSERT behaviour
# surrealdb-version: ["v2.1.0", "v2.1.1", "v2.1.2", "v2.1.3", "v2.1.4"] # v2.0.0 has different UPSERT behaviour
surrealdb-version: ["v2.1.1", "v2.1.2", "v2.1.3", "v2.1.4"] # v2.0.0 has different UPSERT behaviour and v2.1.0 does not support async batching
name: Python ${{ matrix.python-version }} - SurrealDB ${{ matrix.surrealdb-version }}
steps:
- name: Checkout repository
Expand All @@ -42,17 +43,18 @@ jobs:
- name: Install dependencies
run: pip install -r requirements.txt

- name: Run unit tests (HTTP)
- name: Run unit tests
run: python -m unittest discover -s tests
env:
PYTHONPATH: ./src
SURREALDB_URL: http://localhost:8000
SURREALDB_VERSION: ${{ matrix.surrealdb-version }}

- name: Run unit tests (WebSocket)
run: python -m unittest discover -s tests
env:
PYTHONPATH: ./src
SURREALDB_URL: ws://localhost:8000
# - name: Run unit tests (WebSocket)
# run: python -m unittest discover -s tests
# env:
# PYTHONPATH: ./src
# SURREALDB_URL: ws://localhost:8000



62 changes: 32 additions & 30 deletions src/surrealdb/connections/async_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,24 +98,26 @@ def set_token(self, token: str) -> None:
self.token = token

async def authenticate(self) -> None:
message = RequestMessage(self.id, RequestMethod.AUTHENTICATE, token=self.token)
message = RequestMessage(RequestMethod.AUTHENTICATE, token=self.token)
self.id = message.id
return await self._send(message, "authenticating")

async def invalidate(self) -> None:
message = RequestMessage(self.id, RequestMethod.INVALIDATE)
message = RequestMessage(RequestMethod.INVALIDATE)
self.id = message.id
await self._send(message, "invalidating")
self.token = None

async def signup(self, vars: Dict) -> str:
message = RequestMessage(self.id, RequestMethod.SIGN_UP, data=vars)
message = RequestMessage(RequestMethod.SIGN_UP, data=vars)
self.id = message.id
response = await self._send(message, "signup")
self.check_response_for_result(response, "signup")
self.token = response["result"]
return response["result"]

async def signin(self, vars: dict) -> dict:
message = RequestMessage(
self.id,
RequestMethod.SIGN_IN,
username=vars.get("username"),
password=vars.get("password"),
Expand All @@ -124,24 +126,26 @@ async def signin(self, vars: dict) -> dict:
namespace=vars.get("namespace"),
variables=vars.get("variables"),
)
self.id = message.id
response = await self._send(message, "signing in")
self.check_response_for_result(response, "signing in")
self.token = response["result"]
return response["result"]

async def info(self) -> dict:
message = RequestMessage(self.id, RequestMethod.INFO)
message = RequestMessage(RequestMethod.INFO)
self.id = message.id
response = await self._send(message, "getting database information")
self.check_response_for_result(response, "getting database information")
return response["result"]

async def use(self, namespace: str, database: str) -> None:
message = RequestMessage(
self.token,
RequestMethod.USE,
namespace=namespace,
database=database,
)
self.id = message.id
_ = await self._send(message, "use")
self.namespace = namespace
self.database = database
Expand All @@ -152,11 +156,11 @@ async def query(self, query: str, params: Optional[dict] = None) -> dict:
for key, value in self.vars.items():
params[key] = value
message = RequestMessage(
self.id,
RequestMethod.QUERY,
query=query,
params=params,
)
self.id = message.id
response = await self._send(message, "query")
self.check_response_for_result(response, "query")
return response["result"][0]["result"]
Expand All @@ -167,11 +171,11 @@ async def query_raw(self, query: str, params: Optional[dict] = None) -> dict:
for key, value in self.vars.items():
params[key] = value
message = RequestMessage(
self.id,
RequestMethod.QUERY,
query=query,
params=params,
)
self.id = message.id
response = await self._send(message, "query", bypass=True)
return response

Expand All @@ -184,27 +188,26 @@ async def create(
if ":" in thing:
buffer = thing.split(":")
thing = RecordID(table_name=buffer[0], identifier=buffer[1])
message = RequestMessage(
self.id, RequestMethod.CREATE, collection=thing, data=data
)
message = RequestMessage(RequestMethod.CREATE, collection=thing, data=data)
self.id = message.id
response = await self._send(message, "create")
self.check_response_for_result(response, "create")
return response["result"]

async def delete(
self, thing: Union[str, RecordID, Table]
) -> Union[List[dict], dict]:
message = RequestMessage(self.id, RequestMethod.DELETE, record_id=thing)
message = RequestMessage(RequestMethod.DELETE, record_id=thing)
self.id = message.id
response = await self._send(message, "delete")
self.check_response_for_result(response, "delete")
return response["result"]

async def insert(
self, table: Union[str, Table], data: Union[List[dict], dict]
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.INSERT, collection=table, params=data
)
message = RequestMessage(RequestMethod.INSERT, collection=table, params=data)
self.id = message.id
response = await self._send(message, "insert")
self.check_response_for_result(response, "insert")
return response["result"]
Expand All @@ -213,8 +216,9 @@ async def insert_relation(
self, table: Union[str, Table], data: Union[List[dict], dict]
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.INSERT_RELATION, table=table, params=data
RequestMethod.INSERT_RELATION, table=table, params=data
)
self.id = message.id
response = await self._send(message, "insert_relation")
self.check_response_for_result(response, "insert_relation")
return response["result"]
Expand All @@ -228,51 +232,49 @@ async def unset(self, key: str) -> None:
async def merge(
self, thing: Union[str, RecordID, Table], data: Optional[Dict] = None
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.MERGE, record_id=thing, data=data
)
message = RequestMessage(RequestMethod.MERGE, record_id=thing, data=data)
self.id = message.id
response = await self._send(message, "merge")
self.check_response_for_result(response, "merge")
return response["result"]

async def patch(
self, thing: Union[str, RecordID, Table], data: Optional[List[dict]] = None
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.PATCH, collection=thing, params=data
)
message = RequestMessage(RequestMethod.PATCH, collection=thing, params=data)
self.id = message.id
response = await self._send(message, "patch")
self.check_response_for_result(response, "patch")
return response["result"]

async def select(self, thing: str) -> Union[List[dict], dict]:
message = RequestMessage(self.id, RequestMethod.SELECT, params=[thing])
message = RequestMessage(RequestMethod.SELECT, params=[thing])
self.id = message.id
response = await self._send(message, "select")
self.check_response_for_result(response, "select")
return response["result"]

async def update(
self, thing: Union[str, RecordID, Table], data: Optional[Dict] = None
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.UPDATE, record_id=thing, data=data
)
message = RequestMessage(RequestMethod.UPDATE, record_id=thing, data=data)
self.id = message.id
response = await self._send(message, "update")
self.check_response_for_result(response, "update")
return response["result"]

async def version(self) -> str:
message = RequestMessage(self.id, RequestMethod.VERSION)
message = RequestMessage(RequestMethod.VERSION)
self.id = message.id
response = await self._send(message, "getting database version")
self.check_response_for_result(response, "getting database version")
return response["result"]

async def upsert(
self, thing: Union[str, RecordID, Table], data: Optional[Dict] = None
) -> Union[List[dict], dict]:
message = RequestMessage(
self.id, RequestMethod.UPSERT, record_id=thing, data=data
)
message = RequestMessage(RequestMethod.UPSERT, record_id=thing, data=data)
self.id = message.id
response = await self._send(message, "upsert")
self.check_response_for_result(response, "upsert")
return response["result"]
Expand Down
Loading