mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 18:44:20 +01:00
Batch update Y columns in proofs_used and proofs_pending tables (#475)
* mint: migration 16 batch update * migrate: only if data exists
This commit is contained in:
@@ -555,15 +555,54 @@ async def m016_recompute_Y_with_new_h2c(db: Database):
|
|||||||
)
|
)
|
||||||
proofs_pending = [Proof(**r) for r in rows]
|
proofs_pending = [Proof(**r) for r in rows]
|
||||||
|
|
||||||
# overwrite the old Y columns with the new Y
|
# Prepare data for batch update
|
||||||
|
proofs_used_data = [(proof.Y, proof.secret) for proof in proofs_used]
|
||||||
|
proofs_pending_data = [(proof.Y, proof.secret) for proof in proofs_pending]
|
||||||
|
|
||||||
|
# Perform batch update in a single transaction
|
||||||
async with db.connect() as conn:
|
async with db.connect() as conn:
|
||||||
for proof in proofs_used:
|
if len(proofs_used_data):
|
||||||
|
# For proofs_used
|
||||||
await conn.execute(
|
await conn.execute(
|
||||||
f"UPDATE {table_with_schema(db, 'proofs_used')} SET Y = '{proof.Y}'"
|
"CREATE TABLE IF NOT EXISTS tmp_proofs_used (Y TEXT, secret TEXT)"
|
||||||
f" WHERE secret = '{proof.secret}'"
|
)
|
||||||
|
values_placeholder = ", ".join(
|
||||||
|
f"('{y}', '{secret}')" for y, secret in proofs_used_data
|
||||||
)
|
)
|
||||||
for proof in proofs_pending:
|
|
||||||
await conn.execute(
|
await conn.execute(
|
||||||
f"UPDATE {table_with_schema(db, 'proofs_pending')} SET Y = '{proof.Y}'"
|
f"INSERT INTO tmp_proofs_used (Y, secret) VALUES {values_placeholder}",
|
||||||
f" WHERE secret = '{proof.secret}'"
|
|
||||||
)
|
)
|
||||||
|
await conn.execute(
|
||||||
|
f"""
|
||||||
|
UPDATE {table_with_schema(db, 'proofs_used')}
|
||||||
|
SET Y = tmp_proofs_used.Y
|
||||||
|
FROM tmp_proofs_used
|
||||||
|
WHERE {table_with_schema(db, 'proofs_used')}.secret = tmp_proofs_used.secret
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(proofs_pending_data):
|
||||||
|
# For proofs_pending
|
||||||
|
await conn.execute(
|
||||||
|
"CREATE TABLE IF NOT EXISTS tmp_proofs_pending (Y TEXT, secret TEXT)"
|
||||||
|
)
|
||||||
|
values_placeholder = ", ".join(
|
||||||
|
f"('{y}', '{secret}')" for y, secret in proofs_pending_data
|
||||||
|
)
|
||||||
|
await conn.execute(
|
||||||
|
f"INSERT INTO tmp_proofs_used (Y, secret) VALUES {values_placeholder}",
|
||||||
|
)
|
||||||
|
await conn.execute(
|
||||||
|
f"""
|
||||||
|
UPDATE {table_with_schema(db, 'proofs_pending')}
|
||||||
|
SET Y = tmp_proofs_pending.Y
|
||||||
|
FROM tmp_proofs_pending
|
||||||
|
WHERE {table_with_schema(db, 'proofs_pending')}.secret = tmp_proofs_pending.secret
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
async with db.connect() as conn:
|
||||||
|
if len(proofs_used_data):
|
||||||
|
await conn.execute("DROP TABLE tmp_proofs_used")
|
||||||
|
if len(proofs_pending_data):
|
||||||
|
await conn.execute("DROP TABLE tmp_proofs_pending")
|
||||||
|
|||||||
Reference in New Issue
Block a user