FOSSology  4.4.0
Open Source License Compliance by Open Source Software
databasehandler.cc
1 /*
2  SPDX-FileCopyrightText: © 2014-2015 Siemens AG
3 
4  SPDX-License-Identifier: GPL-2.0-only
5 */
6 
7 #include "databasehandler.hpp"
8 #include "libfossUtils.hpp"
9 
10 #include <iostream>
11 
12 using namespace fo;
13 using namespace std;
14 
15 NinkaDatabaseHandler::NinkaDatabaseHandler(DbManager dbManager) :
17 {
18 }
19 
20 vector<unsigned long> NinkaDatabaseHandler::queryFileIdsForUpload(int uploadId)
21 {
22  return queryFileIdsVectorForUpload(uploadId, true);
23 }
24 
25 // TODO: see function saveToDb() from src/monk/agent/database.c
26 bool NinkaDatabaseHandler::saveLicenseMatch(int agentId, long pFileId, long licenseId, unsigned percentMatch)
27 {
28  return dbManager.execPrepared(
29  fo_dbManager_PrepareStamement(
31  "saveLicenseMatch",
32  "INSERT INTO license_file (agent_fk, pfile_fk, rf_fk, rf_match_pct) VALUES ($1, $2, $3, $4)",
33  int, long, long, unsigned
34  ),
35  agentId,
36  pFileId,
37  licenseId,
38  percentMatch
39  );
40 }
41 
42 unsigned long NinkaDatabaseHandler::selectOrInsertLicenseIdForName(string rfShortName)
43 {
44  bool success = false;
45  unsigned long result = 0;
46 
47  unsigned count = 0;
48  while ((!success) && count++<3)
49  {
50  if (!dbManager.begin())
51  continue;
52 
53  dbManager.queryPrintf("LOCK TABLE license_ref");
54 
55  QueryResult queryResult = dbManager.execPrepared(
56  fo_dbManager_PrepareStamement(
58  "selectOrInsertLicenseIdForName",
59  "WITH "
60  "selectExisting AS ("
61  "SELECT rf_pk FROM ONLY license_ref"
62  " WHERE rf_shortname = $1"
63  "),"
64  "insertNew AS ("
65  "INSERT INTO license_ref(rf_shortname, rf_text, rf_detector_type)"
66  " SELECT $1, $2, $3"
67  " WHERE NOT EXISTS(SELECT * FROM selectExisting)"
68  " RETURNING rf_pk"
69  ") "
70 
71  "SELECT rf_pk FROM insertNew "
72  "UNION "
73  "SELECT rf_pk FROM selectExisting",
74  char*, char*, int
75  ),
76  rfShortName.c_str(),
77  "License by Ninka.",
78  3
79  );
80 
81  success = queryResult && queryResult.getRowCount() > 0;
82 
83  if (success) {
84  success &= dbManager.commit();
85 
86  if (success) {
87  result = queryResult.getSimpleResults(0, fo::stringToUnsignedLong)[0];
88  }
89  } else {
91  }
92  }
93 
94  return result;
95 }
96 
97 NinkaDatabaseHandler NinkaDatabaseHandler::spawn() const
98 {
99  DbManager spawnedDbMan(dbManager.spawn());
100  return NinkaDatabaseHandler(spawnedDbMan);
101 }
102 
103 void NinkaDatabaseHandler::insertOrCacheLicenseIdForName(string const& rfShortName)
104 {
105  if (getCachedLicenseIdForName(rfShortName)==0)
106  {
107  unsigned long licenseId = selectOrInsertLicenseIdForName(rfShortName);
108 
109  if (licenseId > 0)
110  {
111  licenseRefCache.insert(std::make_pair(rfShortName, licenseId));
112  }
113  }
114 }
115 
116 unsigned long NinkaDatabaseHandler::getCachedLicenseIdForName(string const& rfShortName) const
117 {
118  std::unordered_map<string,long>::const_iterator findIterator = licenseRefCache.find(rfShortName);
119  if (findIterator != licenseRefCache.end())
120  {
121  return findIterator->second;
122  }
123  else
124  {
125  return 0;
126  }
127 }
Database handler for agents.
std::vector< unsigned long > queryFileIdsVectorForUpload(int uploadId, bool ignoreFilesWithMimeType) const
Get pfile ids for a given upload id.
DbManager dbManager
DbManager to use.
DB wrapper for agents.
QueryResult execPrepared(fo_dbManager_PreparedStatement *stmt,...) const
Execute a prepared statement with new parameters.
QueryResult queryPrintf(const char *queryFormat,...) const
Execute a query in printf format.
fo_dbManager * getStruct_dbManager() const
DbManager spawn() const
Wrapper for DB result.
std::vector< T > getSimpleResults(int columnN, T(functionP)(const char *)) const
Get vector of a single column from query result.
General utility functions for CPP.
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16
fo namespace holds the FOSSology library functions.
unsigned long stringToUnsignedLong(const char *string)
Definition: libfossUtils.cc:20