Iraklis Varlamis

216 papers A* 1A 4B 15C 9Misc 2Journal 100Unranked 74
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Jorgen Cani, Christos Diou, Spyridon Evangelatos, Vasileios Argyriou, Panagiotis Radoglou-Grammatiki, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
Inf. Fusion
Yassine Himeur, Nour Aburaed, Omar Elharrouss, Iraklis Varlamis, Shadi Atalla, Wathiq Mansoor, Hussain Al-Ahmad
2025 J jnl
Future Gener. Comput. Syst.
Anastasios Iliopoulos, John Violos, Christos Diou, Iraklis Varlamis
2025 J jnl
Algorithms
Shakhmar Sarsenbay, Asset Kabdiyev, Iraklis Varlamis, Christos Sardianos, Cemil Turan, Bobir Razhametov, Yermek Kazym
2025 J jnl
Inf.
Eleftheria Papageorgiou, Iraklis Varlamis, Christos Chronis
2025 J jnl
CoRR
Jorgen Cani, Christos Diou, Spyridon C. Evangelatos, Vasileios Argyriou, Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 conf
FLLM
Maria Tsourma, Dimitrios Michail, Iraklis Varlamis, Anastasios Drosou, Dimitrios Tzovaras
2025 conf
IOT
Ioannis Korontanis, Ioannis Kontopoulos, Athena Zacharia, Antonios Makris, Christos Chronis, Maria Pateraki, Konstantinos Tserpes, Iraklis Varlamis
2025 conf
DSP
Stylianos Zindros, Christos Chronis, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
CoRR
Stylianos Zindros, Christos Chronis, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
IEEE Access
Elena Politi, Charalampos Davalas, Christos Chronis, George Dimitrakopoulos, Dimitrios Michail, Iraklis Varlamis
2025 conf
CAI
Artemis Stefanidou, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
CoRR
Artemis Stefanidou, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
IEEE Access
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
CoRR
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
CoRR
Jorgen Cani, Panagiotis Koletsis, Konstantinos Foteinos, Ioannis Kefaloukos, Lampros Argyriou, Manolis Falelakis, Iván del Pino, Angel Santamaria-Navarro, Martin Cech, Ondrej Severa, Alessandro Umbrico, Francesca Fracasso, Andrea Orlandini, Dimitrios Drakoulis, Evangelos Markakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 conf
MAIoT@Middleware
Ioannis Korontanis, Ioannis Kontopoulos, Konstantinos Tserpes, Iraklis Varlamis
2025 J jnl
CoRR
Konstantinos Foteinos, Jorgen Cani, Manousos Linardakis, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2025 J jnl
CoRR
Jorgen Cani, Christos D. Nikolopoulos, Spyridon C. Evangelatos, Panagiotis I. Radoglou-Grammatikis, Vasileios Argyriou, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 C conf
ICARCV
Artemis Stefanidou, Elena Politi, Christos Chronis, George Dimitrakopoulos, Iraklis Varlamis
2024 J jnl
Comput.
Zhumaniyaz Mamatnabiyev, Christos Chronis, Iraklis Varlamis, Yassine Himeur, Meirambek Zhaparov
2024 J jnl
Future Internet
Eleftheria Papageorgiou, Christos Chronis, Iraklis Varlamis, Yassine Himeur
2024 J jnl
IEEE Open J. Comput. Soc.
Christos Chronis, Iraklis Varlamis, Yassine Himeur, Aya Nabil Sayed, Tamim M. Al-Hasan, Armstrong Nhlabatsi, Faycal Bensaali, George Dimitrakopoulos
2024 J jnl
Appl. Intell.
Charalampos Davalas, Dimitrios Michail, Christos Diou, Iraklis Varlamis, Konstantinos Tserpes
2024 conf
SIGSPATIAL/GIS
Ioannis Kontopoulos, Iraklis Varlamis, Antonios Makris, Konstantinos Tserpes
2024 J jnl
IEEE Access
Elena Politi, Artemis Stefanidou, Christos Chronis, George Dimitrakopoulos, Iraklis Varlamis
2024 J jnl
CoRR
Yassine Himeur, Nour Aburaed, Omar Elharrouss, Iraklis Varlamis, Shadi Atalla, Wathiq Mansoor, Hussain Al-Ahmad
2024 J jnl
IEEE Access
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 J jnl
CoRR
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 B conf
IEEE Big Data
Panagiotis Koletsis, Panagiotis-Konstantinos Gemos, Christos Chronis, Iraklis Varlamis, Vasilis Efthymiou, Georgios Th. Papadopoulos
2024 J jnl
CoRR
Panagiotis Koletsis, Panagiotis-Konstantinos Gemos, Christos Chronis, Iraklis Varlamis, Vasilis Efthymiou, Georgios Th. Papadopoulos
2024 J jnl
CoRR
Christos Sardianos, Chrysostomos Symvoulidis, Matthias Schlögl, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 conf
BigDataService
Christos Chronis, Iraklis Varlamis, Dimitrios Michail, Konstantinos Tserpes, George Dimitrakopoulos
2024 J jnl
Big Data Cogn. Comput.
Tamim M. Al-Hasan, Aya Nabil Sayed, Faycal Bensaali, Yassine Himeur, Iraklis Varlamis, George Dimitrakopoulos
2024 B conf
IEEE Big Data
Artemis Stefanidou, Jorgen Cani, Thomas Papadopoulos, Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 J jnl
CoRR
Artemis Stefanidou, Jorgen Cani, Thomas Papadopoulos, Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 J jnl
Comput. Networks
Athanasios Bimpas, John Violos, Aris Leivadeas, Iraklis Varlamis
2024 conf
WTS
Dimitrios Georgiadis, Elena Politi, George Dimitrakopoulos, Iraklis Varlamis
2024 conf
SETN
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 J jnl
CoRR
Manousos Linardakis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 J jnl
IEEE Access
Nikolaos Rodis, Christos Sardianos, Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Iraklis Varlamis, Georgios Th. Papadopoulos
2024 conf
BigDataService
Konstantinos Kokkalis, Christos Chronis, Elena Politi, George Dimitrakopoulos, Iraklis Varlamis
2024 C conf
BDCAT
Christos Chronis, Iraklis Varlamis, George Dimitrakopoulos, Faycal Bensaali, Georgios Th. Papadopoulos
2024 ed.
PCI
Nikitas N. Karanikolas, Iraklis Varlamis, Kyriakos N. Sgarbas, Dimitris Kalles, Ioannis Voyiatzis
2024 J jnl
CoRR
Emmanouil Maragkoudakis, Symeon Papadopoulos, Iraklis Varlamis, Christos Diou
2024 J jnl
SoftwareX
Ioannis Korontanis, Antonios Makris, Alexandros Kontogiannis, Iraklis Varlamis, Konstantinos Tserpes
2024 conf
EGOV-CeDEM-ePart-*
Efthimios Tambouris, Dimitris Zeginis, Georgios Matziaras, Nikolaos Stefanidis, Rafail Promikyridis, Konstantinos A. Tarabanis, Konstantinos Doutsos Oikonomou, Iraklis Varlamis, Maria Claudia Bodino
2023 conf
ICASSP Workshops
Vincenzo Lomonaco, Valerio De Caro, Claudio Gallicchio, Antonio Carta, Christos Sardianos, Iraklis Varlamis, Konstantinos Tserpes, Massimo Coppola, Mina Marmpena, Sevasti Politi, Erwin Schoitsch, Davide Bacciu
2023 J jnl
Big Data Cogn. Comput.
Dauren Ayazbayev, Andrey Bogdanchikov, Kamila Orynbekova, Iraklis Varlamis
2023 conf
BigDataService
Anastasios Iliopoulos, John Violos, Christos Diou, Iraklis Varlamis
2023 J jnl
CoRR
Anastasios Iliopoulos, John Violos, Christos Diou, Iraklis Varlamis
2023 conf
PCI
George Kazazis, Christos Chronis, Christos Diou, Iraklis Varlamis
2023 J jnl
IEEE Access
Christos Chronis, Georgios Anagnostopoulos, Elena Politi, George Dimitrakopoulos, Iraklis Varlamis
2023 J jnl
Intell. Syst. Appl.
Sofia Rizou, Angelos Theofilatos, Antonia Paflioti, E. Pissari, Iraklis Varlamis, George Sarigiannidis, Konstantinos Ch. Chatzisavvas
2023 J jnl
Int. J. Inf. Manag. Data Insights
Dimitrios Kaklis, Iraklis Varlamis, George Giannakopoulos, Takis J. Varelas, Constantine D. Spyropoulos
2023 conf
MobileCloud
Georgios Anagnostopoulos, Georgios Stavropoulos, John Violos, Aris Leivadeas, Iraklis Varlamis
2023 J jnl
Syst.
Yassine Himeur, Somaya Al-Máadeed, Iraklis Varlamis, Noor Al-Máadeed, Khalid Abualsaud, Amr Mohamed
2023 J jnl
CoRR
Yassine Himeur, Iraklis Varlamis, Hamza Kheddar, Abbes Amira, Shadi Atalla, Yashbir Singh, Faycal Bensaali, Wathiq Mansoor
2023 conf
SOSE
Takis J. Varelas, Dimitrios Kaklis, Iraklis Varlamis, Artemis Flori
2023 ed.
CI4PM/PAI@WCCI
Marco Pegoraro, Davide Bacciu, Andrea Burattin, Antonio Carta, Patrizio Dazzi, Massimiliano de Leoni, Magdalini Eirinaki, Iraklis Varlamis
2023 conf
DAPPS
Iraklis Varlamis, Jerry Z. Gao
2023 J jnl
CoRR
Nikolaos Rodis, Christos Sardianos, Georgios Th. Papadopoulos, Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Iraklis Varlamis
2023 conf
PKDD/ECML Workshops (1)
Emmanouil Maragkoudakis, Symeon Papadopoulos, Iraklis Varlamis, Christos Diou
2023 J jnl
Future Internet
Minas Pergantis, Iraklis Varlamis, Nikolaos-Grigorios Kanellopoulos, Andreas Giannakoulopoulos
2023 J jnl
Int. J. Data Sci. Anal.
Iraklis Varlamis, Christos Sardianos, Christos Chronis, George J. Dimitrakopoulos, Yassine Himeur, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira
2022 conf
CI4PM/PAI@WCCI
Charalampos Davalas, Dimitrios Michail, Iraklis Varlamis, Konstantinos Tserpes
2022 J jnl
Future Internet
Iraklis Varlamis, Dimitrios Michail, Foteini Glykou, Panagiotis Tsantilas
2022 conf
BigDataService
Dimitrios Kaklis, Pavlos Eirinakis, George Giannakopoulos, Constantine D. Spyropoulos, Takis J. Varelas, Iraklis Varlamis
2022 conf
PerCom Workshops
Valerio De Caro, Saira Bano, Achilles Machumilane, Alberto Gotta, Pietro Cassarà, Antonio Carta, Rudy Semola, Christos Sardianos, Christos Chronis, Iraklis Varlamis, Konstantinos Tserpes, Vincenzo Lomonaco, Claudio Gallicchio, Davide Bacciu
2022 J jnl
CoRR
Valerio De Caro, Saira Bano, Achilles Machumilane, Alberto Gotta, Pietro Cassarà, Antonio Carta, Rudy Semola, Christos Sardianos, Christos Chronis, Iraklis Varlamis, Konstantinos Tserpes, Vincenzo Lomonaco, Claudio Gallicchio, Davide Bacciu
2022 J jnl
Comput. Sci. Rev.
Yassine Himeur, Aya Nabil Sayed, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira, Iraklis Varlamis, Magdalini Eirinaki, Christos Sardianos, George Dimitrakopoulos
2022 J jnl
Big Data Cogn. Comput.
Andrey Bogdanchikov, Dauren Ayazbayev, Iraklis Varlamis
2022 conf
ICIAP (3)
Charalampos Davalas, Dimitrios Michail, Christos Diou, Iraklis Varlamis, Konstantinos Tserpes
2022 J jnl
Int. J. Inf. Manag. Data Insights
Dimitrios Michail, Nikos Kanakaris, Iraklis Varlamis
2022 conf
SEEDA-CECNSM
George Gkolfopoulos, Iraklis Varlamis
2022 J jnl
Future Internet
Andreas Giannakoulopoulos, Minas Pergantis, Nikos Konstantinou, Alexandros Kouretsis, Aristeidis Lamprogeorgos, Iraklis Varlamis
2022 J jnl
Future Internet
Alexandros Kouretsis, Iraklis Varlamis, Laida Limniati, Minas Pergantis, Andreas Giannakoulopoulos
2022 B conf
MDM
Dimitrios Kaklis, Iraklis Varlamis, George Giannakopoulos, Constantine D. Spyropoulos, Takis J. Varelas
2022 conf
FTC (1)
Elena Politi, Antonios Garyfallou, Ilias E. Panagiotopoulos, Iraklis Varlamis, George Dimitrakopoulos
2022 J jnl
Frontiers Big Data
Magdalini Eirinaki, Iraklis Varlamis, Janhavi Dahihande, Akshay Jaiswal, Akshay Anil Pagar, Ajinkya Thakare
2022 B conf
SSDBM
Fragkiskos Gryllakis, Nikos Pelekis, Christos Doulkeridis, Iraklis Varlamis, Yannis Theodoridis
2022 conf
SOSE
Elena Politi, Iraklis Varlamis, Konstantinos Tserpes, Morten Larsen, George Dimitrakopoulos
2022 conf
SETN
Rediona Kane, Iraklis Varlamis, Mary Yiannakoulia, Nikolaos Skarmeas
2022 J jnl
Inf.
Minas Pergantis, Iraklis Varlamis, Andreas Giannakoulopoulos
2021 J jnl
IEEE Syst. J.
Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira, Christos Sardianos, Christos Chronis, Iraklis Varlamis, George Dimitrakopoulos
2021 C conf
VEHITS
Elena Politi, Ilias E. Panagiotopoulos, Iraklis Varlamis, George Dimitrakopoulos
2021 J jnl
Inf.
Georgios Alexandridis, Iraklis Varlamis, Konstantinos Korovesis, George Caridakis, Panagiotis Tsantilas
2021 J jnl
Int. J. Geogr. Inf. Sci.
Ioannis Kontopoulos, Iraklis Varlamis, Konstantinos Tserpes
2021 conf
PCI
Christos Chronis, Christos Sardianos, Iraklis Varlamis, Dimitrios Michail, Konstantinos Tserpes
2021 Misc conf
SAC
Iraklis Varlamis, Christos Sardianos, Vania Bogorny, Luis Otávio Alvares, Jônata Tyska Carvalho, Chiara Renso, Raffaele Perego, John Violos
2021 J jnl
CoRR
Yassine Himeur, Abdullah Alsalemi, Ayman Al-Kababji, Faycal Bensaali, Abbes Amira, Christos Sardianos, George Dimitrakopoulos, Iraklis Varlamis
2021 J jnl
Inf. Fusion
Yassine Himeur, Abdullah Alsalemi, Ayman Al-Kababji, Faycal Bensaali, Abbes Amira, Christos Sardianos, George Dimitrakopoulos, Iraklis Varlamis
2021 J jnl
Data Min. Knowl. Discov.
Iraklis Varlamis
2021 conf
PCI
Nikolaos Maniatis, Georgios Alexandridis, Konstantinos Korovesis, Iraklis Varlamis, Panagiotis Tsantilas, George Michael Klimis, George Caridakis
2021 J jnl
CoRR
Yassine Himeur, Aya Nabil Sayed, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira, Iraklis Varlamis, Magdalini Eirinaki, Christos Sardianos, George Dimitrakopoulos
2021 J jnl
GeoInformatica
Iraklis Varlamis, Ioannis Kontopoulos, Konstantinos Tserpes, Mohammad Etemad, Amílcar Soares Júnior, Stan Matwin
2021 conf
SAFECOMP Workshops
Georg Macher, Siranush Akarmazyan, Eric Armengaud, Davide Bacciu, Calogero Calandra, Herbert Danzinger, Patrizio Dazzi, Charalampos Davalas, Maria Carmela De Gennaro, Angela Dimitriou, Jürgen Dobaj, Maid Dzambic, Lorenzo Giraudi, Sylvain Girbal, Dimitrios Michail, Roberta Peroglio, Rosaria Potenza, Farank Pourdanesh, Matthias Seidl, Christos Sardianos, Konstantinos Tserpes, Jakob Valtl, Iraklis Varlamis, Omar Veledar
2021 conf
PETRA
Konstantinos E. Papoutsakis, Thodoris Papadopoulos, Michail Maniadakis, Manolis I. A. Lourakis, Maria Pateraki, Iraklis Varlamis
2021 conf
PCI
Georgios Alexandridis, Konstantinos Korovesis, Iraklis Varlamis, Panagiotis Tsantilas, George Caridakis
2021 J jnl
Int. J. Inf. Manag. Data Insights
Jamal Abdul Nasir, Osama Subhani Khan, Iraklis Varlamis
2021 C conf
IJCCI
Georgios Athanassiou, Maria Pateraki, Iraklis Varlamis
2021 J jnl
Int. J. Geogr. Inf. Sci.
Yenier Torres Izquierdo, Grettel Monteagudo García, Marco A. Casanova, Luiz André P. Paes Leme, Christos Sardianos, Konstantinos Tserpes, Iraklis Varlamis, Lívia C. Ruback Rodrigues
2021 conf
COINS
Davide Bacciu, Siranush Akarmazyan, Eric Armengaud, Manlio Bacco, George Bravos, Calogero Calandra, Emanuele Carlini, Antonio Carta, Pietro Cassarà, Massimo Coppola, Charalampos Davalas, Patrizio Dazzi, Maria Carmela De Gennaro, Daniele Di Sarli, Jürgen Dobaj, Claudio Gallicchio, Sylvain Girbal, Alberto Gotta, Riccardo Groppo, Vincenzo Lomonaco, Georg Macher, Daniele Mazzei, Gabriele Mencagli, Dimitrios Michail, Alessio Micheli, Roberta Peroglio, Salvatore Petroni, Rosaria Potenza, Farank Pourdanesh, Christos Sardianos, Konstantinos Tserpes, Fulvio Tagliabo, Jakob Valtl, Iraklis Varlamis, Omar Veledar
2021 J jnl
CoRR
Davide Bacciu, Siranush Akarmazyan, Eric Armengaud, Manlio Bacco, George Bravos, Calogero Calandra, Emanuele Carlini, Antonio Carta, Pietro Cassarà, Massimo Coppola, Charalampos Davalas, Patrizio Dazzi, Maria Carmela De Gennaro, Daniele Di Sarli, Jürgen Dobaj, Claudio Gallicchio, Sylvain Girbal, Alberto Gotta, Riccardo Groppo, Vincenzo Lomonaco, Georg Macher, Daniele Mazzei, Gabriele Mencagli, Dimitrios Michail, Alessio Micheli, Roberta Peroglio, Salvatore Petroni, Rosaria Potenza, Farank Pourdanesh, Christos Sardianos, Konstantinos Tserpes, Fulvio Tagliabo, Jakob Valtl, Iraklis Varlamis, Omar Veledar
2021 J jnl
Int. J. Intell. Syst.
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira
2020 J jnl
Int. J. Web Eng. Technol.
Iraklis Varlamis, Dimitrios Michail, Pavlos Polydoras, Panagiotis Tsantilas
2020 conf
ICIoT
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Yassine Himeur, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira
2020 J jnl
Evol. Syst.
Panagiotis Kouris, Iraklis Varlamis, Georgios Alexandridis, Andreas Stafylopatis
2020 J jnl
IEEE Access
Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira, Christos Sardianos, Iraklis Varlamis, George Dimitrakopoulos
2020 conf
BigDataService
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Yassine Himeur, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira
2020 J jnl
Future Internet
Andreas Giannakoulopoulos, Minas Pergantis, Nikos Konstantinou, Aristeidis Lamprogeorgos, Laida Limniati, Iraklis Varlamis
2020 conf
IntelliSys (3)
Yassine Himeur, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira, Christos Sardianos, Iraklis Varlamis, George Dimitrakopoulos
2020 conf
PCI
Konstantinos Giorgas, Iraklis Varlamis
2020 J jnl
J. Syst. Softw.
Ioannis Stamelos, Iraklis Varlamis, Dimosthenis Anagnostopoulos, Jesús M. González-Barahona
2020 J jnl
Future Gener. Comput. Syst.
Christos Sardianos, Iraklis Varlamis, George Dimitrakopoulos, Dimosthenis Anagnostopoulos, Abdullah Alsalemi, Faycal Bensaali, Yassine Himeur, Abbes Amira
2020 conf
iThings/GreenCom/CPSCom/SmartData/Cybermatics
Christos Sardianos, Christos Chronis, Iraklis Varlamis, George Dimitrakopoulos, Yassine Himeur, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira
2020 A conf
RecSys
Janhavi Dahihande, Akshay Jaiswal, Akshay Anil Pagar, Ajinkya Thakare, Magdalini Eirinaki, Iraklis Varlamis
2020 J jnl
CoRR
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira
2020 ed.
SETN
Constantine D. Spyropoulos, Iraklis Varlamis, Ion Androutsopoulos, Prodromos Malakasiotis
2020 J jnl
CoRR
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira
2019 conf
SMARTGREENS
Christos Sardianos, Iraklis Varlamis, George Dimitrakopoulos, Dimosthenis Anagnostopoulos, Abdullah Alsalemi, Faycal Bensaali, Abbes Amira
2019 J jnl
Future Internet
Konstantinos Kapadais, Iraklis Varlamis, Christos Sardianos, Konstantinos Tserpes
2019 conf
EDBT/ICDT Workshops
Iraklis Varlamis, Konstantinos Tserpes, Mohammad Etemad, Amílcar Soares Júnior, Stan Matwin
2019 C conf
IDEAS
Dimitrios Kaklis, George Giannakopoulos, Iraklis Varlamis, Constantine D. Spyropoulos, Takis J. Varelas
2019 J jnl
Inf. Process. Manag.
Jamal Abdul Nasir, Iraklis Varlamis, Samreen Ishfaq
2019 J jnl
Future Internet
Andreas Giannakoulopoulos, Nikos Konstantinou, Dimitris Koutsompolis, Minas Pergantis, Iraklis Varlamis
2019 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Abdullah Alsalemi, Mona Ramadan, Faycal Bensaali, Abbes Amira, Christos Sardianos, Iraklis Varlamis, George Dimitrakopoulos
2019 conf
IEEE BigData
Charalampos Davalas, Dimitrios Michail, Iraklis Varlamis
2019 J jnl
Inf.
Christos Sardianos, Grigorios Ballas Papadatos, Iraklis Varlamis
2019 conf
IISA
Vassilis Poulopoulos, Manolis Wallace, Iraklis Varlamis, George Caridakis, Panagiotis Tsantilas
2019 J jnl
Future Gener. Comput. Syst.
Dimitrios Michail, Antonios Makris, Iraklis Varlamis, Mark Sawyer
2019 conf
SMARTGREENS/VEHITS (Selected Papers)
Christos Sardianos, Iraklis Varlamis, Christos Chronis, George Dimitrakopoulos, Abdullah Alsalemi, Yassine Himeur, Faycal Bensaali, Abbes Amira
2019 conf
IntelliSys (2)
Abdullah Alsalemi, Faycal Bensaali, Abbes Amira, Noora Fetais, Christos Sardianos, Iraklis Varlamis
2019 J jnl
J. Cloud Comput.
Konstantinos Tserpes, Maria Pateraki, Iraklis Varlamis
2019 J jnl
IEEE Syst. J.
Abdullah Alsalemi, Christos Sardianos, Faycal Bensaali, Iraklis Varlamis, Abbes Amira, George Dimitrakopoulos
2019 conf
SummerSim
Nikolaos Mantas, Malamati D. Louta, Magdalini Eirinaki, Iraklis Varlamis, George T. Karetsos
2019 conf
SPECTS
Nikolaos Mantas, Malamati D. Louta, Magdalini Eirinaki, Iraklis Varlamis, George T. Karetsos
2019 conf
MASTER@PKDD/ECML
Ioannis Kontopoulos, Iraklis Varlamis, Konstantinos Tserpes
2018 conf
ICDE Workshops
Iraklis Varlamis, Konstantinos Tserpes, Christos Sardianos
2018 B conf
DocEng
Nikiforos Pittaras, George Giannakopoulos, Leonidas Tsekouras, Iraklis Varlamis
2018 B conf
ASONAM
Christos Sardianos, Iraklis Varlamis, Grigoris Bouras
2018 ed.
OSS
Ioannis Stamelos, Jesús M. González-Barahona, Iraklis Varlamis, Dimosthenis Anagnostopoulos
2018 J jnl
Future Gener. Comput. Syst.
Magdalini Eirinaki, Jerry Gao, Iraklis Varlamis, Konstantinos Tserpes
2018 J jnl
Pers. Ubiquitous Comput.
Saumil Dharia, Magdalini Eirinaki, Vijesh Jain, Jvalant Patel, Iraklis Varlamis, Jainikkumar Vora, Rizen Yamauchi
2018 J jnl
Frontiers Appl. Math. Stat.
John Violos, Konstantinos Tserpes, Iraklis Varlamis, Theodora A. Varvarigou
2017 Misc conf
RANLP
Leonidas Tsekouras, Iraklis Varlamis, George Giannakopoulos
2017 C conf
EANN
Panagiotis Kouris, Iraklis Varlamis, Georgios Alexandridis
2017 B conf
CBMS
Theodora Sanida, Iraklis Varlamis
2017 J jnl
Comput. Methods Programs Biomed.
Iraklis Varlamis, Ioannis Apostolakis, Dimitra Sifaki Pistola, Nilanjan Dey, Vassilios Georgoulias, Christos Lionis
2017 conf
CICLing (2)
Filippos Karolos Ventirozos, Iraklis Varlamis, George Tsatsaronis
2017 J jnl
J. Informetrics
George Panagopoulos, George Tsatsaronis, Iraklis Varlamis
2017 conf
ADBIS (Short Papers and Workshops)
Ioannis Kontopoulos, George Giannakopoulos, Iraklis Varlamis
2017 J jnl
Int. J. Web Eng. Technol.
Iraklis Varlamis, Dimitrios Fassarakis Hilliard
2017 J jnl
J. Syst. Softw.
Nikos Tsirakis, Vassilis Poulopoulos, Panagiotis Tsantilas, Iraklis Varlamis
2017 J jnl
Int. J. Big Data Intell.
Nantia Makrynioti, Andreas Grivas, Christos Sardianos, Nikos Tsirakis, Iraklis Varlamis, Vasilis Vassalos, Vassilis Poulopoulos, Panagiotis Tsantilas
2017 conf
HPCS
Antonios Makris, Dimitrios Michail, Iraklis Varlamis, Chronis Dimitropoulos, Konstantinos Tserpes, George Tsatsaronis, Joachim Haupt, Mark Sawyer
2017 conf
BigDataService
Christos Sardianos, Iraklis Varlamis, Magdalini Eirinaki
2016 B conf
ASONAM
Saumil Dharia, Vijesh Jain, Jvalant Patel, Jainikkumar Vora, Rizen Yamauchi, Magdalini Eirinaki, Iraklis Varlamis
2015 conf
TrustCom/BigDataSE/ISPA (2)
Nikos Tsirakis, Vassilis Poulopoulos, Panayiotis Tsantilas, Iraklis Varlamis
2015 B conf
CEC
Iraklis Varlamis
2015 ch.
Medical Data Privacy Handbook
Maria Bertsima, Iraklis Varlamis, Panagiotis Rizomiliotis
2015 B conf
ASONAM
Dimitris Proios, Magdalini Eirinaki, Iraklis Varlamis
2014 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Magdalini Eirinaki, Malamati D. Louta, Iraklis Varlamis
2014 conf
Panhellenic Conference on Informatics
Christos Sardianos, Iraklis Varlamis
2014 conf
Panhellenic Conference on Informatics
Iraklis Varlamis, Nikos Tsirakis, Vassilis Poulopoulos, Panayiotis Tsantilas
2014 conf
WIMS
Spiridoula Tragopoulou, Iraklis Varlamis, Magdalini Eirinaki
2014 conf
ECML/PKDD (3)
Ioannis Manousos Katakis, Iraklis Varlamis, George Tsatsaronis
2014 J jnl
CoRR
George Tsatsaronis, Iraklis Varlamis, Michalis Vazirgiannis
2014 conf
RSWeb@RecSys
Vaishak Suresh, Syeda Roohi, Magdalini Eirinaki, Iraklis Varlamis
2013 ch.
The Influence of Technology on Social Network Analysis and Mining
Iraklis Varlamis, Magdalini Eirinaki, Malamati D. Louta
2013 J jnl
Knowl. Based Syst.
Jamal Abdul Nasir, Iraklis Varlamis, Asim Karim, George Tsatsaronis
2013 conf
CICLing (1)
George Tsatsaronis, Iraklis Varlamis, Nattiya Kanhabua, Kjetil Nørvåg
2012 ch.
Virtual Communities, Social Networks and Collaboration
Anargyros Chryssanthou, Iraklis Varlamis, Charikleia Latsiou
2012 J jnl
Int. J. Web Eng. Technol.
Iraklis Varlamis, George Tsatsaronis
2012 A conf
CIKM
George Tsatsaronis, Iraklis Varlamis, Kjetil Nørvåg
2012 J jnl
Int. J. Electron. Heal.
Ioannis Apostolakis, George Koulierakis, Alexander Berler, Anargyros Chryssanthou, Iraklis Varlamis
2012 conf
SETN
Vicky Panagiotopoulou, Iraklis Varlamis, Ion Androutsopoulos, George Tsatsaronis
2011 C conf
SPIRE
Jamal Abdul Nasir, Asim Karim, George Tsatsaronis, Iraklis Varlamis
2011 J jnl
Int. J. Electron. Heal.
Anargyros Chryssanthou, Iraklis Varlamis, Charikleia Latsiou
2011 B conf
TPDL
George Tsatsaronis, Iraklis Varlamis, Sunna Torge, Matthias Reimann, Kjetil Nørvåg, Michael Schroeder, Matthias Zschunke
2011 B conf
ASONAM
Iraklis Varlamis, George Tsatsaronis
2010 conf
KES (3)
Iraklis Varlamis, Ioannis Apostolakis
2010 B conf
ASONAM
Iraklis Varlamis, Magdalini Eirinaki, Malamati D. Louta
2010 C conf
CICLing
George Tsatsaronis, Iraklis Varlamis, Kjetil Nørvåg
2010 ch.
Semantics in Adaptive and Personalized Services
Malamati D. Louta, Iraklis Varlamis
2010 J jnl
Int. J. Data Warehous. Min.
Panagiotis Giannikopoulos, Iraklis Varlamis, Magdalini Eirinaki
2010 conf
KES (3)
Iraklis Varlamis
2010 conf
SETN
Elias Zavitsanos, George Tsatsaronis, Iraklis Varlamis, Georgios Paliouras
2010 J jnl
Int. J. Web Based Communities
Iraklis Varlamis, Ioannis Apostolakis
2010 B conf
COLING
George Tsatsaronis, Iraklis Varlamis, Kjetil Nørvåg
2010 J jnl
J. Artif. Intell. Res.
George Tsatsaronis, Iraklis Varlamis, Michalis Vazirgiannis
2010 ch.
Web-Based Applications in Healthcare and Biomedicine
Iraklis Varlamis, Ioannis Apostolakis
2009 J jnl
CoRR
Apostolos Kritikopoulos, Martha Sideri, Iraklis Varlamis
2009 conf
MCIS
Iraklis Varlamis, Andreas Giannakoulopoulos, Dimitris Gouscos
2009 conf
ECML/PKDD (2)
George Tsatsaronis, Iraklis Varlamis, Michalis Vazirgiannis, Kjetil Nørvåg
2009 conf
PETRA
Anargyros Chryssanthou, Iraklis Varlamis, Charikleia Latsiou
2009 conf
WIDM
George Tsatsaronis, Iraklis Varlamis, Sofia Stamou, Kjetil Nørvåg, Michalis Vazirgiannis
2009 J jnl
Data Knowl. Eng.
Iraklis Varlamis, Sofia Stamou
2009 J jnl
CoRR
Nikos Zotos, Paraskevi Tzekou, George Tsatsaronis, Lefteris Kozanidis, Sofia Stamou, Iraklis Varlamis
2009 conf
SMAP
Iraklis Varlamis, Malamati D. Louta
2008 ch.
New Directions in Intelligent Interactive Multimedia
Iraklis Varlamis, Ioannis Apostolakis
2008 conf
ICDE Workshops
Iraklis Varlamis, Vasilis Vassalos, Antonis Palaios
2008 conf
TSD
George Tsatsaronis, Iraklis Varlamis, Michalis Vazirgiannis
2007 A conf
ICWSM
Apostolos Kritikopoulos, Martha Sideri, Iraklis Varlamis
2007 conf
BNCOD Workshops
Apostolos Kritikopoulos, Martha Sideri, Iraklis Varlamis
2006 conf
EC-TEL Workshops
Iraklis Varlamis, Ioannis Apostolakis
2006 conf
AAA-IDEA
Apostolos Kritikopoulos, Martha Sideri, Iraklis Varlamis
2005 conf
WISE Workshops
Iraklis Varlamis, Ioannis Apostolakis, Marianthi Karatza
2004 J jnl
Multim. Tools Appl.
Iraklis Varlamis, Michalis Vazirgiannis, Iosif Lazaridis, M. Papageorgiou, Themis Panayiotopoulos
2004 J jnl
IEEE Trans. Knowl. Data Eng.
Iraklis Varlamis, Michalis Vazirgiannis, Maria Halkidi, Benjamin Nguyen
2003 A* conf
KDD
Magdalini Eirinaki, Michalis Vazirgiannis, Iraklis Varlamis
2003 J jnl
VLDB J.
Maria Halkidi, Benjamin Nguyen, Iraklis Varlamis, Michalis Vazirgiannis
2003
Iraklis Varlamis
2001 B conf
ACM Symposium on Document Engineering
Iraklis Varlamis, Michalis Vazirgiannis
2001 C conf
IDEAS
Iraklis Varlamis, Michalis Vazirgiannis
2000 A conf
IEEE International Conference on Multimedia and Expo (I)
Iraklis Varlamis, Michalis Vazirgiannis, Iosif Lazaridis
s3-storage/s3_uploader.py
← Index s3-storage/s3_uploader.py python
# python s3_uploader.py /path/to/files repository_name --notes "Optional notes"
import hashlib
import multiprocessing
from multiprocessing import Pool
import sys
import logging
from logging.handlers import QueueHandler
from datetime import datetime
import os
import time
import json
from enum import Enum
import tempfile
import magic
from typing import Optional, Dict, Any
from dotenv import load_dotenv
from datetime import timezone

# File handling
import py7zr
import pyzipper
from magika import Magika

# S3 and database
from minio import Minio
import clickhouse_connect

load_dotenv(override=True)

class UploadResult(Enum):
    CORRECTLY = 0
    FAILED = 1
    SKIPPED = 2  # For duplicates

class FileNameFormatter(logging.Formatter):
    def format(self, record):
        record.filenameinfo = getattr(record, "filenameinfo", "unknown")
        return super().format(record)

def setup_logger(log_file, filename):
    """Set up a logger for a specific file"""
    logger = logging.getLogger(filename)
    if not logger.handlers:
        if os.getenv("SERVER_ENV") == "prod":
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)
            
        # Create file handler
        handler = logging.FileHandler(log_file)
        formatter = FileNameFormatter(
            "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
        )
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False
    return logger

def logger_thread(log_queue, log_file):
    handler = logging.FileHandler(log_file)
    formatter = FileNameFormatter(
        "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
    )
    handler.setFormatter(formatter)

    while True:
        try:
            record = log_queue.get()
            if record is None:
                break
            message = formatter.format(record)
            handler.stream.write(message + "\n")
            handler.stream.flush()
        except Exception:
            import traceback
            print("[ERR] Error in logger thread:", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

def get_s3_key(sha256: str, is_archived: bool, original_ext: str = None) -> str:
    """
    Generate S3 key using sharding pattern with appropriate extension
    
    Args:
        sha256: The file's SHA256 hash
        is_archived: Whether the file was already archived (zip/7z)
        original_ext: The original file extension (if any)
    """
    # If file was already archived, keep its extension
    if is_archived and original_ext and original_ext.lower() in ['.zip', '.7z']:
        extension = original_ext
    else:
        # For files we archived ourselves, use .zip
        extension = '.zip'
        
    return f"{sha256[:2]}/{sha256[2:4]}/{sha256}{extension}"

def process_single_file(args):
    """Independent worker function for processing a single file"""
    filepath, file_number, total_files, config, log_file = args
    filename = os.path.basename(filepath)
    base_logger = setup_logger(log_file, filename)
    extra = {"filenameinfo": filename}
    logger = logging.LoggerAdapter(base_logger, extra)
    s3_client = None
    ch_client = None

    try:
        logger.info(f"Processing file {file_number}/{total_files}: {filepath}")

        # Create connections for this process
        s3_client = Minio(
            config["s3_endpoint"],
            access_key=config["s3_access_key"],
            secret_key=config["s3_secret_key"],
            secure=True
        )
        
        ch_client = clickhouse_connect.get_client(
            host=config['clickhouse_host'],
            port=config['clickhouse_port'],
            username=config['clickhouse_user'],
            password=config['clickhouse_password'],
            database=config['clickhouse_database'],
            verify=config['clickhouse_verify']
        )

        # Process the file and get contents
        ext = os.path.splitext(filepath.lower())[1]
        is_archived = ext in ['.zip', '.7z']

        with tempfile.TemporaryDirectory() as temp_dir:
            try:
                if filename.startswith("."):
                    logger.debug(f"Skipping hidden file: {filename}")
                    return UploadResult.SKIPPED

                elif ext == ".zip":
                    logger.debug(f"Processing ZIP file: {filepath}")
                    with pyzipper.AESZipFile(filepath) as zf:
                        zf.pwd = b"infected"
                        filename = zf.namelist()[0]
                        zf.extractall(temp_dir)
                        extracted_path = os.path.join(temp_dir, filename)
                        
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                            
                elif ext == ".7z":
                    logger.debug(f"Processing 7z file: {filepath}")
                    with py7zr.SevenZipFile(filepath, mode="r", password="infected") as z:
                        z.extractall(path=temp_dir)
                        # Get first file in the archive
                        for root, _, files in os.walk(temp_dir):
                            if files:
                                filename = files[0]
                                extracted_path = os.path.join(root, filename)
                                break
                                
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                else:
                    logger.debug(f"Processing non-archived file: {filepath}")
                    # For non-archived files, create password protected zip
                    with open(filepath, "rb") as f:
                        file_content = f.read()
                    filename = os.path.basename(filepath)
                    
                    # Create password protected zip
                    with tempfile.NamedTemporaryFile(delete=False) as temp_zip:
                        with pyzipper.AESZipFile(
                            temp_zip.name,
                            'w',
                            compression=pyzipper.ZIP_LZMA,
                            encryption=pyzipper.WZ_AES
                        ) as zf:
                            zf.pwd = b'infected'
                            zf.writestr(filename, file_content)
                        
                        with open(temp_zip.name, 'rb') as f:
                            archive_content = f.read()
                    
                    os.unlink(temp_zip.name)

                # Calculate hash
                sha256 = hashlib.sha256(file_content).hexdigest()
                # s3_key = f"{sha256[:2]}/{sha256[2:4]}/{sha256}"
                s3_key = get_s3_key(sha256, is_archived, ext if is_archived else None)
                logger.debug(f"Calculated SHA256: {sha256}")

                # Check if exists in S3
                try:
                    s3_client.stat_object(config["s3_bucket"], s3_key)
                    exists = True
                    logger.debug(f"File exists in S3: {s3_key}")
                except:
                    exists = False
                    logger.debug(f"File does not exist in S3: {s3_key}")

                # Prepare metadata
                max_timestamp = int(datetime(9999, 12, 31, 23, 59, 59, tzinfo=timezone.utc).timestamp() * 1000)
                now = datetime.now(timezone.utc)
                now_timestamp = int(now.timestamp() * 1000)
                inverted_timestamp = datetime.fromtimestamp((max_timestamp - now_timestamp)/1000, tz=timezone.utc)


                data = [[
                    sha256,                     # String
                    filename,                   # String
                    config['repository'],       # String
                    len(file_content),         # UInt64
                    magic.from_buffer(file_content),        # String
                    magic.from_buffer(file_content, mime=True),  # String
                    Magika().identify_bytes(file_content).output.ct_label,  # String
                    now,                       # upload_date
                    now,                       # first_seen
                    inverted_timestamp,        # version_date for replacing
                    config['s3_bucket'],       # String
                    s3_key,                    # String
                    config['notes'] if config['notes'] else None  # Nullable(String)
                ]]

                column_names = [
                    'sha256', 'filename', 'repository', 'file_size',
                    'filetype', 'filetype_mime', 'filetype_magika',
                    'upload_date', 'first_seen', 'version_date', 's3_bucket', 's3_key', 'notes'
                ]

                column_type_names = [
                    'String', 'String', 'LowCardinality(String)', 'UInt64',
                    'String', 'String', 'String',
                    'DateTime64(3, \'UTC\')', 'DateTime64(3, \'UTC\')', 
                    'DateTime64(3, \'UTC\')', 'String', 'String', 'Nullable(String)'
                ]
                
                if exists:
                    # Just update database
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Updated metadata for existing file: {sha256}")
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                    return UploadResult.SKIPPED
                else:
                    try:    
                        # Upload to S3 and insert metadata
                        import io
                        file_data = io.BytesIO(archive_content)
                        s3_client.put_object(
                            bucket_name=config['s3_bucket'],
                                object_name=s3_key,
                                data=file_data,
                                length=len(archive_content)
                            )
                        logger.info(f"Uploaded to S3: {s3_key}")
                    except Exception as e:
                        logger.error(f"Error uploading to S3: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED
                    
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Successfully processed file: {sha256}")
                        return UploadResult.CORRECTLY
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED

            except Exception as e:
                logger.error(f"Error processing file: {str(e)}")
                import traceback
                logger.error(f"Full traceback: {traceback.format_exc()}")
                return UploadResult.FAILED

    except Exception as e:
        logger.error(f"Error in worker: {str(e)}")
        return UploadResult.FAILED
    finally:
        # if s3_client:
        #     s3_client.close()
        if ch_client:
            ch_client.close()
        if base_logger and base_logger.handlers:
            for handler in base_logger.handlers:
                handler.close()
            base_logger.handlers.clear()

class S3Uploader:
    def __init__(self, path: str, repository: str, notes: Optional[str] = None):
        """
        Initialize S3 uploader
        
        Args:
            path: Path to file or directory to process
            repository: Repository name
            notes: Optional notes to add to all files
        """
        self.path = path
        self.repository = repository
        self.notes = notes
        
        # Initialize multiprocessing components
        self.manager = multiprocessing.Manager()
        # self.log_queue = self.manager.Queue()
        self.total_results = self.manager.dict({result: 0 for result in UploadResult})
        
        # Set up logging
        self.today = datetime.today().strftime("%Y%m%dT%H%M%S")
        # self.log_file = os.getenv("LOG_FILE_PATH", "./logs/") + f"{self.today}-{self.repository}-upload.txt"
        log_base_path = os.getenv("LOG_FILE_PATH")
        if not log_base_path:
            log_base_path = os.path.join(os.getcwd(), "logs")  # Default to ./logs directory
        self.log_file = os.path.join(log_base_path, f"{self.today}-{self.repository}-upload.txt")
        os.makedirs(os.path.dirname(self.log_file), exist_ok=True)

        # Initialize S3 client
        self.s3_client = Minio(
            os.getenv("S3_ENDPOINT"),
            access_key=os.getenv("S3_ACCESS_KEY"),
            secret_key=os.getenv("S3_SECRET_KEY"),
            secure=True  # Set to False if not using HTTPS
        )
        self.bucket_name = os.getenv("S3_BUCKET")

        # Initialize ClickHouse client
        self.ch_client = clickhouse_connect.get_client(
            host=os.getenv('CLICKHOUSE_HOST'),
            port=os.getenv('CLICKHOUSE_PORT'),
            username=os.getenv('CLICKHOUSE_USER'),
            password=os.getenv('CLICKHOUSE_PASSWORD'),
            database=os.getenv('CLICKHOUSE_DATABASE'),
            verify=os.getenv('CLICKHOUSE_ENFORCE_SSL', 'False')
        )
        
        # Ensure database table exists
        self._create_table()

    def _create_table(self):
        """Create the file catalog table if it doesn't exist"""
        create_table_query = """
            CREATE TABLE IF NOT EXISTS samples_catalog (
                sha256 String,
                filename String,
                repository LowCardinality(String),
                file_size UInt64,
                filetype String,
                filetype_mime String,
                filetype_magika String,
                upload_date DateTime64(3, 'UTC'),
                first_seen DateTime64(3, 'UTC'),
                version_date DateTime64(3, 'UTC'),  -- This will be inverted timestamp
                s3_bucket String,
                s3_key String,
                notes Nullable(String),
                PRIMARY KEY (sha256, repository)
            ) ENGINE = ReplacingMergeTree(version_date)
            ORDER BY (sha256, repository)
        """
        self.ch_client.command(create_table_query)

    # # def upload(self):
    # #     """Main upload function with multiprocessing support"""
    # #     start_time = time.time()

    # #     config = {
    # #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    # #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    # #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    # #         "s3_bucket": os.getenv("S3_BUCKET"),
    # #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    # #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    # #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    # #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    # #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    # #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    # #         "repository": self.repository,
    # #         "notes": self.notes
    # #     }

    # #     try:
    # #         # Get list of files
    # #         if os.path.isfile(self.path):
    # #             files = [self.path] if not self.path.endswith('.txt') else [
    # #                 line.strip() for line in open(self.path) 
    # #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    # #             ]
    # #         elif os.path.isdir(self.path):
    # #             files = [
    # #                 os.path.join(root, file)
    # #                 for root, _, files in os.walk(self.path)
    # #                 for file in files
    # #                 if not file.startswith('.')
    # #             ]
    # #         else:
    # #             print(f"[ERR] Invalid path: {self.path}")
    # #             return

    # #         total_files = len(files)
    # #         print(f"Found {total_files} files to process")

    # #         with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    # #             results = pool.map(
    # #                 process_single_file,
    # #                 [(f, i + 1, total_files, config, self.log_file) for i, f in enumerate(files)]
    # #             )

    # #         # Update statistics
    # #         for result in results:
    # #             if result is not None:
    # #                 self.total_results[result] += 1

    # #         # Generate summary
    # #         end_time = time.time()
    # #         elapsed_time = end_time - start_time
    # #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    # #         summary = (
    # #             f"\n\nUpload finished for {self.path}"
    # #             f"\nTime required: {elapsed_time_pretty}"
    # #             f"\nResults:"
    # #             f"\n- Total processed: {sum(self.total_results.values())}"
    # #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    # #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    # #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    # #         )

    # #         with open(self.log_file, "a") as f:
    # #             f.write(summary)

    # #         print(summary)

    # #     except Exception as e:
    # #         print(f"[ERR] Error in upload process: {str(e)}")

    # def upload(self):
    #     """Main upload function with multiprocessing support"""
    #     start_time = time.time()
    #     BATCH_SIZE = 1000  # Process files in batches of 1000

    #     config = {
    #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    #         "s3_bucket": os.getenv("S3_BUCKET"),
    #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    #         "repository": self.repository,
    #         "notes": self.notes
    #     }

    #     try:
    #         # Get list of files
    #         if os.path.isfile(self.path):
    #             files = [self.path] if not self.path.endswith('.txt') else [
    #                 line.strip() for line in open(self.path) 
    #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    #             ]
    #         elif os.path.isdir(self.path):
    #             files = [
    #                 os.path.join(root, file)
    #                 for root, _, files in os.walk(self.path)
    #                 for file in files
    #                 if not file.startswith('.')
    #             ]
    #         else:
    #             print(f"[ERR] Invalid path: {self.path}")
    #             return

    #         total_files = len(files)
    #         print(f"Found {total_files} files to process")

    #         # Process files in batches
    #         for i in range(0, total_files, BATCH_SIZE):
    #             batch_files = files[i:i + BATCH_SIZE]
    #             batch_start = i + 1
    #             batch_end = min(i + BATCH_SIZE, total_files)
    #             print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
    #             with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    #                 batch_results = pool.map(
    #                     process_single_file,
    #                     [(f, j + 1, total_files, config, self.log_file) 
    #                         for j, f in enumerate(batch_files, start=i)]
    #                 )
                    
    #                 # Update statistics for this batch
    #                 for result in batch_results:
    #                     if result is not None:
    #                         self.total_results[result] += 1

    #                 # Print intermediate summary
    #                 print(f"Batch {batch_start}-{batch_end} completed:")
    #                 print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
    #                 print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
    #                 print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

    #         # Generate final summary
    #         end_time = time.time()
    #         elapsed_time = end_time - start_time
    #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    #         summary = (
    #             f"\n\nUpload finished for {self.path}"
    #             f"\nTime required: {elapsed_time_pretty}"
    #             f"\nResults:"
    #             f"\n- Total processed: {sum(self.total_results.values())}"
    #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    #         )

    #         with open(self.log_file, "a") as f:
    #             f.write(summary)

    #         print(summary)

    #     except Exception as e:
    #         print(f"[ERR] Error in upload process: {str(e)}")

    def upload(self):
        """Main upload function with multiprocessing support"""
        start_time = time.time()
        BATCH_SIZE = 1000  # Process files in batches of 1000

        config = {
            "s3_endpoint": os.getenv("S3_ENDPOINT"),
            "s3_access_key": os.getenv("S3_ACCESS_KEY"),
            "s3_secret_key": os.getenv("S3_SECRET_KEY"),
            "s3_bucket": os.getenv("S3_BUCKET"),
            "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
            "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
            "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
            "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
            "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
            "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
            "repository": self.repository,
            "notes": self.notes
        }

        try:
            # Get all existing filenames for this repository
            query = f"SELECT filename FROM samples_catalog WHERE repository = '{self.repository}'"
            # existing_files = set()
            # for row in self.ch_client.query(query).result_rows:
            #     filename = os.path.splitext(row[0])[0]  # Strip extension
            #     existing_files.add(filename)
            existing_files = set(row[0] for row in self.ch_client.query(query).result_rows)
            print(f"Found {len(existing_files)} existing files in repository")

            # Get list of files to process
            if os.path.isfile(self.path):
                files = [self.path] if not self.path.endswith('.txt') else [
                    line.strip() for line in open(self.path) 
                    if line.strip() and not os.path.basename(line.strip()).startswith('.')
                ]
            elif os.path.isdir(self.path):
                files = [
                    os.path.join(root, file)
                    for root, _, files in os.walk(self.path)
                    for file in files
                    if not file.startswith('.')
                ]
            else:
                print(f"[ERR] Invalid path: {self.path}")
                return

            # Filter out files that are already in the repository
            files_to_process = []
            for f in files:
                basename = os.path.splitext(os.path.basename(f))[0]
                if basename not in existing_files:
                    files_to_process.append(f)

            total_files = len(files_to_process)
            skipped_files = len(files) - total_files
            print(f"Found {total_files} new files to process (skipped {skipped_files} existing files)")

            if total_files == 0:
                print("No new files to process")
                return

            # Process files in batches
            for i in range(0, total_files, BATCH_SIZE):
                batch_files = files_to_process[i:i + BATCH_SIZE]
                batch_start = i + 1
                batch_end = min(i + BATCH_SIZE, total_files)
                print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
                with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
                    batch_results = pool.map(
                        process_single_file,
                        [(f, j + 1, total_files, config, self.log_file) 
                        for j, f in enumerate(batch_files, start=i)]
                    )
                    
                    # Update statistics for this batch
                    for result in batch_results:
                        if result is not None:
                            self.total_results[result] += 1

                    # Print intermediate summary
                    print(f"Batch {batch_start}-{batch_end} completed:")
                    print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
                    print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
                    print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

            # Generate final summary
            end_time = time.time()
            elapsed_time = end_time - start_time
            elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

            summary = (
                f"\n\nUpload finished for {self.path}"
                f"\nTime required: {elapsed_time_pretty}"
                f"\nResults:"
                f"\n- Files already in repository: {skipped_files}"
                f"\n- New files processed: {total_files}"
                f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
                f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
                f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
            )

            with open(self.log_file, "a") as f:
                f.write(summary)

            print(summary)

        except Exception as e:
            print(f"[ERR] Error in upload process: {str(e)}")
            import traceback
            print(traceback.format_exc())

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description='Upload malware samples to S3 and catalog them.')
    parser.add_argument('path', help='Path to file or directory to process')
    parser.add_argument('repository', help='Repository name')
    parser.add_argument('--notes', help='Optional notes to add to all files', default=None)
    
    args = parser.parse_args()
    
    uploader = S3Uploader(args.path, args.repository, args.notes)
    uploader.upload()