SearchSECODatabaseAPI
DatabaseRequestHandler.h
1/*
2This program has been developed by students from the bachelor Computer Science at
3Utrecht University within the Software Project course.
4© Copyright Utrecht University (Department of Information and Computing Sciences)
5*/
6
7#pragma once
8#include "Definitions.h"
9#include "DatabaseHandler.h"
10#include "Statistics.h"
11
12#include <mutex>
13#include <tuple>
14#include <queue>
15#include <unistd.h>
16
17
18#define PROJECT_DATA_SIZE 9
19#define METHOD_DATA_MIN_SIZE 5
20#define HEX_CHARS "0123456789abcdef"
21#define UUID_REGEX "[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}"
22#define HASHES_MAX_SIZE 1000
23#define FILES_MAX_SIZE 500
24
29{
30public:
31 DatabaseRequestHandler(DatabaseHandler *database, Statistics *stats, std::string ip = IP, int port = DBPORT);
32
47 std::string handleUploadRequest(std::string request, std::string client);
48
62 std::string handleCheckRequest(std::string request);
63
74 std::string handleCheckRequest(std::vector<Hash> hashes);
75
93 std::string handleCheckUploadRequest(std::string request, std::string client);
94
107 std::string handleExtractProjectsRequest(std::string request);
108
122 std::string handlePrevProjectsRequest(std::string request);
123
136 std::string handleGetAuthorRequest(std::string request);
137
150 std::string handleGetMethodsByAuthorRequest(std::string request);
151
157 std::string getExtension(std::string file);
158
159private:
168 ProjectIn requestToProject(std::string request);
169
179 MethodIn dataEntryToMethod(std::string dataEntry);
180
191 std::vector<Hash> requestToHashes(std::string request);
192
198 bool isValidHash(Hash hash);
199
209 std::string methodsToString(std::vector<MethodOut> methods, char dataDelimiter, char methodDelimiter);
210
220 std::string projectsToString(std::vector<ProjectOut> projects, char dataDelimiter, char projectDelimiter);
221
227 std::vector<MethodOut> getMethods(std::vector<Hash> hashes);
228
236 std::vector<ProjectOut> getProjects(std::queue<std::pair<ProjectID, Version>> keys);
237
243 std::vector<ProjectOut> getPrevProjects(std::queue<ProjectID> projectQueue);
244
251 std::vector<MethodOut> singleHashToMethodsThread(std::queue<Hash> &hashes, std::mutex &queueLock);
252
259 std::vector<ProjectOut> singleSearchProjectThread(std::queue<std::pair<ProjectID, Version>> &projectKeyQueue,
260 std::mutex &queueLock);
261
269 std::vector<ProjectOut> singlePrevProjectThread(std::queue<ProjectID> &projectIDs, std::mutex &queueLock);
270
281 void handleUploadThreads(ProjectIn project, std::queue<MethodIn> methodQueue, bool newProject,
282 ProjectOut prevProject, std::vector<File> unchangedFiles);
283
293 void singleUploadThread(std::queue<MethodIn> &methods, std::mutex &queueLock, ProjectIn project,
294 long long prevVersion, long long parserVersion, bool newProject);
295
304 void handleUpdateUnchangedFilesThreads(ProjectIn project, ProjectOut prevProject,
305 std::vector<File> unchangedFiles);
306
317 std::vector<Hash>
318 singleUpdateUnchangedFilesThread(std::queue<std::pair<std::vector<Hash>, std::vector<File>>> &hashFiles,
319 std::mutex &queueLock, ProjectIn project, long long prevVersion);
320
329 std::string authorsToString(std::vector<std::pair<Author, AuthorID>> authors);
330
336 std::vector<std::pair<Author, AuthorID>> getAuthors(std::vector<AuthorID> authorIDs);
337
344 std::vector<std::pair<Author, AuthorID>> singleIDToAuthorThread(std::queue<AuthorID> &authorIDs,
345 std::mutex &queueLock);
346
352 std::vector<std::pair<MethodID, AuthorID>> getMethodsByAuthor(std::vector<AuthorID> authorIDs);
353
360 std::vector<std::pair<MethodID, AuthorID>> singleAuthorToMethodsThread(std::queue<AuthorID> &authorIDs,
361 std::mutex &queueLock);
362
371 std::string methodIDsToString(std::vector<std::pair<MethodID, AuthorID>> methods);
372
381 std::tuple<> connectWithRetry(std::string ip, int port);
382
388 bool tryUploadProjectWithRetry(ProjectIn project);
389
401 std::tuple<> addMethodWithRetry(MethodIn method, ProjectIn project, long long prevVersion, long long parserVersion,
402 bool newProject);
403
412 ProjectOut getPrevProjectWithRetry(ProjectID projectID);
413
425 std::vector<Hash> updateUnchangedFilesWithRetry(std::pair<std::vector<Hash>, std::vector<File>> hashFile,
426 ProjectIn project, long long prevVersion);
427
435 std::vector<MethodOut> hashToMethodsWithRetry(Hash hash);
436
445 ProjectOut searchForProjectWithRetry(ProjectID projectID, Version version);
446
452 Author idToAuthorWithRetry(AuthorID id);
453
459 std::vector<MethodID> authorToMethodsWithRetry(AuthorID authorID);
460
470 template <class T> std::vector<std::vector<T>> toChunks(std::vector<T> list, int chunkSize)
471 {
472 std::vector<T> currentChunk = {};
473 std::vector<std::vector<T>> chunks = {};
474 for (T element : list)
475 {
476 currentChunk.push_back(element);
477 if (currentChunk.size() >= chunkSize)
478 {
479 chunks.push_back(currentChunk);
480 currentChunk.clear();
481 }
482 }
483 if (currentChunk.size() > 0)
484 {
485 chunks.push_back(currentChunk);
486 }
487
488 return chunks;
489 };
490
501 template <class T1, class T2>
502 std::queue<std::pair<std::vector<T1>, std::vector<T2>>> cartesianProductQueue(std::vector<std::vector<T1>> listT1,
503 std::vector<std::vector<T2>> listT2)
504 {
505 std::queue<std::pair<std::vector<T1>, std::vector<T2>>> pairQueue;
506 for (std::vector<T1> elemT1 : listT1)
507 {
508 for (std::vector<T2> elemT2 : listT2)
509 {
510 pairQueue.push(std::make_pair(elemT1, elemT2));
511 }
512 }
513
514 return pairQueue;
515 };
516
517 DatabaseHandler *database;
518 Statistics *stats;
519};
Handles interaction with database.
Definition: DatabaseHandler.h:23
Handles requests towards database.
Definition: DatabaseRequestHandler.h:29
std::string handleExtractProjectsRequest(std::string request)
Handles requests wanting to obtain project data from the database given their projectID and version.
Definition: DatabaseRequestHandlerProject.cpp:364
std::string handleCheckUploadRequest(std::string request, std::string client)
Handles requests wanting to first check for matches with existing methods in other projects,...
Definition: DatabaseRequestHandlerProject.cpp:16
std::string handleGetAuthorRequest(std::string request)
Handles a requests for retrieving the authors by the given IDs.
Definition: DatabaseRequestHandlerAuthor.cpp:50
std::string handlePrevProjectsRequest(std::string request)
Handles requests wanting to obtain project data from a the database from a previous version given the...
Definition: DatabaseRequestHandlerProject.cpp:404
std::string handleUploadRequest(std::string request, std::string client)
Handles requests which want to add one project with their corresponding methods to the database.
Definition: DatabaseRequestHandlerProject.cpp:58
std::string getExtension(std::string file)
Retrieves the extension from the passed file name.
Definition: DatabaseRequestHandlerMethod.cpp:126
std::string handleGetMethodsByAuthorRequest(std::string request)
Handles requests wanting to obtain methods with certain authors.
Definition: DatabaseRequestHandlerMethod.cpp:271
std::string handleCheckRequest(std::string request)
Handles requests wanting to obtain methods with certain hashes.
Definition: DatabaseRequestHandlerMethod.cpp:132
Stores the Prometheus statistics variables.
Definition: Statistics.h:35
Represents the data of an author.
Definition: Types.h:26
Represents the relevant data of a method to be put in the database.
Definition: Types.h:50
Represents the relevant data of a project when it is put into the database.
Definition: Types.h:94
Represents the relevant data of a project when it is returned to user. Difference with ProjectIn: aut...
Definition: Types.h:112