FOSSology  4.4.0
Open Source License Compliance by Open Source Software
UploadDao.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2014-2018 Siemens AG
4  Authors: Andreas Würl, Steffen Weber
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
8 
9 namespace Fossology\Lib\Dao;
10 
20 use Monolog\Logger;
21 
22 require_once(dirname(dirname(__FILE__)) . "/common-dir.php");
23 
24 class UploadDao
25 {
26 
27  const REUSE_NONE = 0;
28  const REUSE_ENHANCED = 2;
29  const REUSE_MAIN = 4;
30  const REUSE_CONF = 16;
31  const REUSE_COPYRIGHT = 128;
32  const UNIFIED_REPORT_HEADINGS = array(
33  "assessment" => array("Assessment Summary" => true),
34  "compliancetasks" => array("Required license compliance tasks" => true),
35  "acknowledgements" => array("Acknowledgements" => true),
36  "exportrestrictions" => array("Export Restrictions" => true),
37  "intellectualProperty" => array("Patent Relevant Statements" => true),
38  "notes" => array("Notes" => true),
39  "scanresults" => array("Results of License Scan" => true),
40  "mainlicenses" => array("Main Licenses" => true),
41  "redlicense" => array("Other OSS Licenses (red) - Do not Use Licenses" => true),
42  "yellowlicense" => array("Other OSS Licenses (yellow) - additional obligations to common rules (e.g. copyleft)" => true),
43  "whitelicense" => array("Other OSS Licenses (white) - only common rules" => true),
44  "overviewwithwithoutobligations" => array("Overview of All Licenses with or without Obligations" => true),
45  "copyrights" => array("Copyrights" => true),
46  "copyrightsuf" => array("Copyrights (User Findings)" => true),
47  "bulkfindings" => array("Bulk Findings" => true),
48  "licensenf" => array("Non-Functional Licenses" => true),
49  "irrelevantfiles" => array("Irrelevant Files" => true),
50  "dnufiles" => array("Do not use Files" => true),
51  "changelog" => array("Clearing Protocol Change Log" => true)
52  );
53  const CLIXML_REPORT_HEADINGS = array(
54  "mainlicensesclixml" => array("Main Licenses" => true),
55  "licensepath" => array("License File Path" => true),
56  "licensehash" => array("License File Hash" => true),
57  "copyrightsclixml" => array("Copyrights" => true),
58  "copyrightpath" => array("Copyright File Path" => true),
59  "copyrighthash" => array("Copyright File Hash" => true),
60  "exportrestrictionsclixml" => array("Export Restrictions(ECC)" => true),
61  "eccpath" => array("ECC File Path" => true),
62  "ecchash" => array("ECC File Hash" => true),
63  "intellectualPropertyclixml" => array("Identified Patent Relevant Analysis(IPRA)" => true),
64  "iprapath" => array("IPRA File Path" => true),
65  "iprahash" => array("IPRA File Hash" => true),
66  "allobligations" => array("All Obligations" => true),
67  "acknowledgementsclixml" => array("Acknowledgements" => true),
68  "irrelevantfilesclixml" => array("Irrelevant Files" => true),
69  "dnufilesclixml" => array("Do not use Files" => true),
70  "notesclixml" => array("Additional Notes" => true)
71  );
73  private $dbManager;
75  private $logger;
77  private $permissionDao;
78 
79  public function __construct(DbManager $dbManager, Logger $logger, UploadPermissionDao $uploadPermissionDao)
80  {
81  $this->dbManager = $dbManager;
82  $this->logger = $logger;
83  $this->permissionDao = $uploadPermissionDao;
84  }
85 
86 
92  public function getUploadEntry($uploadTreeId, $uploadTreeTableName = "uploadtree")
93  {
94  $stmt = __METHOD__ . ".$uploadTreeTableName";
95  $uploadEntry = $this->dbManager->getSingleRow("SELECT * FROM $uploadTreeTableName WHERE uploadtree_pk = $1",
96  array($uploadTreeId), $stmt);
97  if ($uploadEntry) {
98  $uploadEntry['tablename'] = $uploadTreeTableName;
99  }
100  return $uploadEntry;
101  }
102 
109  public function getUploadtreeIdFromPfile($uploadFk, $pfileFk)
110  {
111  $uploadTreeTableName = $this->getUploadtreeTableName($uploadFk);
112  $stmt = __METHOD__ . ".$uploadTreeTableName";
113  $uploadEntry = $this->dbManager->getSingleRow("SELECT uploadtree_pk " .
114  "FROM $uploadTreeTableName " .
115  "WHERE upload_fk = $1 AND pfile_fk = $2",
116  array($uploadFk, $pfileFk), $stmt);
117  return intval($uploadEntry['uploadtree_pk']);
118  }
119 
124  public function getUpload($uploadId)
125  {
126  $stmt = __METHOD__;
127  $row = $this->dbManager->getSingleRow("SELECT * FROM upload WHERE upload_pk = $1",
128  array($uploadId), $stmt);
129 
130  return $row ? Upload::createFromTable($row) : null;
131  }
132 
133  public function getActiveUploadsArray()
134  {
135  $stmt = __METHOD__;
136  $queryResult = $this->dbManager->getRows("SELECT * FROM upload where pfile_fk IS NOT NULL",
137  array(), $stmt);
138 
139  $results = array();
140  foreach ($queryResult as $row) {
141  $results[] = Upload::createFromTable($row);
142  }
143 
144  return $results;
145  }
146 
152  public function getItemTreeBounds($itemId, $uploadTreeTableName = "uploadtree")
153  {
154  $uploadEntryData = $this->getUploadEntry($itemId, $uploadTreeTableName);
155  return $this->createItemTreeBounds($uploadEntryData, $uploadTreeTableName);
156  }
157 
163  public function getItemTreeBoundsFromUploadId($uploadTreeId, $uploadId)
164  {
165  $uploadTreeTableName = $this->getUploadtreeTableName($uploadId);
166  return $this->getItemTreeBounds($uploadTreeId, $uploadTreeTableName);
167  }
168 
175  public function getParentItemBounds($uploadId, $uploadTreeTableName = null)
176  {
177  if ($uploadTreeTableName === null) {
178  $uploadTreeTableName = $this->getUploadtreeTableName($uploadId);
179  }
180 
181  $stmt = __METHOD__ . ".$uploadTreeTableName";
182  $parameters = array();
183  $uploadCondition = $this->handleUploadIdForTable($uploadTreeTableName, $uploadId, $parameters);
184 
185  $uploadEntryData = $this->dbManager->getSingleRow("SELECT * FROM $uploadTreeTableName
186  WHERE parent IS NULL
187  $uploadCondition
188  ",
189  $parameters, $stmt);
190 
191  return $uploadEntryData ? $this->createItemTreeBounds($uploadEntryData, $uploadTreeTableName) : false;
192  }
193 
198  public function countPlainFiles(ItemTreeBounds $itemTreeBounds)
199  {
200  $uploadTreeTableName = $itemTreeBounds->getUploadTreeTableName();
201 
202  $stmt = __METHOD__ . ".$uploadTreeTableName";
203  $parameters = array($itemTreeBounds->getLeft(), $itemTreeBounds->getRight());
204  $uploadCondition = $this->handleUploadIdForTable($uploadTreeTableName, $itemTreeBounds->getUploadId(), $parameters);
205 
206  $row = $this->dbManager->getSingleRow("SELECT count(*) as count FROM $uploadTreeTableName
207  WHERE lft BETWEEN $1 AND $2
208  $uploadCondition
209  AND ((ufile_mode & (3<<28))=0)
210  AND pfile_fk != 0",
211  $parameters, $stmt);
212  return intval($row["count"]);
213  }
214 
215  private function handleUploadIdForTable($uploadTreeTableName, $uploadId, &$parameters)
216  {
217  if ($uploadTreeTableName === "uploadtree" || $uploadTreeTableName === "uploadtree_a") {
218  $parameters[] = $uploadId;
219  return " AND upload_fk = $" . count($parameters) . " ";
220  } else {
221  return "";
222  }
223  }
224 
228  public function getStatusTypeMap()
229  {
230  global $container;
232  $uploadStatus = $container->get('upload_status.types');
233  return $uploadStatus->getMap();
234  }
235 
243  public function getStatus($uploadId, $groupId)
244  {
245  if ($this->isAccessible($uploadId, $groupId)) {
246  $row = $this->dbManager->getSingleRow("SELECT status_fk " .
247  "FROM upload_clearing WHERE upload_fk=$1 AND group_fk=$2;",
248  array($uploadId, $groupId));
249  if (false === $row) {
250  return 1;
251  }
252  return $row['status_fk'];
253  } else {
254  throw new \Exception("permission denied");
255  }
256  }
257 
258 
266  public function getAssignee($uploadId, $groupId)
267  {
268  if ($this->isAccessible($uploadId, $groupId)) {
269  $row = $this->dbManager->getSingleRow("SELECT assignee FROM upload_clearing WHERE upload_fk=$1 AND group_fk=$2;",
270  array($uploadId, $groupId));
271  if (false === $row) {
272  return 1;
273  }
274  return $row['assignee'];
275  } else {
276  throw new \Exception("permission denied");
277  }
278  }
279 
287  public function getAssigneeDate(int $uploadId): ?string
288  {
289  $sql = "SELECT event_ts FROM upload_events WHERE upload_fk = $1 " .
290  "AND event_type = " . UploadEvents::ASSIGNEE_EVENT;
291  $row = $this->dbManager->getSingleRow($sql, [$uploadId], __METHOD__);
292  if (empty($row) || empty($row["event_ts"])) {
293  return null;
294  }
295  return $row["event_ts"];
296  }
297 
304  public function getClosedDate(int $uploadId): ?string
305  {
306  $sql = "SELECT event_ts FROM upload_events WHERE upload_fk = $1 " .
307  "AND event_type = " . UploadEvents::UPLOAD_CLOSED_EVENT;
308  $row = $this->dbManager->getSingleRow($sql, [$uploadId], __METHOD__);
309  if (empty($row) || empty($row["event_ts"])) {
310  return null;
311  }
312  return $row["event_ts"];
313  }
314 
323  public function getUploadtreeTableName($uploadId)
324  {
325  if (!empty($uploadId)) {
326  $statementName = __METHOD__;
327  $row = $this->dbManager->getSingleRow(
328  "SELECT uploadtree_tablename FROM upload WHERE upload_pk=$1",
329  array($uploadId),
330  $statementName
331  );
332  if (!empty($row['uploadtree_tablename'])) {
333  return $row['uploadtree_tablename'];
334  }
335  }
336  return "uploadtree";
337  }
338 
344  public function getNextItem($uploadId, $itemId, $options = null)
345  {
346  return $this->getItemByDirection($uploadId, $itemId, self::DIR_FWD, $options);
347  }
348 
355  public function getPreviousItem($uploadId, $itemId, $options = null)
356  {
357  return $this->getItemByDirection($uploadId, $itemId, self::DIR_BCK, $options);
358  }
359 
360  const DIR_FWD = 1;
361  const DIR_BCK = -1;
362  const NOT_FOUND = null;
363 
364 
372  public function getItemByDirection($uploadId, $itemId, $direction, $options)
373  {
374  $uploadTreeTableName = $this->getUploadtreeTableName($uploadId);
375  $originItem = $this->getUploadEntry($itemId, $uploadTreeTableName);
376  $originLft = $originItem['lft'];
377 
378  $options[UploadTreeProxy::OPT_ITEM_FILTER] = " AND ut.ufile_mode & (3<<28) = 0";
379  $uploadTreeViewName = 'items2care';
380 
381  if ($direction == self::DIR_FWD) {
382  $uploadTreeViewName .= 'fwd';
383  $options[UploadTreeProxy::OPT_ITEM_FILTER] .= " AND lft>$1";
384  $order = 'ASC';
385  } else {
386  $uploadTreeViewName .= 'bwd';
387  $options[UploadTreeProxy::OPT_ITEM_FILTER] .= " AND lft<$1";
388  $order = 'DESC';
389  }
390 
391  $uploadTreeView = new UploadTreeProxy($uploadId, $options, $uploadTreeTableName, $uploadTreeViewName);
392  $statementName = __METHOD__ . ".$uploadTreeViewName.";
393  $query = $uploadTreeView->getDbViewQuery()." ORDER BY lft $order";
394 
395  $newItemRow = $this->dbManager->getSingleRow("$query LIMIT 1", array($originLft), $statementName);
396  if ($newItemRow) {
397  return $this->createItem($newItemRow, $uploadTreeTableName);
398  } else {
399  return self::NOT_FOUND;
400  }
401  }
402 
403 
408  public function getUploadParent($uploadId)
409  {
410  $uploadTreeTableName = $this->getUploadtreeTableName($uploadId);
411  $statementname = __METHOD__ . $uploadTreeTableName;
412 
413  $parent = $this->dbManager->getSingleRow(
414  "SELECT uploadtree_pk
415  FROM $uploadTreeTableName
416  WHERE upload_fk=$1 AND parent IS NULL", array($uploadId), $statementname);
417  if (false === $parent) {
418  throw new \Exception("Missing upload tree parent for upload");
419  }
420  return $parent['uploadtree_pk'];
421  }
422 
423  public function getLeftAndRight($uploadtreeID, $uploadTreeTableName = "uploadtree")
424  {
425  $statementName = __METHOD__ . $uploadTreeTableName;
426  $leftRight = $this->dbManager->getSingleRow(
427  "SELECT lft,rgt FROM $uploadTreeTableName WHERE uploadtree_pk = $1",
428  array($uploadtreeID), $statementName
429  );
430 
431  return array($leftRight['lft'], $leftRight['rgt']);
432  }
433 
439  public function getContainingFileCount(ItemTreeBounds $itemTreeBounds, UploadTreeProxy $uploadTreeView)
440  {
441  $sql = "SELECT count(*) FROM " . $uploadTreeView->getDbViewName() . " WHERE lft BETWEEN $1 AND $2";
442  $result = $this->dbManager->getSingleRow($sql
443  , array($itemTreeBounds->getLeft(), $itemTreeBounds->getRight()), __METHOD__ . $uploadTreeView->asCTE());
444  return $result['count'];
445  }
446 
453  public function getContainedItems(ItemTreeBounds $itemTreeBounds, $addCondition = "", $addParameters = array())
454  {
455  $uploadTreeTableName = $itemTreeBounds->getUploadTreeTableName();
456 
457  $statementName = __METHOD__ . ".$uploadTreeTableName";
458 
459  $view = new UploadTreeViewProxy($itemTreeBounds, array(UploadTreeViewProxy::CONDITION_PLAIN_FILES));
460 
461  $this->dbManager->prepare($statementName,
462  $view->asCTE() . " SELECT * FROM " . $view->getDbViewName() ." ut ".
463  ($addCondition ? " WHERE " . $addCondition : ''));
464  $res = $this->dbManager->execute($statementName, $addParameters);
465  $items = array();
466 
467  while ($row = $this->dbManager->fetchArray($res)) {
468  $items[] = $this->createItem($row, $uploadTreeTableName);
469  }
470  $this->dbManager->freeResult($res);
471  return $items;
472  }
473 
481  public function addReusedUpload($uploadId, $reusedUploadId, $groupId, $reusedGroupId, $reuseMode=0)
482  {
483  $this->dbManager->insertTableRow('upload_reuse',
484  array('upload_fk'=>$uploadId, 'group_fk'=> $groupId, 'reused_upload_fk'=>$reusedUploadId, 'reused_group_fk'=>$reusedGroupId,'reuse_mode'=>$reuseMode));
485  }
486 
493  public function getReusedUpload($uploadId, $groupId)
494  {
495  $statementName = __METHOD__;
496 
497  $this->dbManager->prepare($statementName,
498  "SELECT reused_upload_fk, reused_group_fk, reuse_mode FROM upload_reuse WHERE upload_fk = $1 AND group_fk=$2 ORDER BY date_added DESC");
499  $res = $this->dbManager->execute($statementName, array($uploadId, $groupId));
500  $reusedPairs = $this->dbManager->fetchAll($res);
501  $this->dbManager->freeResult($res);
502  return $reusedPairs;
503  }
504 
510  protected function createItem($uploadEntry, $uploadTreeTableName)
511  {
512  $itemTreeBounds = new ItemTreeBounds(
513  intval($uploadEntry['uploadtree_pk']),
514  $uploadTreeTableName,
515  intval($uploadEntry['upload_fk']),
516  intval($uploadEntry['lft']), intval($uploadEntry['rgt']));
517 
518  $parent = $uploadEntry['parent'];
519  return new Item(
520  $itemTreeBounds, $parent !== null ? intval($parent) : null, intval($uploadEntry['pfile_fk']), intval($uploadEntry['ufile_mode']), $uploadEntry['ufile_name']
521  );
522  }
523 
530  protected function createItemTreeBounds($uploadEntryData, $uploadTreeTableName)
531  {
532  if ($uploadEntryData === false) {
533  throw new Exception("did not find uploadTreeId in $uploadTreeTableName");
534  }
535  return new ItemTreeBounds(intval($uploadEntryData['uploadtree_pk']), $uploadTreeTableName, intval($uploadEntryData['upload_fk']), intval($uploadEntryData['lft']), intval($uploadEntryData['rgt']));
536  }
537 
543  public function countNonArtifactDescendants(ItemTreeBounds $itemTreeBounds, $isFlat=true)
544  {
545  $stmt=__METHOD__;
546  $sql = "SELECT count(*) FROM ".$itemTreeBounds->getUploadTreeTableName()." ut "
547  . "WHERE ut.upload_fk=$1";
548  $params = array($itemTreeBounds->getUploadId());
549  if (!$isFlat) {
550  $stmt = __METHOD__.'.parent';
551  $params[] = $itemTreeBounds->getItemId();
552  $sql .= " AND ut.ufile_mode & (1<<28) = 0 AND ut.realparent = $2";
553  } else {
554  $params[] = $itemTreeBounds->getLeft();
555  $params[] = $itemTreeBounds->getRight();
556  $sql .= " AND ut.ufile_mode & (3<<28) = 0 AND (ut.lft BETWEEN $2 AND $3)";
557  }
558 
559  $descendants = $this->dbManager->getSingleRow($sql,$params);
560  return $descendants['count'];
561  }
562 
563 
564  public function isAccessible($uploadId, $groupId)
565  {
566  return $this->permissionDao->isAccessible($uploadId, $groupId);
567  }
568 
569  public function isEditable($uploadId, $groupId)
570  {
571  return $this->permissionDao->isEditable($uploadId, $groupId);
572  }
573 
574  public function makeAccessibleToGroup($uploadId, $groupId, $perm=null)
575  {
576  $this->permissionDao->makeAccessibleToGroup($uploadId, $groupId, $perm);
577  }
578 
579  public function makeAccessibleToAllGroupsOf($uploadId, $userId, $perm=null)
580  {
581  $this->permissionDao->makeAccessibleToAllGroupsOf($uploadId, $userId, $perm);
582  }
583 
588  public function getUploadHashes($uploadId)
589  {
590  $pfile = $this->dbManager->getSingleRow('SELECT pfile.* FROM upload, pfile WHERE upload_pk=$1 AND pfile_fk=pfile_pk',
591  array($uploadId), __METHOD__);
592  return array('sha1'=>$pfile['pfile_sha1'],'md5'=>$pfile['pfile_md5'],'sha256'=>$pfile['pfile_sha256']);
593  }
594 
601  public function getFatItemArray($itemId,$uploadId,$uploadtreeTablename)
602  {
603  $sqlChildrenOf = "SELECT COUNT(*) FROM $uploadtreeTablename s
604  WHERE ufile_mode&(1<<28)=0 and s.upload_fk=$2 AND s.realparent=";
605  $sql="WITH RECURSIVE item_path (item_id,num_children,depth,ufile_mode,ufile_name) AS (
606  SELECT uploadtree_pk item_id, ($sqlChildrenOf $1) num_children, 0 depth, ufile_mode, ufile_name
607  FROM $uploadtreeTablename WHERE upload_fk=$2 AND uploadtree_pk=$1
608  UNION
609  SELECT uploadtree_pk item_id, ($sqlChildrenOf ut.uploadtree_pk) num_children,
610  item_path.depth+1 depth, ut.ufile_mode, item_path.ufile_name||'/'||ut.ufile_name ufile_name
611  FROM $uploadtreeTablename ut INNER JOIN item_path ON item_id=ut.realparent
612  WHERE upload_fk=$2 AND ut.ufile_mode&(1<<28)=0 AND num_children<2
613  )
614  SELECT * FROM item_path WHERE num_children!=1 OR ufile_mode&(1<<29)=0 ORDER BY depth DESC LIMIT 1";
615  return $this->dbManager->getSingleRow($sql,array($itemId, $uploadId),__METHOD__.$uploadtreeTablename);
616  }
617 
624  public function getFatItemId($itemId,$uploadId,$uploadtreeTablename)
625  {
626  $itemRow = $this->getFatItemArray($itemId,$uploadId,$uploadtreeTablename);
627  return $itemRow['item_id'];
628  }
629 
634  public function getPFileDataPerFileName(ItemTreeBounds $itemTreeBounds)
635  {
636  $uploadTreeTableName = $itemTreeBounds->getUploadTreeTableName();
637  $statementName = __METHOD__ . '.' . $uploadTreeTableName;
638  $param = array();
639 
640  $param[] = $itemTreeBounds->getLeft();
641  $param[] = $itemTreeBounds->getRight();
642  $condition = " lft BETWEEN $1 AND $2";
643  $condition .= " AND (ufile_mode & (1<<28)) = 0";
644 
645  if ('uploadtree_a' == $uploadTreeTableName) {
646  $param[] = $itemTreeBounds->getUploadId();
647  $condition .= " AND upload_fk=$".count($param);
648  }
649 
650  $sql = "
651 SELECT ufile_name, uploadtree_pk, lft, rgt, ufile_mode,
652  pfile_pk, pfile_md5, pfile_sha1, pfile_sha256
653 FROM $uploadTreeTableName
654  LEFT JOIN pfile
655  ON pfile_fk = pfile_pk
656 WHERE $condition
657 ORDER BY lft asc
658 ";
659 
660  $this->dbManager->prepare($statementName, $sql);
661  $result = $this->dbManager->execute($statementName, $param);
662  $pfilePerFileName = array();
663 
664  $row = $this->dbManager->fetchArray($result);
665  $pathStack = array($row['ufile_name']);
666  $rgtStack = array($row['rgt']);
667  $lastLft = $row['lft'];
668  $this->addToPFilePerFileName($pfilePerFileName, $pathStack, $row);
669  while ($row = $this->dbManager->fetchArray($result)) {
670  if ($row['lft'] < $lastLft) {
671  continue;
672  }
673 
674  $this->updateStackState($pathStack, $rgtStack, $lastLft, $row);
675  $this->addToPFilePerFileName($pfilePerFileName, $pathStack, $row);
676  }
677  $this->dbManager->freeResult($result);
678  return $pfilePerFileName;
679  }
680 
681  private function updateStackState(&$pathStack, &$rgtStack, &$lastLft, $row)
682  {
683  if ($row['lft'] >= $lastLft) {
684  while (count($rgtStack) > 0 && $row['lft'] > $rgtStack[count($rgtStack)-1]) {
685  array_pop($pathStack);
686  array_pop($rgtStack);
687  }
688  if ($row['lft'] > $lastLft) {
689  $pathStack[] = $row['ufile_name'];
690  $rgtStack[] = $row['rgt'];
691  $lastLft = $row['lft'];
692  }
693  }
694  }
695 
696  private function addToPFilePerFileName(&$pfilePerFileName, $pathStack, $row)
697  {
698  if (($row['ufile_mode'] & (1 << 29)) == 0) {
699  $path = implode('/', $pathStack);
700  $pfilePerFileName[$path]['pfile_pk'] = $row['pfile_pk'];
701  $pfilePerFileName[$path]['uploadtree_pk'] = $row['uploadtree_pk'];
702  $pfilePerFileName[$path]['md5'] = $row['pfile_md5'];
703  $pfilePerFileName[$path]['sha1'] = $row['pfile_sha1'];
704  $pfilePerFileName[$path]['sha256'] = $row['pfile_sha256'];
705  }
706  }
707 
713  public function getPFilesDataPerHashAlgo(ItemTreeBounds $itemTreeBounds, $hashAlgo="sha1")
714  {
715  $uploadTreeTableName = $itemTreeBounds->getUploadTreeTableName();
716  $statementName = __METHOD__ . '.' . $uploadTreeTableName;
717  $param = array();
718 
719  $param[] = $itemTreeBounds->getLeft();
720  $param[] = $itemTreeBounds->getRight();
721  $condition = " lft BETWEEN $1 AND $2";
722  $condition .= " AND (ufile_mode & (1<<28)) = 0";
723 
724  if ('uploadtree_a' == $uploadTreeTableName) {
725  $param[] = $itemTreeBounds->getUploadId();
726  $condition .= " AND upload_fk=$".count($param);
727  }
728  $condition .= " AND pfile_$hashAlgo IS NOT NULL";
729 
730  $sql = "
731 SELECT pfile_fk, uploadtree_pk, ufile_mode, pfile_$hashAlgo as hash
732 FROM $uploadTreeTableName
733  LEFT JOIN pfile
734  ON pfile_fk = pfile_pk
735 WHERE $condition
736 ORDER BY lft asc
737 ";
738 
739  $this->dbManager->prepare($statementName, $sql);
740  $result = $this->dbManager->execute($statementName, $param);
741 
742  $pfilePerHashAlgo = array();
743  while ($row = $this->dbManager->fetchArray($result)) {
744  if (($row['ufile_mode']&(1<<29)) == 0) {
745  $pfilePerHashAlgo[strtolower($row['hash'])][] = array('pfile_pk' => $row['pfile_fk'],
746  'uploadtree_pk' => $row['uploadtree_pk']);
747  }
748  }
749  $this->dbManager->freeResult($result);
750  return $pfilePerHashAlgo;
751  }
752 
753 
754  /* @param int $uploadId
755  * @return array
756  */
757  public function getReportInfo($uploadId)
758  {
759  $stmt = __METHOD__;
760  $sql = "SELECT * FROM report_info WHERE upload_fk = $1";
761  $row = $this->dbManager->getSingleRow($sql, array($uploadId), $stmt);
762 
763  if (empty($row)) {
764  $this->dbManager->begin();
765  $stmt = __METHOD__.'ifempty';
766  $sql = "INSERT INTO report_info (upload_fk) VALUES ($1) RETURNING *";
767  $row = $this->dbManager->getSingleRow($sql, array($uploadId), $stmt);
768  $this->dbManager->commit();
769  }
770  return $row;
771  }
772 
780  public function updateReportInfo($uploadId, $column, $value)
781  {
782  if ($column === "ri_unifiedcolumns") {
783  $value = json_decode($value, true);
784  $oldValues = $this->getReportInfo($uploadId)["ri_unifiedcolumns"];
785  if (!empty($oldValues)) {
786  $oldValues = json_decode($oldValues, true);
787  } else {
788  $oldValues = self::UNIFIED_REPORT_HEADINGS;
789  }
790  foreach ($value as $key => $val) {
791  $newValText = array_keys($val)[0];
792  $newValValue = array_values($val)[0];
793  $newValValue = ($newValValue === true || $newValValue == "true") ? "on" : null;
794  $oldValues[$key] = [$newValText => $newValValue];
795  }
796  $value = json_encode($oldValues);
797  } elseif ($column === "ri_excluded_obligations") {
798  $value = json_decode($value, true);
799  $oldValues = $this->getReportInfo($uploadId)["ri_excluded_obligations"];
800  if (!empty($oldValues)) {
801  $oldValues = json_decode($oldValues, true);
802  } else {
803  $oldValues = [];
804  }
805  foreach ($value as $key => $newValue) {
806  $oldValues[$key] = $newValue;
807  }
808  $value = json_encode($oldValues);
809  } elseif ($column === "ri_globaldecision") {
810  $value = filter_var($value, FILTER_VALIDATE_BOOL);
811  }
812 
813  $sql = "UPDATE report_info SET $column = $2 WHERE upload_fk = $1;";
814  $stmt = __METHOD__ . "updateReportInfo" . $column;
815  $this->dbManager->getSingleRow($sql, [$uploadId, $value], $stmt);
816  return true;
817  }
818 
819  /* @param int $uploadId
820  * @return int
821  */
822  public function getGlobalDecisionSettingsFromInfo($uploadId, $setGlobal=null)
823  {
824  $stmt = __METHOD__ . 'get';
825  $sql = "SELECT ri_globaldecision FROM report_info WHERE upload_fk = $1";
826  $row = $this->dbManager->getSingleRow($sql, array($uploadId), $stmt);
827  if (empty($row)) {
828  if ($setGlobal === null) {
829  // Old upload, set default value to enable
830  $setGlobal = 1;
831  }
832  $stmt = __METHOD__ . 'ifempty';
833  $sql = "INSERT INTO report_info (upload_fk, ri_globaldecision) VALUES ($1, $2) RETURNING ri_globaldecision";
834  $row = $this->dbManager->getSingleRow($sql, array($uploadId, $setGlobal), $stmt);
835  }
836 
837  if (!empty($setGlobal)) {
838  $stmt = __METHOD__ . 'update';
839  $sql = "UPDATE report_info SET ri_globaldecision = $2 WHERE upload_fk = $1 RETURNING ri_globaldecision";
840  $row = $this->dbManager->getSingleRow($sql, array($uploadId, $setGlobal), $stmt);
841  }
842 
843  return $row['ri_globaldecision'];
844  }
845 
851  public function getUploadHashesFromPfileId($pfilePk)
852  {
853  $stmt = __METHOD__."getUploadHashesFromPfileId";
854  $sql = "SELECT * FROM pfile WHERE pfile_pk = $1";
855  $row = $this->dbManager->getSingleRow($sql, array($pfilePk), $stmt);
856 
857  return ["sha1" => $row["pfile_sha1"], "md5" => $row["pfile_md5"], "sha256" => $row["pfile_sha256"]];
858  }
859 
865  public function insertReportConfReuse($uploadId, $reusedUploadId)
866  {
867  $stmt = __METHOD__ . ".checkReused";
868  $sql = "SELECT 1 AS exists FROM report_info WHERE upload_fk = $1 LIMIT 1;";
869  $row = $this->dbManager->getSingleRow($sql, array($reusedUploadId), $stmt);
870 
871  if (empty($row['exists'])) {
872  return false;
873  }
874 
875  $this->dbManager->begin();
876 
877  $stmt = __METHOD__ . ".removeExists";
878  $sql = "DELETE FROM report_info WHERE upload_fk = $1;";
879  $this->dbManager->getSingleRow($sql, [$uploadId], $stmt);
880 
881  $stmt = __METHOD__ . ".getAllColumns";
882  $sql = "SELECT string_agg(column_name, ',') AS columns
883  FROM information_schema.columns
884  WHERE table_name = 'report_info'
885  AND column_name != 'ri_pk'
886  AND column_name != 'upload_fk';";
887  $row = $this->dbManager->getSingleRow($sql, [], $stmt);
888  $columns = $row['columns'];
889 
890  $stmt = __METHOD__."CopyinsertReportConfReuse";
891  $this->dbManager->prepare($stmt,
892  "INSERT INTO report_info(upload_fk, $columns)
893  SELECT $1, $columns
894  FROM report_info WHERE upload_fk = $2"
895  );
896  $this->dbManager->freeResult($this->dbManager->execute(
897  $stmt, array($uploadId, $reusedUploadId)
898  ));
899 
900  $this->dbManager->commit();
901  return true;
902  }
903 }
getUploadtreeIdFromPfile($uploadFk, $pfileFk)
Definition: UploadDao.php:109
getParentItemBounds($uploadId, $uploadTreeTableName=null)
Definition: UploadDao.php:175
getReusedUpload($uploadId, $groupId)
Definition: UploadDao.php:493
createItem($uploadEntry, $uploadTreeTableName)
Definition: UploadDao.php:510
addReusedUpload($uploadId, $reusedUploadId, $groupId, $reusedGroupId, $reuseMode=0)
Definition: UploadDao.php:481
countNonArtifactDescendants(ItemTreeBounds $itemTreeBounds, $isFlat=true)
Definition: UploadDao.php:543
createItemTreeBounds($uploadEntryData, $uploadTreeTableName)
Definition: UploadDao.php:530
getUploadHashesFromPfileId($pfilePk)
Get Pfile hashes from the pfile id.
Definition: UploadDao.php:851
getPFileDataPerFileName(ItemTreeBounds $itemTreeBounds)
Definition: UploadDao.php:634
getContainingFileCount(ItemTreeBounds $itemTreeBounds, UploadTreeProxy $uploadTreeView)
Definition: UploadDao.php:439
getFatItemId($itemId, $uploadId, $uploadtreeTablename)
Definition: UploadDao.php:624
getItemTreeBoundsFromUploadId($uploadTreeId, $uploadId)
Definition: UploadDao.php:163
getAssigneeDate(int $uploadId)
Definition: UploadDao.php:287
getPFilesDataPerHashAlgo(ItemTreeBounds $itemTreeBounds, $hashAlgo="sha1")
Definition: UploadDao.php:713
getItemByDirection($uploadId, $itemId, $direction, $options)
Definition: UploadDao.php:372
getFatItemArray($itemId, $uploadId, $uploadtreeTablename)
Definition: UploadDao.php:601
countPlainFiles(ItemTreeBounds $itemTreeBounds)
Definition: UploadDao.php:198
getNextItem($uploadId, $itemId, $options=null)
Definition: UploadDao.php:344
getClosedDate(int $uploadId)
Definition: UploadDao.php:304
updateReportInfo($uploadId, $column, $value)
Update report info for upload.
Definition: UploadDao.php:780
getPreviousItem($uploadId, $itemId, $options=null)
Definition: UploadDao.php:355
getItemTreeBounds($itemId, $uploadTreeTableName="uploadtree")
Definition: UploadDao.php:152
getUploadtreeTableName($uploadId)
Get the uploadtree table name for this upload_pk If upload_pk does not exist, return "uploadtree".
Definition: UploadDao.php:323
getAssignee($uploadId, $groupId)
Get the upload assignee id.
Definition: UploadDao.php:266
getUploadEntry($uploadTreeId, $uploadTreeTableName="uploadtree")
Definition: UploadDao.php:92
insertReportConfReuse($uploadId, $reusedUploadId)
Definition: UploadDao.php:865
getStatus($uploadId, $groupId)
Get the upload status.
Definition: UploadDao.php:243
This class contains the events for the upload_events table.
Fossology exception.
Definition: Exception.php:15
asCTE()
Common Table Expressions.
Definition: DbViewProxy.php:69
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16