FOSSology  4.4.0
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 /* initialize the license_ref table */
296 if ($UpdateLiceneseRef)
297 {
298  $row = $dbManager->getSingleRow("SELECT count(*) FROM license_ref",array(),'license_ref.count');
299  if ($row['count'] > 0) {
300  print "Update reference licenses\n";
301  initLicenseRefTable(false);
302  }
303  else if ($row['count'] == 0) {
304  insertInToLicenseRefTableUsingJson('license_ref');
305 
306  $row_max = $dbManager->getSingleRow("SELECT max(rf_pk) from license_ref",array(),'license_ref.max.rf_pk');
307  $current_license_ref_rf_pk_seq = $row_max['max'];
308  $dbManager->getSingleRow("SELECT setval('license_ref_rf_pk_seq', $current_license_ref_rf_pk_seq)",array(),
309  'set next license_ref_rf_pk_seq value');
310 
311  print "fresh install, import licenseRef.json \n";
312  }
313 }
314 
315 if(!$isUpdating || $sysconfig['Release'] == '2.6')
316 {
317  if(!$dbManager->existsTable('license_candidate'))
318  {
319  $dbManager->queryOnce("CREATE TABLE license_candidate (group_fk integer) INHERITS (license_ref)");
320  }
321  if ($isUpdating && array_key_exists('clearing_pk', $currSchema['TABLE']['clearing_decision']))
322  {
323  require_once("$LIBEXECDIR/dbmigrate_clearing-event.php");
324  $libschema->dropColumnsFromTable(array('reportinfo','clearing_pk','type_fk','comment'), 'clearing_decision');
325  }
326  $sysconfig['Release'] = '2.6.3';
327 }
328 
329 if($sysconfig['Release'] == '2.6.3')
330 {
331  require_once("$LIBEXECDIR/dbmigrate_real-parent.php");
332 }
333 
334 $expiredDbReleases = array('2.6.3', '2.6.3.1', '2.6.3.2');
335 if($isUpdating && (empty($sysconfig['Release']) || in_array($sysconfig['Release'], $expiredDbReleases)))
336 {
337  require_once("$LIBEXECDIR/fo_mapping_license.php");
338  print "Rename license (using $LIBEXECDIR) for SPDX validity\n";
340 }
341 
342 $expiredDbReleases[] = '2.6.3.3';
343 $expiredDbReleases[] = '3.0.0';
344 if($isUpdating && (empty($sysconfig['Release']) || in_array($sysconfig['Release'], $expiredDbReleases)))
345 {
346  require_once("$LIBEXECDIR/dbmigrate_bulk_license.php");
347 }
348 
349 if(in_array($sysconfig['Release'], $expiredDbReleases))
350 {
351  $sysconfig['Release'] = '3.0.1';
352 }
353 
354 // Update '3dfx' licence shortname to 'Glide'. Since shortname is used as an
355 // identifier, this is not done as part of the licenseref updates.
356 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == '3.0.1'))
357 {
358  $dbManager->begin();
359  $row = $dbManager->getSingleRow("
360  SELECT rf1.rf_pk AS id_3dfx,
361  rf2.rf_pk AS id_glide
362  FROM license_ref rf1
363  INNER JOIN license_ref rf2 USING (rf_fullname)
364  WHERE rf1.rf_shortname='3DFX'
365  AND rf2.rf_shortname='Glide'
366  LIMIT 1", array(), 'old.3dfx.rf_pk');
367  if (!empty($row))
368  {
369  $id_3dfx = intval($row['id_3dfx']);
370  $id_glide = intval($row['id_glide']);
371  $dbManager->queryOnce("DELETE FROM license_ref WHERE rf_pk=$id_glide");
372  $dbManager->queryOnce("UPDATE license_ref SET rf_shortname='Glide' WHERE rf_pk=$id_3dfx");
373  }
374  $dbManager->commit();
375 
376  $sysconfig['Release'] = "3.0.2";
377 }
378 
379 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == '3.0.2'))
380 {
381  require_once("$LIBEXECDIR/dbmigrate_multiple_copyright_decisions.php");
382 
383  $sysconfig['Release'] = "3.1.0";
384 }
385 
386 // fix release-version datamodel-version missmatch
387 if($isUpdating && (empty($sysconfig['Release']) || $sysconfig['Release'] == "3.1.0")) {
388  $sysconfig['Release'] = "3.3.0";
389 }
390 
391 $dbManager->begin();
392 $dbManager->getSingleRow("DELETE FROM sysconfig WHERE variablename=$1",array('Release'),'drop.sysconfig.release');
393 $dbManager->insertTableRow('sysconfig',
394  array('variablename'=>'Release','conf_value'=>$SysConf["BUILD"]["VERSION"],
395  'ui_label'=>'Release','vartype'=>2,'group_name'=>'Release','description'=>'')
396 );
397 $dbManager->commit();
398 /* email/url/author data migration to other table */
399 require_once("$LIBEXECDIR/dbmigrate_copyright-author.php");
400 
401 // Migration script to move candidate licenses in obligations
402 require_once("$LIBEXECDIR/dbmigrate_3.6-3.7.php");
403 Migrate_36_37($dbManager, $Verbose);
404 
405 /* instance uuid */
406 require_once("$LIBEXECDIR/instance_uuid.php");
407 
408 // Migration script for 3.7 => 3.8
409 require_once("$LIBEXECDIR/dbmigrate_3.7-3.8.php");
410 Migrate_37_38($dbManager, $MODDIR);
411 
412 // Migration script for 4.0 => 4.1
413 require_once("$LIBEXECDIR/dbmigrate_4.0-4.1.php");
414 Migrate_40_41($dbManager);
415 
416 // Migration script for copyright_event table
417 require_once("$LIBEXECDIR/dbmigrate_copyright-event.php");
419 
420 /* sanity check */
421 require_once ("$LIBEXECDIR/sanity_check.php");
422 $checker = new SanityChecker($dbManager,$Verbose);
423 $errors = $checker->check();
424 
425 if($errors>0)
426 {
427  echo "ERROR: $errors sanity check".($errors>1?'s':'')." failed\n";
428 }
429 if (! empty($FAILED_LICENSE_IMPORT)) {
430  $failedInsert = array_filter($FAILED_LICENSE_IMPORT,
431  function ($x){
432  return $x[1] == "INSERT";
433  });
434  $failedUpdate = array_filter($FAILED_LICENSE_IMPORT,
435  function ($x){
436  return $x[1] == "UPDATE";
437  });
438  $failedPromote = array_filter($FAILED_LICENSE_IMPORT,
439  function ($x){
440  return $x[1] == "CANPROMOTE";
441  });
442  if (! empty($failedInsert)) {
443  echo "*** Failed to insert following licenses ***\n";
444  echo implode(",", array_map(function ($x) {
445  return $x[0];
446  }, $failedInsert)) . "\n";
447  }
448  if (! empty($failedUpdate)) {
449  echo "*** Failed to update following licenses ***\n";
450  echo implode(",", array_map(function ($x) {
451  return $x[0];
452  }, $failedUpdate)) . "\n";
453  }
454  if (! empty($failedPromote)) {
455  echo "*** Failed to move following licenses from candidate table ***\n";
456  echo implode(",", array_map(function ($x) {
457  return $x[0];
458  }, $failedPromote)) . "\n";
459  }
460 }
461 exit($errors);
462 
469 {
470  global $LIBEXECDIR;
471  global $dbManager;
472 
473  if (!is_dir($LIBEXECDIR)) {
474  print "FATAL: Directory '$LIBEXECDIR' does not exist.\n";
475  return (1);
476  }
477 
478  $dir = opendir($LIBEXECDIR);
479  if (!$dir) {
480  print "FATAL: Unable to access '$LIBEXECDIR'.\n";
481  return (1);
482  }
483  $dbManager->begin();
484  if ($tableName === 'license_ref_2') {
485  $dbManager->queryOnce("DROP TABLE IF EXISTS license_ref_2",
486  __METHOD__.'.dropAncientBackUp');
487  $dbManager->queryOnce("CREATE TABLE license_ref_2 (LIKE license_ref INCLUDING DEFAULTS)",
488  __METHOD__.'.backUpData');
489  }
491  $keysToBeChanged = array(
492  'rf_OSIapproved' => '"rf_OSIapproved"',
493  'rf_FSFfree'=> '"rf_FSFfree"',
494  'rf_GPLv2compatible' => '"rf_GPLv2compatible"',
495  'rf_GPLv3compatible'=> '"rf_GPLv3compatible"',
496  'rf_Fedora' => '"rf_Fedora"'
497  );
498  $keysToReplicate = [
499  "rf_spdx_id" => "rf_shortname",
500  ];
501  $keysToRemove = [
502  "rf_spdx_compatible"
503  ];
504 
505  $jsonData = json_decode(file_get_contents("$LIBEXECDIR/licenseRef.json"), true);
506  $statementName = __METHOD__.'.insertInTo'.$tableName;
507  foreach($jsonData as $licenseArray) {
508  foreach ($keysToReplicate as $duplicateKey => $originalKey) {
509  if ($licenseArray['rf_spdx_compatible'] == 't') {
510  $licenseArray[$duplicateKey] = $licenseArray[$originalKey];
511  } else {
512  $licenseArray[$duplicateKey] = "";
513  }
514  }
515  foreach ($keysToRemove as $key) {
516  unset($licenseArray[$key]);
517  }
518  ksort($licenseArray);
519  $arrayKeys = array_keys($licenseArray);
520  $arrayValues = array_values($licenseArray);
521  $keys = strtr(implode(",", $arrayKeys), $keysToBeChanged);
522  $valuePlaceHolders = "$" . join(",$",range(1, count($arrayKeys)));
523  $md5PlaceHolder = "$". (count($arrayKeys) + 1);
524  $arrayValues[] = $licenseArray['rf_text'];
525  $SQL = "INSERT INTO $tableName ( $keys,rf_md5 ) " .
526  "VALUES ($valuePlaceHolders,md5($md5PlaceHolder));";
527  $dbManager->prepare($statementName, $SQL);
528  $dbManager->execute($statementName, $arrayValues);
529  }
530  $dbManager->commit();
531  return (0);
532 }
533 
542 function initLicenseRefTable($Verbose)
543 {
547  global $dbManager;
548 
549  $dbManager->begin();
550  insertInToLicenseRefTableUsingJson('license_ref_2');
551  $dbManager->prepare(__METHOD__.".newLic", "SELECT * FROM license_ref_2");
552  $result_new = $dbManager->execute(__METHOD__.".newLic");
553 
554  $dbManager->prepare(__METHOD__.'.licenseRefByShortname',
555  'SELECT *,md5(rf_text) AS hash FROM license_ref WHERE rf_shortname=$1');
556 
558  while ($row = pg_fetch_assoc($result_new))
559  {
560  $rf_shortname = $row['rf_shortname'];
561  $result_check = $dbManager->execute(__METHOD__.'.licenseRefByShortname', array($rf_shortname));
562  $count = pg_num_rows($result_check);
563 
564  $rf_text = $row['rf_text'];
565  $rf_url = $row['rf_url'];
566  $rf_fullname = $row['rf_fullname'];
567  $rf_notes = $row['rf_notes'];
568  $rf_active = $row['rf_active'];
569  $marydone = $row['marydone'];
570  $rf_text_updatable = $row['rf_text_updatable'];
571  $rf_detector_type = $row['rf_detector_type'];
572  $rf_flag = $row['rf_flag'];
573  $rf_spdx_id = $row['rf_spdx_id'];
574 
575  if ($count) // update when it is existing
576  {
577  $row_check = pg_fetch_assoc($result_check);
578  pg_free_result($result_check);
579  $params = array();
580  $rf_text_check = $row_check['rf_text'];
581  $rf_url_check = $row_check['rf_url'];
582  $rf_fullname_check = $row_check['rf_fullname'];
583  $rf_notes_check = $row_check['rf_notes'];
584  $rf_active_check = $row_check['rf_active'];
585  $marydone_check = $row_check['marydone'];
586  $rf_text_updatable_check = $row_check['rf_text_updatable'];
587  $rf_detector_type_check = $row_check['rf_detector_type'];
588  $rf_flag_check = $row_check['rf_flag'];
589  $rf_spdx_id_check = $row_check['rf_spdx_id'];
590 
591  $candidateLicense = isLicenseExists($dbManager, $rf_shortname, true);
592  if ($candidateLicense) {
593  mergeCandidateLicense($dbManager, $candidateLicense);
594  }
595 
596  $statement = __METHOD__ . ".updateLicenseRef";
597  $sql = "UPDATE license_ref SET ";
598  if (($rf_flag_check == 1 && $rf_flag == 1) &&
599  ($rf_text_check != $rf_text && !empty($rf_text) &&
600  !(stristr($rf_text, 'License by Nomos')))) {
601  $params[] = $rf_text;
602  $position = "$" . count($params);
603  $sql .= "rf_text=$position,rf_md5=md5($position),rf_flag=1,";
604  $statement .= ".insertT";
605  }
606  if ($rf_url_check != $rf_url && !empty($rf_url)) {
607  $params[] = $rf_url;
608  $position = "$" . count($params);
609  $sql .= "rf_url=$position,";
610  $statement .= ".url";
611  }
612  if ($rf_fullname_check != $rf_fullname && !empty($rf_fullname)) {
613  $params[] = $rf_fullname;
614  $position = "$" . count($params);
615  $sql .= "rf_fullname=$position,";
616  $statement .= ".name";
617  }
618  if ($rf_notes_check != $rf_notes && !empty($rf_notes)) {
619  $params[] = $rf_notes;
620  $position = "$" . count($params);
621  $sql .= "rf_notes=$position,";
622  $statement .= ".notes";
623  }
624  if ($rf_active_check != $rf_active && !empty($rf_active)) {
625  $params[] = $rf_active;
626  $position = "$" . count($params);
627  $sql .= "rf_active=$position,";
628  $statement .= ".active";
629  }
630  if ($marydone_check != $marydone && !empty($marydone)) {
631  $params[] = $marydone;
632  $position = "$" . count($params);
633  $sql .= "marydone=$position,";
634  $statement .= ".marydone";
635  }
636  if ($rf_text_updatable_check != $rf_text_updatable && !empty($rf_text_updatable)) {
637  $params[] = $rf_text_updatable;
638  $position = "$" . count($params);
639  $sql .= "rf_text_updatable=$position,";
640  $statement .= ".tUpdate";
641  }
642  if ($rf_detector_type_check != $rf_detector_type && !empty($rf_detector_type)) {
643  $params[] = $rf_detector_type;
644  $position = "$" . count($params);
645  $sql .= "rf_detector_type=$position,";
646  $statement .= ".dType";
647  }
648  if (empty($rf_spdx_id_check) && !empty($rf_spdx_id) &&
649  $rf_spdx_id_check != $rf_spdx_id) {
650  $params[] = $rf_spdx_id;
651  $position = "$" . count($params);
652  $sql .= "rf_spdx_id=$position,";
653  $statement .= ".spdxId";
654  }
655  $sql = substr_replace($sql, "", -1);
656 
657  if ($sql != "UPDATE license_ref SET") { // check if we have something to update
658  $params[] = $rf_shortname;
659  $position = "$" . count($params);
660  $sql .= " WHERE rf_shortname=$position;";
661  try {
662  $dbManager->getSingleRow($sql, $params, $statement);
663  } catch (\Exception $e) {
664  global $FAILED_LICENSE_IMPORT;
665  $FAILED_LICENSE_IMPORT[] = array($rf_shortname, "UPDATE");
666  }
667  }
668  } else { // insert when it is new
669  pg_free_result($result_check);
670  $params = array();
671  $params['rf_shortname'] = $rf_shortname;
672  $params['rf_text'] = $rf_text;
673  $params['rf_url'] = $rf_url;
674  $params['rf_fullname'] = $rf_fullname;
675  $params['rf_notes'] = $rf_notes;
676  $params['rf_active'] = $rf_active;
677  $params['rf_text_updatable'] = $rf_text_updatable;
678  $params['rf_detector_type'] = $rf_detector_type;
679  $params['marydone'] = $marydone;
680  $params['rf_spdx_id'] = $rf_spdx_id;
681  insertNewLicense($dbManager, $params);
682  }
683  }
684  pg_free_result($result_new);
685 
686  $dbManager->queryOnce("DROP TABLE IF EXISTS license_ref_2");
687  $dbManager->commit();
688 
689  return (0);
690 } // initLicenseRefTable()
691 
700 function isLicenseExists($dbManager, $rf_shortname, $isCandidate = true)
701 {
702  $tableName = "license_ref";
703  if ($isCandidate) {
704  $tableName = "license_candidate";
705  }
706  $statement = __METHOD__ . ".$tableName";
707  $sql = "SELECT * FROM ONLY $tableName WHERE rf_shortname = $1;";
708  $licenseRow = $dbManager->getSingleRow($sql, array($rf_shortname),
709  $statement);
710  if (! empty($licenseRow)) {
711  return $licenseRow;
712  } else {
713  return false;
714  }
715 }
716 
724 function mergeCandidateLicense($dbManager, $candidateLicense)
725 {
726  $mainLicense = isLicenseExists($dbManager, $candidateLicense['rf_shortname'],
727  false);
728  $statement = __METHOD__ . ".md5Exists";
729  $sql = "SELECT rf_pk FROM ONLY license_ref WHERE md5(rf_text) = md5($1);";
730  $licenseRow = $dbManager->getSingleRow($sql,
731  array($candidateLicense['rf_text']), $statement);
732  if (! empty($licenseRow)) {
733  $md5Exists = true;
734  } else {
735  $md5Exists = false;
736  }
737  if ($mainLicense !== false && $md5Exists) {
738  $dbManager->begin();
739  $updateStatements = __METHOD__ . ".updateCandidateToMain";
740  $updateCeSql = "UPDATE clearing_event SET rf_fk = $1 WHERE rf_fk = $2;";
741  $updateCeSt = $updateStatements . ".ce";
742  $updateLsbSql = "UPDATE license_set_bulk SET rf_fk = $1 WHERE rf_fk = $2;";
743  $updateLsbSt = $updateStatements . ".lsb";
744  $updateUclSql = "UPDATE upload_clearing_license SET rf_fk = $1 " .
745  "WHERE rf_fk = $2;";
746  $updateUclSt = $updateStatements . ".ucl";
747  $deleteOcmSql = "DELETE FROM obligation_candidate_map WHERE rf_fk = $1;";
748  $deleteOcmSt = $updateStatements . ".ocm";
749 
750  $dbManager->getSingleRow($updateCeSql,
751  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateCeSt);
752  $dbManager->getSingleRow($updateLsbSql,
753  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateLsbSt);
754  $dbManager->getSingleRow($updateUclSql,
755  array($mainLicense['rf_pk'], $candidateLicense['rf_pk']), $updateUclSt);
756  $dbManager->getSingleRow($deleteOcmSql, array($candidateLicense['rf_pk']),
757  $deleteOcmSt);
758  $dbManager->commit();
759  } elseif ($mainLicense !== false || $md5Exists) {
760  // Short name exists and MD5 does not match
761  // Or short name does not exists by MD5 match
762  return -1;
763  }
764  $dbManager->begin();
765  $deleteSql = "DELETE FROM license_candidate WHERE rf_pk = $1;";
766  $deleteStatement = __METHOD__ . ".deleteCandidte";
767  $dbManager->prepare($deleteStatement, $deleteSql);
768  $dbManager->execute($deleteStatement, array($candidateLicense['rf_pk']));
769  if ($mainLicense === false && $md5Exists === false) {
770  // License does not exists
771  insertNewLicense($dbManager, $candidateLicense, true);
772  }
773  $dbManager->commit();
774 }
775 
785 function insertNewLicense($dbManager, $license, $wasCandidate = false)
786 {
787  $insertStatement = __METHOD__ . ".insertNewLicense";
788  $sql = "INSERT INTO license_ref (";
789  if ($wasCandidate) {
790  $sql .= "rf_pk, ";
791  $insertStatement .= ".wasCandidate";
792  }
793  $sql .= "rf_shortname, rf_text, rf_url, rf_fullname, rf_notes, rf_active, " .
794  "rf_text_updatable, rf_detector_type, marydone, rf_spdx_id, rf_md5, " .
795  "rf_add_date) VALUES (";
796  $params = array();
797  if ($wasCandidate) {
798  $params[] = $license['rf_pk'];
799  }
800  $params[] = $license['rf_shortname'];
801  $params[] = $license['rf_text'];
802  $params[] = $license['rf_url'];
803  $params[] = $license['rf_fullname'];
804  $params[] = $license['rf_notes'];
805  $params[] = $license['rf_active'];
806  $params[] = $license['rf_text_updatable'];
807  $params[] = $license['rf_detector_type'];
808  $params[] = $license['marydone'];
809  $params[] = $license['rf_spdx_id'];
810 
811  for ($i = 1; $i <= count($params); $i++) {
812  $sql .= "$" . $i . ",";
813  }
814 
815  $params[] = $license['rf_text'];
816  $textPos = "$" . count($params);
817 
818  $sql .= "md5($textPos),now())";
819  $rfPk = -1;
820  try {
821  $rfPk = $dbManager->insertPreparedAndReturn($insertStatement, $sql, $params,
822  "rf_pk");
823  } catch (\Exception $e) {
824  global $FAILED_LICENSE_IMPORT;
825  $type = "INSERT";
826  if ($wasCandidate) {
827  $type = "CANPROMOTE";
828  }
829  $FAILED_LICENSE_IMPORT[] = array($license['rf_shortname'], $type);
830  }
831  return $rfPk;
832 }
setDriver(Driver &$dbDriver)
Definition: DbManager.php:36
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)
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:468
mergeCandidateLicense($dbManager, $candidateLicense)
Definition: fossinit.php:724
isLicenseExists($dbManager, $rf_shortname, $isCandidate=true)
Definition: fossinit.php:700
insertNewLicense($dbManager, $license, $wasCandidate=false)
Definition: fossinit.php:785
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