commit AI suggested performance enhancements
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user