19 int bulk_onAllMatches(
MonkState* state,
const File* file,
const GArray* matches);
31 gchar* sql = g_strdup_printf(
"SELECT lft, rgt FROM %s WHERE uploadtree_pk = $1", tableName);
32 gchar* stmt = g_strdup_printf(
"setLeftAndRight.%s", tableName);
34 if ((!sql) || (!stmt))
38 fo_dbManager_PrepareStamement(
44 bulkArguments->uploadTreeId
52 if (leftAndRightResult) {
53 if (PQntuples(leftAndRightResult)==1) {
55 bulkArguments->uploadTreeLeft = atol(PQgetvalue(leftAndRightResult, 0, i++));
56 bulkArguments->uploadTreeRight = atol(PQgetvalue(leftAndRightResult, 0, i));
60 PQclear(leftAndRightResult);
65 void bulkArguments_contents_free(
BulkArguments* bulkArguments);
69 int queryBulkArguments(
MonkState* state,
long bulkId) {
73 fo_dbManager_PrepareStamement(
76 "SELECT ut.upload_fk, ut.uploadtree_pk, lrb.user_fk, lrb.group_fk, "
77 "lrb.rf_text, lrb.ignore_irrelevant, lrb.bulk_delimiters, lrb.scan_findings "
78 "FROM license_ref_bulk lrb INNER JOIN uploadtree ut "
79 "ON ut.uploadtree_pk = lrb.uploadtree_fk "
86 if (bulkArgumentsResult) {
87 if (PQntuples(bulkArgumentsResult)==1) {
91 bulkArguments->uploadId = atoi(PQgetvalue(bulkArgumentsResult, 0, column++));
92 bulkArguments->uploadTreeId = atol(PQgetvalue(bulkArgumentsResult, 0, column++));
93 bulkArguments->userId = atoi(PQgetvalue(bulkArgumentsResult, 0, column++));
94 bulkArguments->groupId = atoi(PQgetvalue(bulkArgumentsResult, 0, column++));
95 bulkArguments->refText = g_strdup(PQgetvalue(bulkArgumentsResult, 0, column++));
96 bulkArguments->ignoreIrre = strcmp(PQgetvalue(bulkArgumentsResult, 0, column++),
"t") == 0;
97 if (PQgetisnull(bulkArgumentsResult, 0, column) == 1)
99 bulkArguments->delimiters = g_strdup(DELIMITERS);
104 bulkArguments->delimiters = normalize_escape_string(PQgetvalue(bulkArgumentsResult, 0, column++));
106 bulkArguments->scanFindings = strcmp(PQgetvalue(bulkArgumentsResult, 0, column++),
"t") == 0;
107 bulkArguments->bulkId = bulkId;
108 bulkArguments->actions = queryBulkActions(state, bulkId);
111 state->ptr = bulkArguments;
113 if (!setLeftAndRight(state)) {
114 printf(
"FATAL: could not retrieve left and right for bulk id=%ld\n", bulkId);
115 bulkArguments_contents_free(state->ptr);
120 printf(
"FATAL: could not retrieve arguments for bulk scan with id=%ld\n", bulkId);
122 PQclear(bulkArgumentsResult);
130 fo_dbManager_PrepareStamement(
133 "SELECT rf_fk, removing, comment, reportinfo, acknowledgement FROM license_set_bulk WHERE lrb_fk = $1",
139 int numberOfRows = bulkActionsResult ? PQntuples(bulkActionsResult) : 0;
143 for (row = 0; row < numberOfRows; row++) {
146 action->licenseId = atoi(PQgetvalue(bulkActionsResult, row, column++));
147 action->removing = (strcmp(PQgetvalue(bulkActionsResult, row, column++),
"t") == 0);
148 action->comment = g_strdup(PQgetvalue(bulkActionsResult, row, column++));
149 action->reportinfo = g_strdup(PQgetvalue(bulkActionsResult, row, column++));
150 action->acknowledgement = g_strdup(PQgetvalue(bulkActionsResult, row, column++));
151 bulkActions[row] = action;
153 bulkActions[row] = NULL;
155 if (bulkActionsResult) {
156 PQclear(bulkActionsResult);
162 void bulkArguments_contents_free(
BulkArguments* bulkArguments) {
164 BulkAction **bulkActions = bulkArguments->actions;
165 for (
int i=0; bulkActions[i] != NULL; i++) {
166 free(bulkActions[i]);
170 g_free(bulkArguments->refText);
171 g_free(bulkArguments->delimiters);
176 int bulk_identification(
MonkState* state) {
180 .refId = bulkArguments->licenseId,
182 license.tokens = tokenize(bulkArguments->refText, bulkArguments->delimiters);
184 GArray* licenseArray = g_array_new(FALSE, FALSE,
sizeof (
License));
185 g_array_append_val(licenseArray,
license);
187 Licenses* licenses = buildLicenseIndexes(licenseArray, MIN_ADJACENT_MATCHES, 0);
189 PGresult* filesResult = queryFileIdsForUploadAndLimits(
191 bulkArguments->uploadId,
192 bulkArguments->uploadTreeLeft,
193 bulkArguments->uploadTreeRight,
194 bulkArguments->groupId,
195 bulkArguments->ignoreIrre,
196 bulkArguments->scanFindings
200 if (filesResult != NULL) {
201 int resultsCount = PQntuples(filesResult);
203 #ifdef MONK_MULTI_THREAD
207 MonkState threadLocalStateStore = *state;
208 MonkState* threadLocalState = &threadLocalStateStore;
210 threadLocalState->dbManager = fo_dbManager_fork(state->dbManager);
211 if (threadLocalState->dbManager) {
212 #ifdef MONK_MULTI_THREAD
213 #pragma omp for schedule(dynamic)
215 for (
int i = 0; i<resultsCount; i++) {
219 long fileId = atol(PQgetvalue(filesResult, i, 0));
222 &bulkCallbacks, bulkArguments->delimiters)) {
229 fo_dbManager_finish(threadLocalState->dbManager);
234 PQclear(filesResult);
237 licenses_free(licenses);
242 int main(
int argc,
char** argv) {
250 state->scanMode = MODE_BULK;
255 long bulkId = atol(schedulerCurrent);
257 if (bulkId == 0)
continue;
259 if (!queryBulkArguments(state, bulkId)) {
265 int arsId =
fo_WriteARS(fo_dbManager_getWrappedConnection(state->dbManager),
266 0, bulkArguments->uploadId, state->agentId, AGENT_BULK_ARS, NULL, 0);
271 if (!bulk_identification(state))
274 fo_WriteARS(fo_dbManager_getWrappedConnection(state->dbManager),
275 arsId, bulkArguments->uploadId, state->agentId, AGENT_BULK_ARS, NULL, 1);
277 bulkArguments_contents_free(bulkArguments);
281 scheduler_disconnect(state, 0);
285 int bulk_onAllMatches(
MonkState* state,
const File* file,
const GArray* matches) {
286 int haveAFullMatch = 0;
287 for (guint j=0; j<matches->len; j++) {
290 if (
match->type == MATCH_TYPE_FULL) {
301 if (!fo_dbManager_begin(state->dbManager))
304 BulkAction **actions = bulkArguments->actions;
307 bulkArguments->uploadId);
308 gchar* stmt = g_strdup_printf(
"saveBulkResult:decision.%s",
309 uploadtreeTableName);
310 if (bulkArguments->ignoreIrre)
312 insertSql = g_strdup_printf(
"INSERT INTO clearing_event(uploadtree_fk, user_fk, group_fk, "
313 "job_fk, type_fk, rf_fk, removed, comment, reportinfo, acknowledgement) "
314 "SELECT uploadtree_pk, $2, $3, $4, $5, $6, $7, $8, $9, $10 "
316 "SELECT DISTINCT ON(ut.uploadtree_pk, ut.pfile_fk, scopesort) "
317 "ut.pfile_fk pfile_fk, ut.uploadtree_pk, decision_type, "
318 "CASE cd.scope WHEN 1 THEN 1 ELSE 0 END AS scopesort"
320 " LEFT JOIN clearing_decision cd ON "
321 " ((ut.uploadtree_pk = cd.uploadtree_fk AND scope = 0 AND cd.group_fk = $3) "
322 " OR (ut.pfile_fk = cd.pfile_fk AND scope = 1)) "
323 " WHERE upload_fk = $11 AND (lft BETWEEN $12 AND $13) AND ut.pfile_fk = $1"
324 " ORDER BY ut.uploadtree_pk, scopesort, ut.pfile_fk, clearing_decision_pk DESC"
325 ") itemView WHERE decision_type != %d OR decision_type IS NULL"
326 " RETURNING clearing_event_pk;", uploadtreeTableName, DECISION_TYPE_FOR_IRRELEVANT);
327 stmt = g_strconcat(stmt,
".ignoreirre", NULL);
331 insertSql = g_strdup_printf(
"INSERT INTO clearing_event(uploadtree_fk, user_fk, group_fk, "
332 "job_fk, type_fk, rf_fk, removed, comment, reportinfo, acknowledgement)"
333 "SELECT uploadtree_pk, $2, $3, $4, $5, $6, $7, $8, $9, $10 "
335 " WHERE upload_fk = $11 AND (lft BETWEEN $12 AND $13) AND pfile_fk = $1"
336 " RETURNING clearing_event_pk;", uploadtreeTableName);
338 for (
int i = 0; actions[i] != NULL; i++) {
342 fo_dbManager_PrepareStamement(
346 long,
int,
int,
int,
int,
long,
int,
char*,
char*,
char*,
351 bulkArguments->userId,
352 bulkArguments->groupId,
353 bulkArguments->jobId,
356 action->removing ? 1 : 0,
359 action->acknowledgement,
361 bulkArguments->uploadId,
362 bulkArguments->uploadTreeLeft,
363 bulkArguments->uploadTreeRight
366 if (licenseDecisionIds) {
367 for (
int i=0; i<PQntuples(licenseDecisionIds);i++) {
368 long licenseDecisionEventId = atol(PQgetvalue(licenseDecisionIds,i,0));
370 for (guint j=0; j<matches->len; j++) {
373 if (
match->type != MATCH_TYPE_FULL)
377 DiffPoint highlight = getFullHighlightFor(file->tokens, highlightTokens->start, highlightTokens->length);
380 fo_dbManager_PrepareStamement(
382 "saveBulkResult:highlight",
383 "INSERT INTO highlight_bulk(clearing_event_fk, lrb_fk, start, len) VALUES($1,$2,$3,$4)",
384 long,
long,
size_t,
size_t
386 licenseDecisionEventId,
387 bulkArguments->bulkId,
392 if (highlightResult) {
393 PQclear(highlightResult);
395 fo_dbManager_rollback(state->dbManager);
400 PQclear(licenseDecisionIds);
402 fo_dbManager_rollback(state->dbManager);
410 return fo_dbManager_commit(state->dbManager);
int queryAgentId(DbManager &dbManager)
void matchPFileWithLicenses(CopyrightState const &state, int agentId, unsigned long pFileId, CopyrightDatabaseHandler &databaseHandler)
Get the file contents, scan for statements and save findings to database.
char * getUploadTreeTableName(fo_dbManager *dbManager, int uploadId)
Get the upload tree table name for a given upload.
FUNCTION int fo_WriteARS(PGconn *pgConn, int ars_pk, int upload_pk, int agent_pk, const char *tableName, const char *ars_status, int ars_success)
Write ars record.
The main FOSSology C library.
void fo_scheduler_heart(int i)
This function must be called by agents to let the scheduler know they are alive and how many items th...
void fo_scheduler_connect_dbMan(int *argc, char **argv, fo_dbManager **dbManager)
Make a connection from an agent to the scheduler and create a DB manager as well.
char * fo_scheduler_current()
Get the last read string from the scheduler.
int fo_scheduler_jobId()
Gets the id of the job that the agent is running.
char * fo_scheduler_next()
Get the next data to process from the scheduler.
PGresult * fo_dbManager_ExecPrepared(fo_dbManager_PreparedStatement *preparedStatement,...)
Execute a prepared statement.
Store the results of a regex match.