From 345a229d0601de886ebb3e34375e30c86158ee48 Mon Sep 17 00:00:00 2001 From: Michal Tuszowski Date: Sun, 7 Apr 2024 00:21:38 +0200 Subject: [PATCH] Work in progress --- conjurer_librarian/conjurer_librarian.py | 51 +++++++++++++++--------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/conjurer_librarian/conjurer_librarian.py b/conjurer_librarian/conjurer_librarian.py index 5078d9e..39da52b 100644 --- a/conjurer_librarian/conjurer_librarian.py +++ b/conjurer_librarian/conjurer_librarian.py @@ -9,6 +9,9 @@ from json.decoder import JSONDecodeError from platform import uname from sys import platform from urllib.request import urlopen +import asyncio +from queue import Queue +from threading import Thread from habanero import Crossref from waitress import serve @@ -24,6 +27,9 @@ elif platform == "win32": #HOST_ADDRESS = "192.168.1.191" HOST_ADDRESS = "0.0.0.0" PORT_ADDRESS = 5001 +DATABASE_PATH = r'C:\\Database\\chunks' +ENCODING = "utf-8" + class Librarian(object): @@ -62,21 +68,37 @@ class Librarian(object): # convert back to json. json.dump(file_data, data_file, indent=4) return result -#TODO: check if exists odpala wątki dla kolejnych plików, z każdego wątku dostaje zwrotki - trafienia na bieżąco oraz sygnał że plik się skończył i pora na następny -#TODO: paczki danych są upychane po 10 w tablicy, POSTy ze strony klienta mówią tylko nazwę tablicy (poprzez UUID) oraz którą stronę tejże -#TODO: jeśli UUID nie istnieje to budujemy całość dla nowego uuid -#TODO: kiedy wszystkie wątki pilokowe się zakończą - zamykamy merger i dajemy znać do procedury obsługi odpowiadania na posty że dla tego uuid już nic więcej nie znajdziemy -#TODO: po 60 minutach storeujemy wyniki zapytania pod query w sql i kasujemy UUID -#TODO: Później robimy tak że query jest najpierw sprawdzane w sql - i dawane jako "zapisana lokalna kopia" -#TODO: Paginacja - najpierw hity z pliku, potem na końcu to co nie zwróciło żadnych hitów - i to dopiero można crawlerem sprawdzić + #TODO: check if exists odpala wątki dla kolejnych plików, z każdego wątku dostaje zwrotki - trafienia na bieżąco oraz sygnał że plik się skończył i pora na następny + #TODO: paczki danych są upychane po 10 w tablicy, POSTy ze strony klienta mówią tylko nazwę tablicy (poprzez UUID) oraz którą stronę tejże + #TODO: jeśli UUID nie istnieje to budujemy całość dla nowego uuid + #TODO: kiedy wszystkie wątki pilokowe się zakończą - zamykamy merger i dajemy znać do procedury obsługi odpowiadania na posty że dla tego uuid już nic więcej nie znajdziemy + #TODO: po 60 minutach storeujemy wyniki zapytania pod query w sql i kasujemy UUID + #TODO: Później robimy tak że query jest najpierw sprawdzane w sql - i dawane jako "zapisana lokalna kopia" + #TODO: Paginacja - najpierw hity z pliku, potem na końcu to co nie zwróciło żadnych hitów - i to dopiero można crawlerem sprawdzić - def check_if_exists(self,page_url): + def check_dois_in_file(self, file_name, dois, out_queue): + with open(f'{DATABASE_PATH}{file_name}', "r+", encoding=ENCODING) as file: + while True: + # Get next line from file + line = file.readline() + if line == dois: + return True + # if line is empty + # end of file is reached + if not line: + return False - + def check_dois_in_local_db(self, dois): + _sentinel = object() + chunk_list = [] + q = Queue() - return None + for file in chunk_list: + t = Thread(target = self.check_dois_in_file, args = (file ,dois, q)) + t.start() + q.put(_sentinel) - in_scihub_db = True + def check_if_exists(self, page_url): if not page_url.startswith(("http:", "https:")): raise ValueError("URL must start with 'http:' or 'https:'") # trunk-ignore(bandit/B310) @@ -86,13 +108,6 @@ class Librarian(object): for line in text.splitlines(): if re.match(r".*Unfortunately, Sci-Hub doesn't have the requested document.*", line): return None - if in_scihub_db: - return text - return None - - def download(self, page_url): - if response := self.check_if_exists(page_url): - for line in response.splitlines(): if m := re.match(r".*