Skip to content

Commit b731dde

Browse files
authored
Merge pull request #19925 from jdavcs/24.1_19880
[24.1] Handle special charater in raw SQL
2 parents 953a972 + 1bf7299 commit b731dde

File tree

3 files changed

+18
-9
lines changed

3 files changed

+18
-9
lines changed

lib/galaxy/model/__init__.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,12 @@
225225
from galaxy.util.sanitize_html import sanitize_html
226226

227227
if TYPE_CHECKING:
228+
from sqlalchemy.sql.expression import BindParameter
229+
230+
from galaxy.objectstore import (
231+
BaseObjectStore,
232+
QuotaSourceMap,
233+
)
228234
from galaxy.schema.invocation import InvocationMessageUnion
229235

230236
log = logging.getLogger(__name__)
@@ -652,9 +658,9 @@ def stderr(self, stderr):
652658
"""
653659

654660

655-
def calculate_user_disk_usage_statements(user_id, quota_source_map, for_sqlite=False):
661+
def calculate_user_disk_usage_statements(user_id: int, quota_source_map: "QuotaSourceMap", for_sqlite: bool = False):
656662
"""Standalone function so can be reused for postgres directly in pgcleanup.py."""
657-
statements = []
663+
statements: List[Tuple[str, Dict[str, Any]]] = []
658664
default_quota_enabled = quota_source_map.default_quota_enabled
659665
default_exclude_ids = quota_source_map.default_usage_excluded_ids()
660666
default_cond = "dataset.object_store_id IS NULL" if default_quota_enabled and default_exclude_ids else ""
@@ -670,7 +676,7 @@ def calculate_user_disk_usage_statements(user_id, quota_source_map, for_sqlite=F
670676
UPDATE galaxy_user SET disk_usage = ({default_usage})
671677
WHERE id = :id
672678
"""
673-
params = {"id": user_id}
679+
params: Dict[str, Any] = {"id": user_id}
674680
if default_exclude_ids:
675681
params["exclude_object_store_ids"] = default_exclude_ids
676682
statements.append((default_usage, params))
@@ -1147,25 +1153,27 @@ def calculate_disk_usage_default_source(self, object_store):
11471153
usage = sa_session.scalar(sql_calc, params)
11481154
return usage
11491155

1150-
def calculate_and_set_disk_usage(self, object_store):
1156+
def calculate_and_set_disk_usage(self, object_store: "BaseObjectStore"):
11511157
"""
11521158
Calculates and sets user disk usage.
11531159
"""
11541160
self._calculate_or_set_disk_usage(object_store=object_store)
11551161

1156-
def _calculate_or_set_disk_usage(self, object_store):
1162+
def _calculate_or_set_disk_usage(self, object_store: "BaseObjectStore"):
11571163
"""
11581164
Utility to calculate and return the disk usage. If dryrun is False,
11591165
the new value is set immediately.
11601166
"""
11611167
assert object_store is not None
11621168
quota_source_map = object_store.get_quota_source_map()
11631169
sa_session = object_session(self)
1170+
assert sa_session
1171+
assert sa_session.bind
11641172
for_sqlite = "sqlite" in sa_session.bind.dialect.name
11651173
statements = calculate_user_disk_usage_statements(self.id, quota_source_map, for_sqlite)
11661174
for sql, args in statements:
11671175
statement = text(sql)
1168-
binds = []
1176+
binds: List[BindParameter] = []
11691177
for key, _ in args.items():
11701178
expand_binding = key.endswith("s")
11711179
binds.append(bindparam(key, expanding=expand_binding))

lib/galaxy/objectstore/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ def to_dict(self) -> Dict[str, Any]:
368368
raise NotImplementedError()
369369

370370
@abc.abstractmethod
371-
def get_quota_source_map(self):
371+
def get_quota_source_map(self) -> "QuotaSourceMap":
372372
"""Return QuotaSourceMap describing mapping of object store IDs to quota sources."""
373373

374374
@abc.abstractmethod
@@ -523,7 +523,7 @@ def parse_badges_from_config_xml(clazz, badges_xml):
523523
badges.append({"type": type, "message": message})
524524
return badges
525525

526-
def get_quota_source_map(self):
526+
def get_quota_source_map(self) -> "QuotaSourceMap":
527527
# I'd rather keep this abstract... but register_singleton wants it to be instantiable...
528528
raise NotImplementedError()
529529

scripts/cleanup_datasets/pgcleanup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,8 @@ def recalculate_disk_usage(self):
401401
statements = calculate_user_disk_usage_statements(user_id, quota_source_map)
402402

403403
for sql, args in statements:
404-
sql, _ = re.subn(r"\:([\w]+)", r"%(\1)s", sql)
404+
sql = sql.replace("%", "%%")
405+
sql = re.sub(r"\:([\w]+)", r"%(\1)s", sql)
405406
new_args = {}
406407
for key, val in args.items():
407408
if isinstance(val, list):

0 commit comments

Comments
 (0)