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
16 changes: 9 additions & 7 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -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
@@ -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
@@ -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"),
@@ -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
@@ -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"]
@@ -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

@@ -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"]
@@ -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"]
@@ -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"]
Loading