FOSSology  4.6.0
Open Source License Compliance by Open Source Software
dbmigrate_cmu-mach.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2026 Siemens AG
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
9 
28 function Migrate_Cmu_Mach(DbManager $dbManager, $verbose = false)
29 {
30  if (!$dbManager->existsTable('license_ref')) {
31  return;
32  }
33 
34  $dbManager->begin();
35 
36  $row = $dbManager->getSingleRow(
37  "SELECT
38  (SELECT rf_pk FROM license_ref WHERE rf_shortname='CMU' LIMIT 1) AS cmu_id,
39  (SELECT rf_pk FROM license_ref WHERE rf_shortname='CMU-Mach' LIMIT 1) AS cmu_mach_id",
40  array(),
41  __METHOD__ . '.getIds'
42  );
43 
44  $cmuId = (!empty($row) && !empty($row['cmu_id'])) ? intval($row['cmu_id']) : 0;
45  $cmuMachId = (!empty($row) && !empty($row['cmu_mach_id'])) ? intval($row['cmu_mach_id']) : 0;
46 
47  // Case A: only legacy CMU exists -> rename it to CMU-Mach (no duplicate created).
48  if ($cmuId > 0 && $cmuMachId === 0) {
49  $dbManager->queryOnce(
50  "UPDATE license_ref
51  SET rf_shortname='CMU-Mach',
52  rf_fullname='CMU Mach License',
53  rf_url='https://www.cs.cmu.edu/~410/licenses.html'
54  WHERE rf_pk=$cmuId",
55  __METHOD__ . '.renameOnlyCmu'
56  );
57  $cmuMachId = $cmuId;
58  $cmuId = 0;
59  }
60 
61  // Case B: both exist -> move references, then delete the legacy CMU row.
62  if ($cmuId > 0 && $cmuMachId > 0 && $cmuId !== $cmuMachId) {
63  // Update known rf_fk / license FK columns referencing license_ref.
64  $updates = [
65  "UPDATE clearing_event SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
66  "UPDATE license_file SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
67  "UPDATE license_map SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
68  "UPDATE license_set_bulk SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
69  "UPDATE obligation_map SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
70  "UPDATE upload_clearing_license SET rf_fk=$cmuMachId WHERE rf_fk=$cmuId",
71 
72  "UPDATE comp_result SET first_rf_fk=$cmuMachId WHERE first_rf_fk=$cmuId",
73  "UPDATE comp_result SET second_rf_fk=$cmuMachId WHERE second_rf_fk=$cmuId",
74  "UPDATE license_rules SET first_rf_fk=$cmuMachId WHERE first_rf_fk=$cmuId",
75  "UPDATE license_rules SET second_rf_fk=$cmuMachId WHERE second_rf_fk=$cmuId",
76  ];
77 
78  foreach ($updates as $sql) {
79  $dbManager->queryOnce($sql, __METHOD__ . '.moveRefs');
80  }
81 
82  // Only delete if nothing references the old CMU row anymore.
83  $dbManager->queryOnce(
84  "DELETE FROM license_ref WHERE rf_pk=$cmuId",
85  __METHOD__ . '.deleteLegacyCmu'
86  );
87  }
88 
89  if ($dbManager->existsTable('report_info')) {
90  $pattern = '(^|[^A-Za-z0-9-])CMU([^A-Za-z0-9-]|$)';
91  $replacement = '\\1CMU-Mach\\2';
92 
93  $stmtName = __METHOD__ . '.updateReportInfoExcludedObligations';
94  $sql = "UPDATE report_info
95  SET ri_excluded_obligations = regexp_replace(COALESCE(ri_excluded_obligations::text, ''), $1, $2, 'g')::json
96  WHERE ri_excluded_obligations IS NOT NULL
97  AND ri_excluded_obligations::text ~ $1";
98  $dbManager->prepare($stmtName, $sql);
99  $res = $dbManager->execute($stmtName, array($pattern, $replacement));
100  $dbManager->freeResult($res);
101  }
102 
103  $dbManager->commit();
104 }
105 
Migrate_Cmu_Mach(DbManager $dbManager, $verbose=false)