Files
kefu/deploy/loading-performance-20260917/apply_browser_performance.py
T
2026-09-21 10:34:06 +08:00

54 lines
3.6 KiB
Python

from pathlib import Path
import shutil
base = Path(__file__).parent
helpers = (base / 'browser_cache_helpers.txt').read_text(encoding='utf-8')
helpers = helpers.replace('"names": 16, "files": 16, "messages": 32', '"names": 64, "files": 64, "counts": 64, "messages": 32')
helpers = helpers.replace('conversation_id.startswith("Y:")', 'conversation_id.upper().startswith("Y:")')
helpers += (base / 'browser_counts.txt').read_text(encoding='utf-8')
queries = (base / 'browser_queries.txt').read_text(encoding='utf-8')
for root in (Path('C:/wechat_rpa'), Path('C:/kefu/wechat_rpa')):
path = root / 'wxwork_message_browser.py'
original = path.read_bytes()
source = original.decode('utf-8').replace('\r\n', '\n')
def one(before, after):
global source
assert source.count(before) == 1, (before[:100], source.count(before))
source = source.replace(before, after)
one('import sqlite3\n', 'import sqlite3\nimport math\nimport threading\nfrom array import array\nfrom collections import OrderedDict\n')
one('def _format_time(value: Any) -> str:\n', helpers + 'def _format_time(value: Any) -> str:\n')
one('def _load_names(databases: dict[str, Path], account: str) -> tuple[dict[str, str], dict[str, str], str]:', 'def _load_names_uncached(databases: dict[str, Path], account: str) -> tuple[dict[str, str], dict[str, str], str]:')
one('def _database_files(databases: dict[str, Path]) -> tuple[list[dict[str, Any]], int]:', 'def _database_files_uncached(databases: dict[str, Path]) -> tuple[list[dict[str, Any]], int]:')
one(' row_count = _count(connection, table)\n', ' row_count = _message_counts(path)[0] if table == "message_table" else _count(connection, table)\n')
start = source.index('def _conversation_rows(')
end = source.index('def load_browser_snapshot(', start)
source = source[:start] + queries + source[end:]
one(' message_limit: int = 500,\n', ' message_limit: int = 500,\n conversation_offset: int = 0,\n message_offset: int = 0,\n')
one(' discovered = _discover_databases(roots)\n', ' clear_browser_cache()\n discovered = _discover_databases(roots)\n')
start = source.index(' message_count = 0\n')
end = source.index(' updated = max(\n', start)
source = source[:start] + ''' message_count = 0
conversation_count = 0
message_path = databases.get("message.db")
if message_path:
try:
message_count, conversation_count = _message_counts(message_path)
except (sqlite3.Error, TypeError, ValueError):
pass
''' + source[end:]
one(' max(1, min(int(conversation_limit), 1000)),\n', ' max(1, min(int(conversation_limit), 1000)),\n offset=max(0, int(conversation_offset)),\n')
one(' message_limit,\n', ' message_limit,\n offset=max(0, int(message_offset)),\n')
backup = root / 'backups/loading-performance-20260917'
backup.mkdir(parents=True, exist_ok=True)
assert not (backup / path.name).exists(), 'Already patched, inspect first'
shutil.copy2(path, backup / path.name)
path.write_bytes(source.replace('\n', '\r\n' if b'\r\n' in original else '\n').encode('utf-8'))
print(root, 'browser cache/index applied')
# sqlite connection context managers commit/rollback but do not close.
benchmark = base / 'benchmark_browser.py'
source = benchmark.read_text(encoding='utf-8')
source = source.replace(' original = browser.connect_sqlite\n', ' db.close()\n original = browser.connect_sqlite\n')
benchmark.write_text(source, encoding='utf-8')