FOSSology  4.7.1
Open Source License Compliance by Open Source Software
SoftwareHeritageDao.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2019 Sandip Kumar Bhuyan
4  Author: Sandip Kumar Bhuyan<sandipbhuyan@gmail.com>
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
8 
9 namespace Fossology\Lib\Dao;
10 
13 use Monolog\Logger;
14 
20 {
21 
22  const SWH_STATUS_OK = 200;
23  const SWH_BAD_REQUEST = 400;
24  const SWH_NOT_FOUND = 404;
25  const SWH_RATELIMIT_EXCEED = 429;
26 
28  private $dbManager;
30  private $logger;
32  private $uploadDao;
33 
34  public function __construct(DbManager $dbManager, Logger $logger,UploadDao $uploadDao)
35  {
36  $this->dbManager = $dbManager;
37  $this->logger = $logger;
38  $this->uploadDao = $uploadDao;
39  }
40 
46  public function getSoftwareHeritagePfileFk($uploadId)
47  {
48  $uploadTreeTableName = $this->uploadDao->getUploadtreeTableName($uploadId);
49  $stmt = __METHOD__.$uploadTreeTableName;
50  $sql = "SELECT DISTINCT(SWH.pfile_fk) FROM $uploadTreeTableName UT
51  INNER JOIN software_heritage SWH ON SWH.pfile_fk = UT.pfile_fk
52  WHERE UT.upload_fk = $1";
53  return $this->dbManager->getRows($sql,array($uploadId),$stmt);
54  }
55 
56 
63  public function setSoftwareHeritageDetails($pfileId, $licenseDetails, $status)
64  {
65  if (!empty($this->dbManager->insertTableRow('software_heritage',['pfile_fk' => $pfileId, 'swh_shortnames' => $licenseDetails, 'swh_status' => $status]))) {
66  return true;
67  }
68  return false;
69  }
70 
76  public function getSoftwareHetiageRecord($pfileId)
77  {
78  $stmt = __METHOD__ . "getSoftwareHeritageRecord";
79  $row = $this->dbManager->getSingleRow(
80  "SELECT swh_shortnames, swh_status FROM software_heritage WHERE pfile_fk = $1",
81  array($pfileId), $stmt);
82  if (empty($row)) {
83  $row = [
84  'swh_status' => null,
85  'swh_shortnames' => null
86  ];
87  }
88  $img = '<img alt="done" src="images/red.png" class="icon-small"/>';
89  if (self::SWH_STATUS_OK == $row['swh_status']) {
90  $img = '<img alt="done" src="images/green.png" class="icon-small"/>';
91  }
92  return ["license" => $row['swh_shortnames'], "img" => $img];
93  }
94 
100  public function getAggregatedSWHRecord(ItemTreeBounds $itemTreeBounds)
101  {
102  $uploadTreeTableName = $itemTreeBounds->getUploadTreeTableName();
103  $uploadId = $itemTreeBounds->getUploadId();
104  $left = $itemTreeBounds->getLeft();
105  $right = $itemTreeBounds->getRight();
106 
107  $stmt = __METHOD__ . $uploadTreeTableName;
108  $sql = "SELECT
109  COUNT(*) AS total_files,
110  COUNT(SWH.pfile_fk) AS checked_files,
111  SUM(CASE WHEN SWH.swh_status = $1 THEN 1 ELSE 0 END) AS ok_files
112  FROM $uploadTreeTableName UT
113  LEFT JOIN software_heritage SWH ON SWH.pfile_fk = UT.pfile_fk
114  WHERE UT.upload_fk = $2
115  AND UT.lft BETWEEN $3 AND $4
116  AND UT.ufile_mode & (1<<29) = 0";
117 
118  $row = $this->dbManager->getSingleRow($sql, array(self::SWH_STATUS_OK, $uploadId, $left, $right), $stmt);
119 
120  $totalFiles = intval($row['total_files']);
121  $checkedFiles = intval($row['checked_files']);
122  $okFiles = intval($row['ok_files']);
123 
124  if ($totalFiles == 0) {
125  return ["license" => null, "img" => ""];
126  }
127 
128  $licenseNames = [];
129  if ($checkedFiles > 0) {
130  $licenseStmt = __METHOD__ . 'licenses' . $uploadTreeTableName;
131  $licenseSql = "SELECT DISTINCT SWH.swh_shortnames
132  FROM $uploadTreeTableName UT
133  INNER JOIN software_heritage SWH ON SWH.pfile_fk = UT.pfile_fk
134  WHERE UT.upload_fk = $1
135  AND UT.lft BETWEEN $2 AND $3
136  AND UT.ufile_mode & (1<<29) = 0
137  AND SWH.swh_shortnames IS NOT NULL
138  AND SWH.swh_shortnames != ''";
139  $licenseRows = $this->dbManager->getRows($licenseSql, array($uploadId, $left, $right), $licenseStmt);
140  foreach ($licenseRows as $licenseRow) {
141  $parts = explode(',', $licenseRow['swh_shortnames']);
142  foreach ($parts as $part) {
143  $trimmed = trim($part);
144  if (!empty($trimmed)) {
145  $licenseNames[$trimmed] = true;
146  }
147  }
148  }
149  }
150 
151  if ($checkedFiles == 0) {
152  return [
153  "license" => null,
154  "img" => '<img alt="pending" src="images/grey.png" class="icon-small"/>'
155  ];
156  }
157 
158  if ($okFiles == $totalFiles) {
159  $img = '<img alt="done" src="images/green.png" class="icon-small"/>';
160  } else {
161  $img = '<img alt="needs-attention" src="images/red.png" class="icon-small"/>';
162  }
163 
164  $licenseStr = !empty($licenseNames) ? implode(', ', array_keys($licenseNames)) : null;
165  return ["license" => $licenseStr, "img" => $img];
166  }
167 }
getAggregatedSWHRecord(ItemTreeBounds $itemTreeBounds)
Get aggregated SWH status for all files under a folder.
getSoftwareHetiageRecord($pfileId)
Get a record from Software Heritage schema from the PfileId.
getSoftwareHeritagePfileFk($uploadId)
Get all the pfile_fk stored in software heritage table.
setSoftwareHeritageDetails($pfileId, $licenseDetails, $status)
Store a record of Software Heritage license info in table.
char * trim(char *ptext)
Trimming whitespace.
Definition: fossconfig.c:690
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16