mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 03:08:55 -05:00
Add a small wrapper for APSW use (#3202)
* Add a small wrapper for APSW use * changelog
This commit is contained in:
parent
b72c05d3d4
commit
bf6297aaf2
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
@ -25,6 +25,7 @@ redbot/core/utils/antispam.py @mikeshardmind
|
||||
redbot/core/utils/tunnel.py @mikeshardmind
|
||||
redbot/core/utils/caching.py @mikeshardmind
|
||||
redbot/core/utils/common_filters.py @mikeshardmind
|
||||
redbot/core/utils/dbtools.py @mikeshardmind
|
||||
|
||||
# Cogs
|
||||
redbot/cogs/admin/* @tekulvw
|
||||
|
||||
1
changelog.d/3202.misc.rst
Normal file
1
changelog.d/3202.misc.rst
Normal file
@ -0,0 +1 @@
|
||||
Adds a not fully documented class for APSW interaction
|
||||
61
redbot/core/utils/dbtools.py
Normal file
61
redbot/core/utils/dbtools.py
Normal file
@ -0,0 +1,61 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
from typing import Generator, Union
|
||||
|
||||
import apsw
|
||||
|
||||
__all__ = ["APSWConnectionWrapper"]
|
||||
|
||||
|
||||
# TODO (mikeshardmind): make this inherit typing_extensions.Protocol
|
||||
# long term: mypy; short term: removing the pylint disables below
|
||||
class ProvidesCursor:
|
||||
def cursor(self) -> apsw.Cursor:
|
||||
...
|
||||
|
||||
|
||||
class ContextManagerMixin(ProvidesCursor):
|
||||
@contextmanager
|
||||
def with_cursor(self) -> Generator[apsw.Cursor, None, None]:
|
||||
"""
|
||||
apsw cursors are relatively cheap, and are gc safe
|
||||
In most cases, it's fine not to use this.
|
||||
"""
|
||||
c = self.cursor() # pylint: disable=assignment-from-no-return
|
||||
try:
|
||||
yield c
|
||||
finally:
|
||||
c.close()
|
||||
|
||||
@contextmanager
|
||||
def transaction(self) -> Generator[apsw.Cursor, None, None]:
|
||||
"""
|
||||
Wraps a cursor as a context manager for a transaction
|
||||
which is rolled back on unhandled exception,
|
||||
or commited on non-exception exit
|
||||
"""
|
||||
c = self.cursor() # pylint: disable=assignment-from-no-return
|
||||
try:
|
||||
c.execute("BEGIN TRANSACTION")
|
||||
yield c
|
||||
except Exception:
|
||||
c.execute("ROLLBACK TRANSACTION")
|
||||
raise
|
||||
else:
|
||||
c.execute("COMMIT TRANSACTION")
|
||||
finally:
|
||||
c.close()
|
||||
|
||||
|
||||
class APSWConnectionWrapper(apsw.Connection, ContextManagerMixin):
|
||||
"""
|
||||
Provides a few convenience methods, and allows a path object for construction
|
||||
"""
|
||||
|
||||
def __init__(self, filename: Union[Path, str], *args, **kwargs):
|
||||
super().__init__(str(filename), *args, **kwargs)
|
||||
|
||||
|
||||
# TODO (mikeshardmind): asyncio friendly ThreadedAPSWConnection class
|
||||
Loading…
x
Reference in New Issue
Block a user