Source code for gavo.protocols.obscore
"""
Helpers for dealing with obscore-published tables and its view.
"""
#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL. See the
#c COPYING file in the source distribution.
import contextlib
import types
from gavo import base
from gavo.rscdef import scripting
[docs]@contextlib.contextmanager
def suspendFromObscore(rd, connection):
"""a context manager to remove everything within rd from obscore in
the controlled block.
This is a good idea when doing larger operations in the RD, as a
singled locked table (e.g., while clustering) in ivoa.obscore will lock the
whole thing.
This will commit the connection, once before entering the controlled
block, and once after, if there actually are obscore-published tables
in RD.
"""
prevClauses = list(connection.queryToDicts(
"SELECT tablename, sqlfragment, sourcerd FROM ivoa._obscoresources"
" WHERE sourceRD=%(sourceRD)s",
{"sourceRD": rd.sourceId}))
if not prevClauses:
yield
else:
updateObscore = scripting.PythonScriptRunner(
base.resolveCrossId("//obscore#createObscoreView")).run
fakeTable = types.SimpleNamespace(connection=connection)
connection.execute("DELETE FROM ivoa._obscoresources"
" WHERE sourceRD=%(sourceRD)s",
{"sourceRD": rd.sourceId})
updateObscore(fakeTable)
connection.commit()
try:
yield
except:
connection.rollback()
raise
finally:
with connection.cursor() as c:
c.executemany("INSERT INTO ivoa._obscoresources"
" (tablename, sqlfragment, sourcerd)"
" VALUES (%(tablename)s, %(sqlfragment)s, %(sourcerd)s)",
prevClauses)
updateObscore(fakeTable)
connection.commit()
[docs]def restoreObscore(connection):
"""sees if this system should have an obscore table and re-creates
it if it's missing.
"""
q = base.UnmanagedQuerier(connection)
if q.getTableType("ivoa._obscoresources") is not None:
fakeTable = types.SimpleNamespace(connection=connection)
n = list(q.connection.query(
"SELECT count(*) from ivoa._obscoresources"))[0][0]
if n>1: # ivoa.emptyobscore doesn't count
scripting.PythonScriptRunner(
base.resolveCrossId("//obscore#createObscoreView")
).run(fakeTable)