Refactor Compat and Database for LNbits comaptibility (#219)

* remove changes to Compat and Database so its compatible with the classes from LNbits

* ledger.py: Annotate Connection type

* fix invoice memp
This commit is contained in:
callebtc
2023-05-15 22:15:56 +02:00
committed by GitHub
parent 6272aee189
commit d0283670d3
5 changed files with 39 additions and 35 deletions

View File

@@ -49,15 +49,6 @@ class Compat:
return ""
return "<nothing>"
def lock_table(self, table: str) -> str:
if self.type == POSTGRES:
return f"LOCK TABLE {table} IN EXCLUSIVE MODE;"
elif self.type == COCKROACH:
return f"LOCK TABLE {table};"
elif self.type == SQLITE:
return "BEGIN EXCLUSIVE TRANSACTION;"
return "<nothing>"
class Connection(Compat):
def __init__(self, conn: AsyncConnection, txn, typ, name, schema):
@@ -109,15 +100,15 @@ class Database(Compat):
f = "%Y-%m-%d %H:%M:%S"
return time.mktime(datetime.datetime.strptime(value, f).timetuple())
psycopg2.extensions.register_type(
psycopg2.extensions.new_type(
psycopg2.extensions.DECIMAL.values,
psycopg2.extensions.register_type( # type: ignore
psycopg2.extensions.new_type( # type: ignore
psycopg2.extensions.DECIMAL.values, # type: ignore
"DEC2FLOAT",
lambda value, curs: float(value) if value is not None else None,
)
)
psycopg2.extensions.register_type(
psycopg2.extensions.new_type(
psycopg2.extensions.register_type( # type: ignore
psycopg2.extensions.new_type( # type: ignore
(1082, 1083, 1266),
"DATE2INT",
lambda value, curs: time.mktime(value.timetuple())
@@ -152,7 +143,7 @@ class Database(Compat):
async def connect(self):
await self.lock.acquire()
try:
async with self.engine.connect() as conn:
async with self.engine.connect() as conn: # type: ignore
async with conn.begin() as txn:
wconn = Connection(conn, txn, self.type, self.name, self.schema)
@@ -189,3 +180,18 @@ class Database(Compat):
@asynccontextmanager
async def reuse_conn(self, conn: Connection):
yield conn
# public functions for LNbits to use (we don't want to change the Database or Compat classes above)
def table_with_schema(db: Database, table: str):
return f"{db.references_schema if db.schema else ''}{table}"
def lock_table(db: Database, table: str) -> str:
if db.type == POSTGRES:
return f"LOCK TABLE {table_with_schema(db, table)} IN EXCLUSIVE MODE;"
elif db.type == COCKROACH:
return f"LOCK TABLE {table};"
elif db.type == SQLITE:
return "BEGIN EXCLUSIVE TRANSACTION;"
return "<nothing>"

View File

@@ -1,10 +1,6 @@
import re
from ..core.db import COCKROACH, POSTGRES, SQLITE, Database
def table_with_schema(db, table: str):
return f"{db.references_schema if db.schema else ''}{table}"
from ..core.db import COCKROACH, POSTGRES, SQLITE, Database, table_with_schema
async def migrate_databases(db: Database, migrations_module):

View File

@@ -2,8 +2,7 @@ import time
from typing import Any, List, Optional
from ..core.base import Invoice, MintKeyset, Proof
from ..core.db import Connection, Database
from ..core.migrations import table_with_schema
from ..core.db import Connection, Database, table_with_schema
class LedgerCrud:

View File

@@ -15,7 +15,7 @@ from ..core.base import (
from ..core.crypto import b_dhke
from ..core.crypto.keys import derive_pubkey, random_hash
from ..core.crypto.secp import PublicKey
from ..core.db import Database
from ..core.db import Connection, Database, lock_table
from ..core.helpers import fee_reserve, sum_proofs
from ..core.script import verify_script
from ..core.settings import settings
@@ -305,14 +305,14 @@ class Ledger:
checking_id,
payment_request,
error_message,
) = await self.lightning.create_invoice(amount, "cashu deposit")
) = await self.lightning.create_invoice(amount, "Cashu deposit")
logger.trace(
f"_request_lightning_invoice: Lightning invoice: {payment_request}"
)
return payment_request, checking_id
async def _check_lightning_invoice(
self, amount: int, hash: str, conn
self, amount: int, hash: str, conn: Optional[Connection] = None
) -> Literal[True]:
"""Checks with the Lightning backend whether an invoice stored with `hash` was paid.
@@ -419,7 +419,9 @@ class Ledger:
await self.crud.invalidate_proof(proof=p, db=self.db)
logger.trace(f"crud: stored proofs")
async def _set_proofs_pending(self, proofs: List[Proof], conn):
async def _set_proofs_pending(
self, proofs: List[Proof], conn: Optional[Connection] = None
):
"""If none of the proofs is in the pending table (_validate_proofs_pending), adds proofs to
the list of pending proofs or removes them. Used as a mutex for proofs.
@@ -443,7 +445,9 @@ class Ledger:
except:
raise Exception("proofs already pending.")
async def _unset_proofs_pending(self, proofs: List[Proof], conn):
async def _unset_proofs_pending(
self, proofs: List[Proof], conn: Optional[Connection] = None
):
"""Deletes proofs from pending table.
Args:
@@ -638,7 +642,7 @@ class Ledger:
amount = sum(amounts)
async with self.db.connect() as conn:
logger.trace("attempting lock table invoice")
await conn.execute(self.db.lock_table("invoices"))
await conn.execute(lock_table(self.db, "invoices"))
logger.trace("locked table invoice")
# check if lightning invoice was paid
if settings.lightning:
@@ -682,7 +686,7 @@ class Ledger:
async with self.db.connect() as conn:
logger.trace("attempting lock table proofs_pending")
await conn.execute(self.db.lock_table("proofs_pending"))
await conn.execute(lock_table(self.db, "proofs_pending"))
logger.trace("locked table proofs_pending")
# validate and set proofs as pending
logger.trace("setting proofs pending")
@@ -745,7 +749,7 @@ class Ledger:
# delete proofs from pending list
async with self.db.connect() as conn:
logger.trace("attempting lock table proofs_pending")
await conn.execute(self.db.lock_table("proofs_pending"))
await conn.execute(lock_table(self.db, "proofs_pending"))
logger.trace("locked table proofs_pending")
logger.trace("unsetting proofs as pending")
await self._unset_proofs_pending(proofs, conn)
@@ -823,7 +827,7 @@ class Ledger:
# set proofs as pending
async with self.db.connect() as conn:
logger.trace("attempting lock table proofs_pending")
await conn.execute(self.db.lock_table("proofs_pending"))
await conn.execute(lock_table(self.db, "proofs_pending"))
logger.trace("locked table proofs_pending")
# validate and set proofs as pending
logger.trace("setting proofs pending")
@@ -856,7 +860,7 @@ class Ledger:
# delete proofs from pending list
async with self.db.connect() as conn:
logger.trace("attempting lock table proofs_pending")
await conn.execute(self.db.lock_table("proofs_pending"))
await conn.execute(lock_table(self.db, "proofs_pending"))
logger.trace("locked table proofs_pending")
logger.trace("unsetting proofs as pending")
await self._unset_proofs_pending(proofs, conn)

View File

@@ -1,8 +1,7 @@
from ..core.db import Database
from ..core.migrations import table_with_schema
from ..core.db import Database, table_with_schema
async def m000_create_migrations_table(db):
async def m000_create_migrations_table(db: Database):
await db.execute(
f"""
CREATE TABLE IF NOT EXISTS {table_with_schema(db, 'dbversions')} (