FOSSology  4.7.1
Open Source License Compliance by Open Source Software
fossinit.php
Go to the documentation of this file.
1 #!/usr/bin/php
2 <?php
3 /*
4  SPDX-FileCopyrightText: © 2008-2015 Hewlett-Packard Development Company, L.P.
5  SPDX-FileCopyrightText: © 2014-2015, 2019 Siemens AG
6 
7  SPDX-License-Identifier: GPL-2.0-only
8 */
9 
13 function explainUsage()
14 {
15  global $argv;
16 
17  $usage = "Usage: " . basename($argv[0]) . " [options]
18  Update FOSSology database. This should be used immediately after an install or update. Options are:
19  -c path to fossology configuration files
20  -d {database name} default is 'fossology'
21  -f {file} update the schema with file generated by schema-export.php
22  -l update the license_ref table with fossology supplied licenses
23  -r {prefix} drop database with name starts with prefix
24  -v enable verbose preview (prints sql that would happen, but does not execute it, DB is not updated)
25  --force-decision force recalculation of SHA256 for decision tables
26  --force-pfile force recalculation of SHA256 for pfile entries
27  --force-encode force recode of copyright and sister tables
28  -h this help usage";
29  print "$usage\n";
30  exit(0);
31 }
32 
33 
43 
44 /* Note: php 5 getopt() ignores options not specified in the function call, so add
45  * dummy options in order to catch invalid options.
46  */
47 $AllPossibleOpts = "abc:d:ef:ghijklmnopqr:stuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
48 $longOpts = [
49  "force-decision",
50  "force-pfile",
51  "force-encode"
52 ];
53 
54 /* defaults */
55 $Verbose = false;
56 $DatabaseName = "fossology";
57 $UpdateLiceneseRef = false;
58 $sysconfdir = '';
59 $delDbPattern = 'the option -rfosstest will drop data bases with datname like "fosstest%"';
60 $forceDecision = false;
61 $forcePfile = false;
62 
63 /* command-line options */
64 $Options = getopt($AllPossibleOpts, $longOpts);
65 foreach($Options as $optKey => $optVal)
66 {
67  switch($optKey)
68  {
69  case 'c': /* set SYSCONFIDR */
70  $sysconfdir = $optVal;
71  break;
72  case 'd': /* optional database name */
73  $DatabaseName = $optVal;
74  break;
75  case 'f': /* schema file */
76  $SchemaFilePath = $optVal;
77  break;
78  case 'h': /* help */
79  explainUsage();
80  case 'l': /* update the license_ref table */
81  $UpdateLiceneseRef = true;
82  break;
83  case 'v': /* verbose */
84  $Verbose = true;
85  break;
86  case 'r':
87  $delDbPattern = $optVal ? "$optVal%" : "fosstest%";
88  break;
89  case "force-decision":
90  $forceDecision = true;
91  break;
92  case "force-pfile":
93  $forcePfile = true;
94  break;
95  case "force-encode":
96  putenv('FOSSENCODING=1');
97  break;
98  default:
99  echo "Invalid Option \"$optKey\".\n";
100  explainUsage();
101  }
102 }
103 
104 require_once 'fossinit-common.php';
105 
106 /* Set SYSCONFDIR and set global (for backward compatibility) */
107 $SysConf = bootstrap($sysconfdir);
108 $SysConf["DBCONF"]["dbname"] = $DatabaseName;
109 $GLOBALS["SysConf"] = array_merge($GLOBALS["SysConf"], $SysConf);
110 $projectGroup = $SysConf['DIRECTORIES']['PROJECTGROUP'] ?: 'fossy';
111 $gInfo = posix_getgrnam($projectGroup);
112 posix_setgid($gInfo['gid']);
113 $groups = `groups`;
114 if (!preg_match("/\s$projectGroup\s/",$groups) && (posix_getgid() != $gInfo['gid']))
115 {
116  print "FATAL: You must be in group '$projectGroup'.\n";
117  exit(1);
118 }
119 
120 require_once("$MODDIR/vendor/autoload.php");
121 require_once("$MODDIR/lib/php/common-db.php");
122 require_once("$MODDIR/lib/php/common-container.php");
123 require_once("$MODDIR/lib/php/common-cache.php");
124 require_once("$MODDIR/lib/php/common-sysconfig.php");
125 require_once("$MODDIR/lib/php/fossdash-config.php");
126 
127 /* Initialize global system configuration variables $SysConfig[] */
128 $GLOBALS["PG_CONN"] = get_pg_conn($SYSCONFDIR, $SysConf);
129 
130 /* Initialize fossdash configuration variables */
131 FossdashConfigInit($SYSCONFDIR, $SysConf);
132 
140 if (empty($SchemaFilePath)) {
141  $SchemaFilePath = "$MODDIR/www/ui/core-schema.dat";
142 }
143 
144 if (!file_exists($SchemaFilePath))
145 {
146  print "FAILED: Schema data file ($SchemaFilePath) not found.\n";
147  exit(1);
148 }
149 
150 require_once("$MODDIR/lib/php/libschema.php");
151 $pgDriver = new Postgres($PG_CONN);
152 $libschema->setDriver($pgDriver);
153 $previousSchema = $libschema->getCurrSchema();
154 $isUpdating = array_key_exists('TABLE', $previousSchema) && array_key_exists('users', $previousSchema['TABLE']);
156 if ($dbManager->existsTable('sysconfig'))
157 {
158  $sysconfig = $dbManager->createMap('sysconfig', 'variablename', 'conf_value');
159  if(!array_key_exists('Release', $sysconfig))
160  {
161  $sysconfig['Release'] = 0;
162  }
163  print "Old release was $sysconfig[Release]\n";
164 }
165 
166 $migrateColumns = array('clearing_decision'=>array('reportinfo','clearing_pk','type_fk','comment'),
167  'license_ref_bulk'=>array('rf_fk','removing'));
168 if($isUpdating && !empty($sysconfig) && $sysconfig['Release'] == '2.6.3.1')
169 {
170  $dbManager->queryOnce('begin;
171  CREATE TABLE uploadtree_b AS (SELECT * FROM uploadtree_a);
172  DROP TABLE uploadtree_a;
173  CREATE TABLE uploadtree_a () INHERITS (uploadtree);
174  ALTER TABLE uploadtree_a ADD CONSTRAINT uploadtree_a_pkey PRIMARY KEY (uploadtree_pk);
175  INSERT INTO uploadtree_a SELECT * FROM uploadtree_b;
176  DROP TABLE uploadtree_b;
177  COMMIT;',__FILE__.'.rebuild.uploadtree_a');
178 }
179 
180 if($dbManager->existsTable("author"))
181 {
182  require_once("$LIBEXECDIR/resequence_author_table.php"); // If table exists, clean up for Schema
183 }
184 
185 // Migration script to clear tables for new constraints
186 require_once("$LIBEXECDIR/dbmigrate_3.3-3.4.php");
187 Migrate_33_34($dbManager, $Verbose);
188 
189 $FailMsg = $libschema->applySchema($SchemaFilePath, $Verbose, $DatabaseName, $migrateColumns);
190 if ($FailMsg)
191 {
192  print "ApplySchema failed: $FailMsg\n";
193  exit(1);
194 }
195 
196 // Populate sysconfig table
199 
200 $Filename = "$MODDIR/www/ui/init.ui";
201 $flagRemoved = !file_exists($Filename);
202 if (!$flagRemoved)
203 {
204  if ($Verbose)
205  {
206  print "Removing flag '$Filename'\n";
207  }
208  if (is_writable("$MODDIR/www/ui/"))
209  {
210  $flagRemoved = unlink($Filename);
211  }
212 }
213 if (!$flagRemoved)
214 {
215  print "Failed to remove $Filename\n";
216  print "Remove this file to complete the initialization.\n";
217 }
218 else
219 {
220  print "Database schema update completed successfully.\n";
221 }
222 
223 $FAILED_LICENSE_IMPORT = array();
224 
225 if (array_key_exists('r', $Options))
226 {
227  $dbManager->prepare(__METHOD__.".getDelDbNames",'SELECT datname FROM pg_database WHERE datistemplate = false and datname like $1');
228  $resDelDbNames = $dbManager->execute(__METHOD__.".getDelDbNames",array($delDbPattern));
229  $delDbNames=pg_fetch_all($resDelDbNames);
230  pg_free_result($resDelDbNames);
231  foreach ($delDbNames as $deleteDatabaseName)
232  {
233  $dbManager->queryOnce("DROP DATABASE $deleteDatabaseName[datname]");
234  }
235  if ($Verbose)
236  {
237  echo "dropped " . count($delDbNames) . " databases ";
238  }
239 }
240 
241 /* migration */
242 $currSchema = $libschema->getCurrSchema();
243 $sysconfig = $dbManager->createMap('sysconfig','variablename','conf_value');
244 global $LIBEXECDIR;
245 if($isUpdating && empty($sysconfig['Release'])) {
246  require_once("$LIBEXECDIR/dbmigrate_2.0-2.1.php"); // this is needed for all new installs from 2.0 on
247  Migrate_20_21($Verbose);
248  require_once("$LIBEXECDIR/dbmigrate_2.1-2.2.php");
249  print "Migrate data from 2.1 to 2.2 in $LIBEXECDIR\n";
250  Migrate_21_22($Verbose);
251  if($dbManager->existsTable('license_file_audit') && array_key_exists('clearing_pk', $currSchema['TABLE']['clearing_decision']))
252  {
253  require_once("$LIBEXECDIR/dbmigrate_2.5-2.6.php");
254  migrate_25_26($Verbose);
255  }
256  if(!array_key_exists('clearing_pk', $currSchema['TABLE']['clearing_decision']) && $isUpdating)
257  {
258  $timeoutSec = 20;
259  echo "Missing column clearing_decision.clearing_pk, you should update to version 2.6.2 before migration\n";
260  echo "Enter 'i' within $timeoutSec seconds to ignore this warning and run the risk of losing clearing decisions: ";
261  $handle = fopen ("php://stdin","r");
262  stream_set_blocking($handle,0);
263  for($s=0;$s<$timeoutSec;$s++)
264  {
265  sleep(1);
266  $line = fread($handle,1);
267  if ($line) {
268  break;
269  }
270  }
271  if(trim($line) != 'i')
272  {
273  echo "ABORTING!\n";
274  exit(26);
275  }
276  }
277  $sysconfig['Release'] = '2.6';
278 }
279 if (! $isUpdating) {
280  require_once ("$LIBEXECDIR/dbmigrate_2.1-2.2.php");
281  print "Creating default user\n";
282  Migrate_21_22($Verbose);
283 } else {
284  require_once ("$LIBEXECDIR/dbmigrate_3.5-3.6.php");
285  migrate_35_36($dbManager, $forceDecision);
286  updatePfileSha256($dbManager, $forcePfile);
287 }
288 
289 $release = array_key_exists('Release', $sysconfig) ? $sysconfig['Release'] : 0;
290 if (version_compare($release, '4.3.0', '<')) {
291  require_once("$LIBEXECDIR/dbmigrate_4.2-4.3.php");
292  Migrate_42_43($Verbose);
293 }
294 
295 require_once("$LIBEXECDIR/dbmigrate_cmu-mach.php");
296 Migrate_Cmu_Mach($dbManager, $Verbose);
297 
298 /* initialize the license_ref table */
299 if ($UpdateLiceneseRef)
300 {
301  if (version_compare($release, '4.8.0', '<')) {
302  /* Normalize legacy all-caps values before per-license update runs. */
303  $dbManager->queryOnce(
304  "UPDATE license_ref SET rf_licensetype='Unknown'
305  WHERE rf_licensetype IN ('UNKNOWN', 'PERMISSIVE')",
306  'migrate.rf_licensetype.case');
307  }
308  $row = $dbManager->getSingleRow("SELECT count(*) FROM license_ref",array(),'license_ref.count');
309  if ($row['count'] > 0) {
310  print "Update reference licenses\n";
311  initLicenseRefTable(false);
312  }
313  else if ($row['count'] == 0) {
314  insertInToLicenseRefTableUsingJson('license_ref');
315 
316  $row_max = $dbManager->getSingleRow("SELECT max(rf_pk) from license_ref",array(),'license_ref.max.rf_pk');
317  $current_license_ref_rf_pk_seq = $row_max['max'];
318  $dbManager->getSingleRow("SELECT setval('license_ref_rf_pk_seq', $current_license_ref_rf_pk_seq)",array(),
319  'set next license_ref_rf_pk_seq value');
320 
321  print "fresh install, import licenseRef.json \n";
322  }
323 }
324 
325 if(!$isUpdating || $sysconfig['Release'] == '2.6')
326 {
327  if(!$dbManager->existsTable('license_candidate'))
328  {
329  $dbManager->queryOnce("CREATE TABLE license_candidate (group_fk integer) INHERITS (license_ref)");
330  }
331  if ($isUpdating && array_key_exists('clearing_pk', $currSchema['TABLE']['clearing_decision']))
332  {
333  require_once("$LIBEXECDIR/dbmigrate_clearing-event.php");
334  $libschema->dropColumnsFromTable(array('reportinfo','clearing_pk','type_fk','comment'), 'clearing_decision');
335  }
336  $sysconfig['Release'] = '2.6.3';
337 }
338 
339 if($sysconfig['Release'] == '2.6.3')
340 {
341  require_once("$LIBEXECDIR/dbmigrate_real-parent.php");
342 }
343 
344 $expiredDbReleases = array('2.6.3', '2.6.3.1', '2.6.3.2');
345 if($isUpdating && (empty($sysconfig['Release']) || in_array($sysconfig['Release'], $expiredDbReleases)))
346 {
347  require_once("$LIBEXECDIR/fo_mapping_license.php");
348  print "Rename license (using $LIBEXECDIR) for SPDX validity\n";
350 }
351 
352 $expiredDbReleases[] = '2.6.3.3';
353 $expiredDbReleases[] = '3.0.0';
354 if($isUpdating && (empty($sysconfig['Release']) || in_array($sysconfig['Release'], $expiredDbReleases)))
355 {
356  require_once("$LIBEXECDIR/dbmigrate_bulk_license.php");
357 }
358 
359 if(in_array($sysconfig['Release'], $expiredDbReleases))
360 {
361  $sysconfig['Release'] = '3.0.1';
362 }
363 
364 // Update '3dfx' licence shortname to 'Glide'. Since shortname is used as an
365 // identifier, this is not done as part of the licenseref updates.
366 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == '3.0.1'))
367 {
368  $dbManager->begin();
369  $row = $dbManager->getSingleRow("
370  SELECT rf1.rf_pk AS id_3dfx,
371  rf2.rf_pk AS id_glide
372  FROM license_ref rf1
373  INNER JOIN license_ref rf2 USING (rf_fullname)
374  WHERE rf1.rf_shortname='3DFX'
375  AND rf2.rf_shortname='Glide'
376  LIMIT 1", array(), 'old.3dfx.rf_pk');
377  if (!empty($row))
378  {
379  $id_3dfx = intval($row['id_3dfx']);
380  $id_glide = intval($row['id_glide']);
381  $dbManager->queryOnce("DELETE FROM license_ref WHERE rf_pk=$id_glide");
382  $dbManager->queryOnce("UPDATE license_ref SET rf_shortname='Glide' WHERE rf_pk=$id_3dfx");
383  }
384  $dbManager->commit();
385 
386  $sysconfig['Release'] = "3.0.2";
387 }
388 
389 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == '3.0.2'))
390 {
391  require_once("$LIBEXECDIR/dbmigrate_multiple_copyright_decisions.php");
392 
393  $sysconfig['Release'] = "3.1.0";
394 }
395 
396 // fix release-version datamodel-version missmatch
397 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == "3.1.0")) {
398  $sysconfig['Release'] = "3.3.0";
399 }
400 
401 // Handle idempotency of this script by checking if the Release variable is set
402 $new_version = $SysConf["BUILD"]["VERSION"] ?? '';
403 if ($new_version !==''){
404  $dbManager->begin();
405  $dbManager->getSingleRow("DELETE FROM sysconfig WHERE variablename=$1",array('Release'),'drop.sysconfig.release');
406  $dbManager->insertTableRow('sysconfig',
407  array('variablename'=>'Release','conf_value'=>$SysConf["BUILD"]["VERSION"],
408  'ui_label'=>'Release','vartype'=>2,'group_name'=>'Release','description'=>'')
409  );
410  $dbManager->commit();
411 }
412 
413 /* email/url/author data migration to other table */
414 require_once("$LIBEXECDIR/dbmigrate_copyright-author.php");
415 
416 // Migration script to move candidate licenses in obligations
417 require_once("$LIBEXECDIR/dbmigrate_3.6-3.7.php");
418 Migrate_36_37($dbManager, $Verbose);
419 
420 /* instance uuid */
421 require_once("$LIBEXECDIR/instance_uuid.php");
422 
423 // Migration script for 3.7 => 3.8
424 require_once("$LIBEXECDIR/dbmigrate_3.7-3.8.php");
425 Migrate_37_38($dbManager, $MODDIR);
426 
427 // Migration script for 4.0 => 4.1
428 require_once("$LIBEXECDIR/dbmigrate_4.0-4.1.php");
429 Migrate_40_41($dbManager);
430 
431 // Migration script for copyright_event table
432 require_once("$LIBEXECDIR/dbmigrate_copyright-event.php");
434 
435 /* sanity check */
436 require_once ("$LIBEXECDIR/sanity_check.php");
437 $checker = new SanityChecker($dbManager,$Verbose);
438 $errors = $checker->check();
439 
440 require_once("$LIBEXECDIR/dbmigrate_licensedb_compatibility.php");
442 
443 if($errors>0)
444 {
445  echo "ERROR: $errors sanity check".($errors>1?'s':'')." failed\n";
446 }
447 if (! empty($FAILED_LICENSE_IMPORT)) {
448  $failedInsert = array_filter($FAILED_LICENSE_IMPORT,
449  function ($x){
450  return $x[1] == "INSERT";
451  });
452  $failedUpdate = array_filter($FAILED_LICENSE_IMPORT,
453  function ($x){
454  return $x[1] == "UPDATE";
455  });
456  $failedPromote = array_filter($FAILED_LICENSE_IMPORT,
457  function ($x){
458  return $x[1] == "CANPROMOTE";
459  });
460  if (! empty($failedInsert)) {
461  echo "*** Failed to insert following licenses ***\n";
462  echo implode(",", array_map(function ($x) {
463  return $x[0];
464  }, $failedInsert)) . "\n";
465  }
466  if (! empty($failedUpdate)) {
467  echo "*** Failed to update following licenses ***\n";
468  echo implode(",", array_map(function ($x) {
469  return $x[0];
470  }, $failedUpdate)) . "\n";
471  }
472  if (! empty($failedPromote)) {
473  echo "*** Failed to move following licenses from candidate table ***\n";
474  echo implode(",", array_map(function ($x) {
475  return $x[0];
476  }, $failedPromote)) . "\n";
477  }
478 }
480 exit($errors);
481 
484 {
485  global $dbManager;
486 
487  $rows = $dbManager->getRows(
488  "SELECT DISTINCT rf_licensetype FROM license_ref
489  WHERE rf_licensetype IS NOT NULL AND rf_licensetype <> ''
490  ORDER BY rf_licensetype",
491  array(), 'updateLicenseTypesConfig.fetchTypes');
492 
493  if (empty($rows)) {
494  return;
495  }
496  $dbTypes = array();
497  foreach ($rows as $row) {
498  $dbTypes[$row['rf_licensetype']] = true;
499  }
500 
501  $confRow = $dbManager->getSingleRow(
502  "SELECT conf_value FROM sysconfig WHERE variablename=$1",
503  array('LicenseTypes'), 'updateLicenseTypesConfig.fetchConf');
504 
505  if ($confRow === false || $confRow === null) {
506  return;
507  }
508 
509  $existingTypes = array();
510  $existingTypesLower = array();
511  if (!empty($confRow['conf_value'])) {
512  foreach (explode(',', $confRow['conf_value']) as $t) {
513  $trimmed = trim($t);
514  if ($trimmed !== '') {
515  $existingTypes[$trimmed] = true;
516  $existingTypesLower[strtolower($trimmed)] = true;
517  }
518  }
519  }
520 
521  $newTypes = array();
522  foreach ($dbTypes as $type => $_) {
523  if (!isset($existingTypesLower[strtolower($type)])) {
524  $newTypes[] = $type;
525  }
526  }
527  if (empty($newTypes)) {
528  return;
529  }
530 
531  $merged = array_merge(array_keys($existingTypes), $newTypes);
532  $newValue = implode(', ', $merged);
533 
534  $dbManager->getRows(
535  "UPDATE sysconfig SET conf_value=$1 WHERE variablename=$2",
536  array($newValue, 'LicenseTypes'), 'updateLicenseTypesConfig.update');
537 
538  print "LicenseTypes updated: $newValue\n";
539 }
540 
547 {
548  global $LIBEXECDIR;
549  global $dbManager;
550 
551  if (!is_dir($LIBEXECDIR)) {
552  print "FATAL: Directory '$LIBEXECDIR' does not exist.\n";
553  return (1);
554  }
555 
556  if (!is_readable($LIBEXECDIR)) {
557  print "FATAL: Unable to access '$LIBEXECDIR'.\n";
558  return (1);
559  }
560  $dbManager->begin();
561  if ($tableName === 'license_ref_2') {
562  $dbManager->queryOnce("DROP TABLE IF EXISTS license_ref_2",
563  __METHOD__.'.dropAncientBackUp');
564  $dbManager->queryOnce("CREATE TABLE license_ref_2 (LIKE license_ref INCLUDING DEFAULTS)",
565  __METHOD__.'.backUpData');
566  }
568  $keysToBeChanged = array(
569  'rf_OSIapproved' => '"rf_OSIapproved"',
570  'rf_FSFfree'=> '"rf_FSFfree"',
571  'rf_GPLv2compatible' => '"rf_GPLv2compatible"',
572  'rf_GPLv3compatible'=> '"rf_GPLv3compatible"',
573  'rf_Fedora' => '"rf_Fedora"'
574  );
575  $keysToReplicate = [
576  "rf_spdx_id" => "rf_shortname",
577  ];
578  $keysToRemove = [
579  "rf_spdx_compatible"
580  ];
581 
582  $jsonData = json_decode(file_get_contents("$LIBEXECDIR/licenseRef.json"), true);
583  foreach($jsonData as $licenseArray) {
584  foreach ($keysToReplicate as $duplicateKey => $originalKey) {
585  if ($licenseArray['rf_spdx_compatible'] == 't') {
586  $licenseArray[$duplicateKey] = $licenseArray[$originalKey];
587  } else {
588  $licenseArray[$duplicateKey] = "";
589  }
590  }
591  foreach ($keysToRemove as $key) {
592  unset($licenseArray[$key]);
593  }
594  ksort($licenseArray);
595  $arrayKeys = array_keys($licenseArray);
596  $arrayValues = array_values($licenseArray);
597  $keys = strtr(implode(",", $arrayKeys), $keysToBeChanged);
598  $statementName = __METHOD__ . '.insertInTo' . $tableName . '.' . md5($tableName . $keys);
599  $valuePlaceHolders = "$" . join(",$",range(1, count($arrayKeys)));
600  $md5PlaceHolder = "$". (count($arrayKeys) + 1);
601  $arrayValues[] = $licenseArray['rf_text'];
602  $SQL = "INSERT INTO $tableName ( $keys,rf_md5 ) " .
603  "VALUES ($valuePlaceHolders,md5($md5PlaceHolder));";
604  $dbManager->prepare($statementName, $SQL);
605  $dbManager->execute($statementName, $arrayValues);
606  }
607  $dbManager->commit();
608  return (0);
609 }
610 
619 function initLicenseRefTable($Verbose)
620 {
624  global $dbManager;
625 
626  $dbManager->begin();
627  insertInToLicenseRefTableUsingJson('license_ref_2');
628  $dbManager->prepare(__METHOD__.".newLic", "SELECT * FROM license_ref_2");
629  $result_new = $dbManager->execute(__METHOD__.".newLic");
630 
631  $dbManager->prepare(__METHOD__.'.licenseRefByShortname',
632  'SELECT *,md5(rf_text) AS hash FROM license_ref WHERE rf_shortname=$1');
633 
635  while ($row = pg_fetch_assoc($result_new))
636  {
637  $rf_shortname = $row['rf_shortname'];
638  $result_check = $dbManager->execute(__METHOD__.'.licenseRefByShortname', array($rf_shortname));
639  $count = pg_num_rows($result_check);
640 
641  $rf_text = $row['rf_text'];
642  $rf_url = $row['rf_url'];
643  $rf_fullname = $row['rf_fullname'];
644  $rf_notes = $row['rf_notes'];
645  $rf_active = $row['rf_active'];
646  $marydone = $row['marydone'];
647  $rf_text_updatable = $row['rf_text_updatable'];
648  $rf_detector_type = $row['rf_detector_type'];
649  $rf_flag = $row['rf_flag'];
650  $rf_spdx_id = $row['rf_spdx_id'];
651  $rf_licensetype = $row['rf_licensetype'];
652 
653  if ($count) // update when it is existing
654  {
655  $row_check = pg_fetch_assoc($result_check);
656  pg_free_result($result_check);
657  $params = array();
658  $rf_text_check = $row_check['rf_text'];
659  $rf_url_check = $row_check['rf_url'];
660  $rf_fullname_check = $row_check['rf_fullname'];
661  $rf_notes_check = $row_check['rf_notes'];
662  $rf_active_check = $row_check['rf_active'];
663  $marydone_check = $row_check['marydone'];
664  $rf_text_updatable_check = $row_check['rf_text_updatable'];
665  $rf_detector_type_check = $row_check['rf_detector_type'];
666  $rf_flag_check = $row_check['rf_flag'];
667  $rf_spdx_id_check = $row_check['rf_spdx_id'];
668  $rf_licensetype_check = $row_check['rf_licensetype'];
669 
670  $candidateLicense = isLicenseExists($dbManager, $rf_shortname, true);
671  if ($candidateLicense) {
672  mergeCandidateLicense($dbManager, $candidateLicense);
673  }
674 
675  $statement = __METHOD__ . ".updateLicenseRef";
676  $sql = "UPDATE license_ref SET ";
677  if (($rf_flag_check == 1 && $rf_flag == 1) &&
678  ($rf_text_check != $rf_text && !empty($rf_text) &&
679  !(stristr($rf_text, 'License by Nomos')) &&
680  !(stristr($rf_text, 'License by OJO')))) {
681  $params[] = $rf_text;
682  $position = "$" . count($params);
683  $sql .= "rf_text=$position,rf_md5=md5($position),rf_flag=1,";
684  $statement .= ".insertT";
685  }
686  if ($rf_url_check != $rf_url && !empty($rf_url)) {
687  $params[] = $rf_url;
688  $position = "$" . count($params);
689  $sql .= "rf_url=$position,";
690  $statement .= ".url";
691  }
692  if ($rf_fullname_check != $rf_fullname && !empty($rf_fullname)) {
693  $params[] = $rf_fullname;
694  $position = "$" . count($params);
695  $sql .= "rf_fullname=$position,";
696  $statement .= ".name";
697  }
698  if ($rf_notes_check != $rf_notes && !empty($rf_notes)) {
699  $params[] = $rf_notes;
700  $position = "$" . count($params);
701  $sql .= "rf_notes=$position,";
702  $statement .= ".notes";
703  }
704  if ($rf_active_check != $rf_active && !empty($rf_active)) {
705  $params[] = $rf_active;
706  $position = "$" . count($params);
707  $sql .= "rf_active=$position,";
708  $statement .= ".active";
709  }
710  if ($marydone_check != $marydone && !empty($marydone)) {
711  $params[] = $marydone;
712  $position = "$" . count($params);
713  $sql .= "marydone=$position,";
714  $statement .= ".marydone";
715  }
716  if ($rf_text_updatable_check != $rf_text_updatable && !empty($rf_text_updatable)) {
717  $params[] = $rf_text_updatable;
718  $position = "$" . count($params);
719  $sql .= "rf_text_updatable=$position,";
720  $statement .= ".tUpdate";
721  }
722  if ($rf_detector_type_check != $rf_detector_type && !empty($rf_detector_type)) {
723  $params[] = $rf_detector_type;
724  $position = "$" . count($params);
725  $sql .= "rf_detector_type=$position,";
726  $statement .= ".dType";
727  }
728  if (empty($rf_spdx_id_check) && !empty($rf_spdx_id) &&
729  $rf_spdx_id_check != $rf_spdx_id) {
730  $params[] = $rf_spdx_id;
731  $position = "$" . count($params);
732  $sql .= "rf_spdx_id=$position,";
733  $statement .= ".spdxId";
734  }
735  if (!empty($rf_licensetype) && $rf_licensetype_check != $rf_licensetype) {
736  $params[] = $rf_licensetype;
737  $position = "$" . count($params);
738  $sql .= "rf_licensetype=$position,";
739  $statement .= ".licType";
740  }
741  $sql = substr_replace($sql, "", -1);
742 
743  if ($sql != "UPDATE license_ref SET") { // check if we have something to update
744  $params[] = $rf_shortname;
745  $position = "$" . count($params);
746  $sql .= " WHERE rf_shortname=$position;";
747  try {
748  $dbManager->getSingleRow($sql, $params, $statement);
749  } catch (\Exception $e) {
750  global $FAILED_LICENSE_IMPORT;
751  $FAILED_LICENSE_IMPORT[] = array($rf_shortname, "UPDATE");
752  }
753  }
754  } else { // insert when it is new
755  pg_free_result($result_check);
756  $params = array();
757  $params['rf_shortname'] = $rf_shortname;
758  $params['rf_text'] = $rf_text;
759  $params['rf_url'] = $rf_url;
760  $params['rf_fullname'] = $rf_fullname;
761  $params['rf_notes'] = $rf_notes;
762  $params['rf_active'] = $rf_active;
763  $params['rf_text_updatable'] = $rf_text_updatable;
764  $params['rf_detector_type'] = $rf_detector_type;
765  $params['marydone'] = $marydone;
766  $params['rf_spdx_id'] = $rf_spdx_id;
767  $params['rf_licensetype'] = $rf_licensetype;
768  insertNewLicense($dbManager, $params);
769  }
770  }
771  pg_free_result($result_new);
772 
773  $dbManager->queryOnce("DROP TABLE IF EXISTS license_ref_2");
774  $dbManager->commit();
775 
776  return (0);
777 } // initLicenseRefTable()
778 
787 function isLicenseExists($dbManager, $rf_shortname, $isCandidate = true)
788 {
789  $tableName = "license_ref";
790  if ($isCandidate) {
791  $tableName = "license_candidate";
792  }
793  $statement = __METHOD__ . ".$tableName";
794  $sql = "SELECT * FROM ONLY $tableName WHERE rf_shortname = $1;";
795  $licenseRow = $dbManager->getSingleRow($sql, array($rf_shortname),
796  $statement);
797  if (! empty($licenseRow)) {
798  return $licenseRow;
799  } else {
800  return false;
801  }
802 }
803 
811 function mergeCandidateLicense($dbManager, $candidateLicense)
812 {
813  $mainLicense = isLicenseExists($dbManager, $candidateLicense['rf_shortname'],
814  false);
815  $statement = __METHOD__ . ".md5Exists";
816  $sql = "SELECT rf_pk FROM ONLY license_ref WHERE md5(rf_text) = md5($1);";
817  $licenseRow = $dbManager->getSingleRow($sql,
818  array($candidateLicense['rf_text']), $statement);
819  if (! empty($licenseRow)) {
820  $md5Exists = true;
821  } else {
822  $md5Exists = false;
823  }
824  if ($mainLicense !== false && $md5Exists) {
825  $dbManager->begin();
826  $updateStatements = __METHOD__ . ".updateCandidateToMain";
827  $updateCeSql = "UPDATE clearing_event SET rf_fk = $1 WHERE rf_fk = $2;";
828  $updateCeSt = $updateStatements . ".ce";
829  $updateLsbSql = "UPDATE license_set_bulk SET rf_fk = $1 WHERE rf_fk = $2;";
830  $updateLsbSt = $updateStatements . ".lsb";
831  $updateUclSql = "UPDATE upload_clearing_license SET rf_fk = $1 " .
832  "WHERE rf_fk = $2;";
833  $updateUclSt = $updateStatements . ".ucl";
834  $deleteOcmSql = "DELETE FROM obligation_candidate_map WHERE rf_fk = $1;";
835  $deleteOcmSt = $updateStatements . ".ocm";
836 
837  $dbManager->getSingleRow($updateCeSql,
838  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateCeSt);
839  $dbManager->getSingleRow($updateLsbSql,
840  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateLsbSt);
841  $dbManager->getSingleRow($updateUclSql,
842  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateUclSt);
843  $dbManager->getSingleRow($deleteOcmSql, array($candidateLicense['rf_pk']),
844  $deleteOcmSt);
845  $dbManager->commit();
846  } elseif ($mainLicense !== false || $md5Exists) {
847  // Short name exists and MD5 does not match
848  // Or short name does not exists by MD5 match
849  return -1;
850  }
851  $dbManager->begin();
852  $deleteSql = "DELETE FROM license_candidate WHERE rf_pk = $1;";
853  $deleteStatement = __METHOD__ . ".deleteCandidte";
854  $dbManager->prepare($deleteStatement, $deleteSql);
855  $dbManager->execute($deleteStatement, array($candidateLicense['rf_pk']));
856  if ($mainLicense === false && $md5Exists === false) {
857  // License does not exists
858  insertNewLicense($dbManager, $candidateLicense, true);
859  }
860  $dbManager->commit();
861 }
862 
872 function insertNewLicense($dbManager, $license, $wasCandidate = false)
873 {
874  $insertStatement = __METHOD__ . ".insertNewLicense";
875  $sql = "INSERT INTO license_ref (";
876  if ($wasCandidate) {
877  $sql .= "rf_pk, ";
878  $insertStatement .= ".wasCandidate";
879  }
880  $sql .= "rf_shortname, rf_text, rf_url, rf_fullname, rf_notes, rf_active, " .
881  "rf_text_updatable, rf_detector_type, marydone, rf_spdx_id, rf_licensetype, " .
882  "rf_md5, rf_add_date) VALUES (";
883  $params = array();
884  if ($wasCandidate) {
885  $params[] = $license['rf_pk'];
886  }
887  $params[] = $license['rf_shortname'];
888  $params[] = $license['rf_text'];
889  $params[] = $license['rf_url'];
890  $params[] = $license['rf_fullname'];
891  $params[] = $license['rf_notes'];
892  $params[] = $license['rf_active'];
893  $params[] = $license['rf_text_updatable'];
894  $params[] = $license['rf_detector_type'];
895  $params[] = $license['marydone'];
896  $params[] = $license['rf_spdx_id'];
897  $params[] = !empty($license['rf_licensetype']) ? $license['rf_licensetype'] : 'Unknown';
898 
899  for ($i = 1; $i <= count($params); $i++) {
900  $sql .= "$" . $i . ",";
901  }
902 
903  $params[] = $license['rf_text'];
904  $textPos = "$" . count($params);
905 
906  $sql .= "md5($textPos),now())";
907  $rfPk = -1;
908  try {
909  $rfPk = $dbManager->insertPreparedAndReturn($insertStatement, $sql, $params,
910  "rf_pk");
911  } catch (\Exception $e) {
912  global $FAILED_LICENSE_IMPORT;
913  $type = "INSERT";
914  if ($wasCandidate) {
915  $type = "CANPROMOTE";
916  }
917  $FAILED_LICENSE_IMPORT[] = array($license['rf_shortname'], $type);
918  }
919  return $rfPk;
920 }
Populate_sysconfig()
Populate the sysconfig table with core variables.
get_pg_conn($sysconfdir, &$SysConf, $exitOnDbFail=true)
populate_from_sysconfig($conn, &$SysConf)
Migrate_20_21($DryRun)
Migrate to the uploadtree_a table.
Migrate_21_22($Verbose)
Create new groups, group_user_member, perm_upload and perm_folder records to support 2....
migrate_25_26($verbose)
Migrate_33_34($dbManager, $dryRun)
migrate_35_36($dbManager, $force=false)
Migrate_36_37($dbManager, $verbose)
Migrate_37_38($dbManager, $MODDIR)
Migrate_40_41($dbManager)
Migrate_42_43(bool $verbose)
Migrate_Cmu_Mach(DbManager $dbManager, $verbose=false)
if(!function_exists('resolve_config_value')) $Options
Definition: fo_dbcheck.php:51
renameLicensesForSpdxValidation($verbose)
Create map of old_shortname to new_shortname for SPDX and call renameLicenses.
char * trim(char *ptext)
Trimming whitespace.
Definition: fossconfig.c:690
FossdashConfigInit($sysconfdir, &$SysConf)
Initialize the fossdash configuration after bootstrap().
insertInToLicenseRefTableUsingJson($tableName)
insert into license_ref table using json file.
Definition: fossinit.php:546
mergeCandidateLicense($dbManager, $candidateLicense)
Definition: fossinit.php:811
isLicenseExists($dbManager, $rf_shortname, $isCandidate=true)
Definition: fossinit.php:787
updateLicenseTypesConfig()
Append new rf_licensetype values found in license_ref to the LicenseTypes sysconfig entry.
Definition: fossinit.php:483
insertNewLicense($dbManager, $license, $wasCandidate=false)
Definition: fossinit.php:872
explainUsage()
Print Usage statement.
Definition: fossinit.php:13
foreach($Options as $Option=> $OptVal) if(0==$reference_flag &&0==$nomos_flag) $PG_CONN
bootstrap($sysconfdir="")
Bootstrap the fossology php library.
Definition: migratetest.php:82