commit AI suggested performance enhancements

This commit is contained in:
2025-10-07 14:42:40 +02:00
parent 06965db26a
commit 7e07bdea0c
3 changed files with 42 additions and 17 deletions

View File

@@ -1,3 +1,4 @@
import re
import sys
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
@@ -7,6 +8,7 @@ from typing import Dict, Iterable, List, Optional, Tuple
import loguru
import requests
from requests.adapters import HTTPAdapter
from src import LOG_DIR
from src.logic.dataclass import BookData
@@ -556,7 +558,22 @@ class Api:
self.site = site
self.url = url
self.prefix = prefix
pass
# Reuse TCP connections across requests for better performance
self._session = requests.Session()
# Slightly larger connection pool for concurrent calls
adapter = HTTPAdapter(pool_connections=10, pool_maxsize=20)
self._session.mount("http://", adapter)
self._session.mount("https://", adapter)
def close(self):
try:
self._session.close()
except Exception:
pass
def __del__(self):
# Best-effort cleanup
self.close()
def get(self, query_args: Iterable[str]) -> List[Record]:
# if any query_arg ends with =, remove it
@@ -580,18 +597,18 @@ class Api:
"Accept": "application/xml",
"Accept-Charset": "latin1,utf-8;q=0.7,*;q=0.3",
}
response = requests.get(url, headers=headers)
# Use persistent session and set timeouts to avoid hanging
response = self._session.get(url, headers=headers, timeout=(3.05, 20))
if response.status_code != 200:
raise Exception(f"Error fetching data from SWB: {response.status_code}")
data = response.content
# extract top-level response
response = parse_search_retrieve_response(data)
# extract top-level response (decode to text for the XML parser)
response = parse_search_retrieve_response(response.text)
return response.records
def getBooks(self, query_args: Iterable[str]) -> List[BookData]:
records: List[Record] = self.get(query_args)
print(f"{self.site} found {len(records)} records")
# Avoid printing on hot paths; rely on logger if needed
log.debug(f"{self.site} found {len(records)} records for args={query_args}")
books: List[BookData] = []
# extract title from query_args if present
title = None
@@ -611,7 +628,8 @@ class Api:
return books
def getLinkForBook(self, book: BookData) -> str:
results = self.getBooks()
# Not implemented: depends on catalog front-end; return empty string for now
return ""
class SWB(Api):