Skip to content

Commit 4ddee4f

Browse files
committed
INTEGRITY: Add filtering by platform for set.dat to reduce manual merge.
1 parent 35fd8cc commit 4ddee4f

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

db_functions.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,12 @@ def set_process(
10281028

10291029
for fileset_id, candidate_filesets in set_to_candidate_dict.items():
10301030
fileset = id_to_fileset_dict[fileset_id]
1031+
1032+
# Filter by platform to reduce manual merge
1033+
candidate_filesets = set_filter_by_platform(
1034+
fileset["name"], candidate_filesets, conn
1035+
)
1036+
10311037
(
10321038
fully_matched_filesets,
10331039
auto_merged_filesets,
@@ -1063,6 +1069,47 @@ def set_process(
10631069
create_log(escape_string(category_text), user, escape_string(log_text), conn)
10641070

10651071

1072+
def set_filter_by_platform(gameid, candidate_filesets, conn):
1073+
"""
1074+
Return - list(number) : list of fileset ids of filtered candidates.
1075+
The number of manual merges in case the file size is not present (equal to -1) are too high. So we try to filter by platform extracted from the gameId of the set.dat fileset. We may disable this feature later or keep it optional with a command line argument.
1076+
"""
1077+
with conn.cursor() as cursor:
1078+
# e.g. sq2-coco3-1
1079+
possible_platform_names = gameid.split("-")[1:]
1080+
1081+
# Align platform names in set.dat and detection entries
1082+
for i, platform in enumerate(possible_platform_names):
1083+
if platform == "win":
1084+
possible_platform_names[i] = "windows"
1085+
elif platform == "mac":
1086+
possible_platform_names[i] = "macintosh"
1087+
1088+
filtered_candidate_fileset = []
1089+
1090+
for candidate_fileset_id in candidate_filesets:
1091+
query = """
1092+
SELECT g.platform
1093+
FROM fileset fs
1094+
JOIN game g ON g.id = fs.game
1095+
WHERE fs.id = %s
1096+
"""
1097+
cursor.execute(query, (candidate_fileset_id,))
1098+
candidate_platform = cursor.fetchone()["platform"]
1099+
if candidate_platform in possible_platform_names:
1100+
filtered_candidate_fileset.append(candidate_fileset_id)
1101+
1102+
if len(filtered_candidate_fileset) != 0:
1103+
print(len(candidate_filesets), " ", len(filtered_candidate_fileset), "\n")
1104+
1105+
# If nothing was filtred, then it is likely, that platform information was not present, so we fallback to original list of candidates.
1106+
return (
1107+
candidate_filesets
1108+
if len(filtered_candidate_fileset) == 0
1109+
else filtered_candidate_fileset
1110+
)
1111+
1112+
10661113
def set_perform_match(
10671114
fileset,
10681115
src,

0 commit comments

Comments
 (0)