All pastes #556211 Raw Edit

Someone

public text v1 · immutable
·published 2007-06-10 13:36 UTC
rendered paste body
<?php
set_time_limit (0);
require_once ('config.php');

$link = mysql_connect ($dbhost, $dbuser, $dbpassword);
mysql_select_db ($dbname, $link);

class ArchToolchain
{
	function ArchToolchain ($arch, $toolchain)
	{
		$this->Arch = $arch;
		$this->Toolchain = $toolchain;
	}
	
	function ToString ()
	{
		return ($this->Arch . '-' . $this->Toolchain);
	}
	
	var $Arch;
	var $Toolchain;
}

$archs = array ("x86", "x86_64");

// mark all current releases as being checked
mysql_select_db ($dbname, $link);
mysql_query ("UPDATE `release` SET status='checking' WHERE status='current'");

foreach ($repos as $repo)
{
	$archtoolchains = array ();
	$spec = new DOMDocument ();
	$spec->load ($repo . 'specs/global.xml');
	$toolchains = $spec->getElementsByTagName ('toolchain');
	$toolchainsDone = array ();
	foreach ($toolchains as $toolchainElement)
	{
		if (!in_array ($toolchainElement->childNodes->item (0)->nodeValue, $toolchainsDone))
		{
			foreach ($archs as $arch)
			{
				$archtoolchains[] = new ArchToolchain ($arch, $toolchainElement->childNodes->item (0)->nodeValue);
			}
			$toolchainsDone[] = $toolchainElement->childNodes->item (0)->nodeValue;
		}
	}

	$specsdir = dir ($repo . 'specs');
	while ($specfile = $specsdir->read ())
	{
		if (substr ($specfile, -4) != '.xml')
			continue;
		if (substr ($specfile, 0, 4) == 'tag-')
			continue;
		if (substr ($specfile, 0, 5) == 'arch-')
			continue;
		if ($specfile == 'global.xml')
			continue;
		
		$spec = new DOMDocument ();
		$spec->load ($repo . 'specs/' . $specfile);
		$package = $spec->getElementsByTagName ('package')->item (0)->getAttribute ('name');
		$summary = $spec->getElementsByTagName ('description')->item (0)->childNodes->item (0)->nodeValue;
		
		mysql_select_db ($bugzilladbname, $link);
		$component = mysql_query ("SELECT 1 FROM components WHERE value='" . mysql_escape_string ($package) . "' && program='paldo'", $link);
		if (mysql_num_rows ($component) == 0)
			mysql_query ("INSERT INTO components VALUES ('" . mysql_escape_string ($package) . "', 'paldo', 4, 0, '" . mysql_escape_string ($summary) . "')", $link);
		
		mysql_select_db ($dbname, $link);
		$releases = $spec->getElementsByTagName ('release');
		foreach ($releases as $releaseElement)
		{
			$tag = $releaseElement->getAttribute ('tag');
			$version = $releaseElement->getAttribute ('version');
			$revision = $releaseElement->getAttribute ('revision');
			$branch = $releaseElement->getAttribute ('branch');
			if ($branch != 'stable' && $branch != 'testing' && $branch != 'unstable' && $branch != 'experimental')
				continue;
			$release = mysql_query ("SELECT releaseid FROM `release` WHERE package='" . mysql_escape_string ($package) . "' && tag='" . mysql_escape_string ($tag) . "' && version='" . mysql_escape_string ($version) . "' && revision=$revision && branch='" . mysql_escape_string ($branch) . "'", $link);
			if (mysql_num_rows ($release) == 1)
			{
				$releaseid = mysql_fetch_object ($release)->releaseid;
				mysql_query ("UPDATE `release` SET status='current' WHERE releaseid=$releaseid");

				mysql_query ("DELETE FROM dependency WHERE releaseid=$releaseid");
				mysql_query ("DELETE FROM sourcefile WHERE releaseid=$releaseid");
			}
			else if (mysql_num_rows ($release) == 0)
			{
				mysql_query ("INSERT INTO `release` VALUES (NULL, '" . mysql_escape_string ($package) . "', '" . mysql_escape_string ($summary) . "', '" . mysql_escape_string ($tag) . "', '" . mysql_escape_string ($version) . "', $revision, '" . mysql_escape_string ($branch) . "', 'current')", $link);
				$releaseid = mysql_insert_id ($link);
				
			}
			else
			{
				// throw exception
			}

			$deps = $releaseElement->getElementsByTagName ('dep');
			foreach ($deps as $depElement)
			{
				$dep_package = $depElement->getAttribute ('name');
				$dep_tag = $depElement->getAttribute ('tag');
				mysql_query ("INSERT INTO dependency VALUES ($releaseid, '" . mysql_escape_string ($dep_package) . "', '" . mysql_escape_string ($dep_tag) . "')", $link);
			}

			$varkeys = array ("\$VERSION", "\$TAG");
			$varvalues = array ($version, $tag);
			$variables = $releaseElement->getElementsByTagName ("variable");
			foreach ($variables as $varElement)
			{
				$varkeys[] = "\$" . $varElement->getAttribute ("name");
				$varvalues[] = $varElement->textContent;
			}

			$sourcefiles = array ();

			$archives = $releaseElement->getElementsByTagName ('archive');
			foreach ($archives as $archiveElement)
				$sourcefiles[] = $archiveElement->getAttribute ('name') . ".tar.bz2";

			$patches = $releaseElement->getElementsByTagName ('patch');
			foreach ($patches as $patchElement)
				$sourcefiles[] = $patchElement->getAttribute ('name') . ".patch.bz2";

			$installs = $releaseElement->getElementsByTagName ('install');
			foreach ($installs as $installElement)
				$sourcefiles[] = $installElement->getAttribute ('name');

			foreach ($sourcefiles as $sourcefile)
				mysql_query ("INSERT INTO sourcefile VALUES ($releaseid, '" . mysql_escape_string (str_replace ($varkeys, $varvalues, $sourcefile)) . "')", $link);


			$binaries = mysql_query ("SELECT arch, toolchain FROM `binary` WHERE releaseid=$releaseid", $link);
			$knownarchtoolchains = array ();
			while ($binary = mysql_fetch_object ($binaries))
			{
				$knownarchtoolchains[] = $binary->arch . '-' . $binary->toolchain;
			}
			
			foreach ($archtoolchains as $archtoolchain)
			{
				if (in_array ($archtoolchain->ToString (), $knownarchtoolchains))
				{
					unset ($knownarchtoolchains[array_search ($archtoolchain->ToString (), $knownarchtoolchains)]);
					continue;
				}

				$release = $package . (strlen ($tag) > 0 ? '-' . $tag : '') . '-' . $archtoolchain->ToString () . '-' . $version . '-' . $revision;
				$info = @file ($repo . 'state/info/' . $release . '.info');
				if ($info)
				{
					$info_table = array ();
					foreach ($info as $info_line)
					{
						$info_array = explode (':', $info_line, 2);
						$info_table[trim ($info_array[0])] = trim ($info_array[1]);
					}
					$installedsize = (int) $info_table['Installed-Size'];
					if (isset ($info_table['Build-Time']))
						$buildduration = (int) $info_table['Build-Time'];
					else
						$buildduration = (int) $info_table['Build-Duration'];
					if (isset ($info_table['Build-Date']))
						$builddate = strtotime ($info_table['Build-Date']);
					else
						$builddate = 0;
					$buildhost = $info_table['Build-Host'];
					mysql_query ("INSERT INTO `binary` VALUES (NULL, $releaseid, '" . mysql_escape_string ($archtoolchain->Arch) . "', '" . mysql_escape_string ($archtoolchain->Toolchain) . "', $installedsize, $buildduration, $builddate, '" . mysql_escape_string ($buildhost) . "')", $link);
					$binaryid = mysql_insert_id ();

					$filelist = @bzopen ($repo . 'state/files/' . $release . '.digest.bz2', 'r');
					if ($filelist)
					{
						while (!feof ($filelist))
						{
							$line = explode ('  ', fgets ($filelist), 2);
							if (count ($line) == 0 || strlen (trim ($line[1])) == 0)
								break;
							if (substr ($line[1], 0, 9) == '/usr/src/' || substr ($line[1], 0, 6) == '/stage' || substr ($line[1], 0, 6) == '/upkg/')
								continue;
							mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'regular', '" . mysql_escape_string ($line[0]) . "')", $link);
							echo mysql_error ();
						}
						bzclose ($filelist);
					}

					$filelist = @bzopen ($repo . 'state/files/' . $release . '.links.bz2', 'r');
					if ($filelist)
					{
						while (!feof ($filelist))
						{
							$line = explode (' ', fgets ($filelist), 2);
							if (count ($line) == 0 || strlen (trim ($line[1])) == 0)
								break;
							if (substr ($line[1], 0, 9) == '/usr/src/' || substr ($line[1], 0, 6) == '/stage' || substr ($line[1], 0, 6) == '/upkg/')
								continue;
							mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'link', '" . mysql_escape_string ($line[0]) . "')", $link);
						}
						bzclose ($filelist);
					}

					$filelist = @bzopen ($repo . 'state/files/' . $release . '.dirs.bz2', 'r');
					if ($filelist)
					{
						while (!feof ($filelist))
						{
							$line = fgets ($filelist);
							if (strlen ($line) == 0)
								break;
							if (substr ($line, 0, 9) == '/usr/src/' || substr ($line, 0, 6) == '/stage' || substr ($line, 0, 6) == '/upkg/')
								continue;
							mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line) . "', 'directory', NULL)", $link);
						}
						bzclose ($filelist);
					}

					$filelist = @bzopen ($repo . 'state/files/' . $release . '.config.bz2', 'r');
					if ($filelist)
					{
						while (!feof ($filelist))
						{
							$line = explode (' ', fgets ($filelist), 2);
							if (count ($line) == 0 || strlen (trim ($line[1])) == 0)
								break;
							mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'config', '" . mysql_escape_string ($line[0]) . "')", $link);
						}
						bzclose ($filelist);
					}
				}
			}
			foreach ($knownarchtoolchains as $knownarchtoolchain)
			{
				mysql_query ("DELETE `binary`, `file` FROM `binary`, `file` WHERE `binary`.releaseid='" . $releaseid . "' && CONCAT_WS('-', `binary`.arch, `binary`.toolchain)='" . $knownarchtoolchain . "' && `binary`.binaryid=`file`.binaryid", $link);
				mysql_query ("DELETE FROM `binary` WHERE releaseid='" . $releaseid . "' && CONCAT_WS('-', `binary`.arch, `binary`.toolchain)='" . $knownarchtoolchain . "'", $link);
			}
		}
	}
	$specsdir->close ();
}
		
// releases which still have status checking aren't used anymore, update status in db to reflect that
mysql_query ("UPDATE `release` SET status='old' WHERE status='checking'");

mysql_query ("DELETE `release`, `binary`, `file` FROM `release`, `binary`, `file` WHERE `release`.status='old' && `release`.releaseid=`binary`.releaseid && `binary`.binaryid=`file`.binaryid", $link);
mysql_query ("DELETE `release`, `binary` FROM `release`, `binary` WHERE `release`.status='old' && `release`.releaseid=`binary`.releaseid", $link);
mysql_query ("DELETE `release`, dependency FROM `release`, dependency WHERE `release`.status='old' && `release`.releaseid=dependency.releaseid", $link);
mysql_query ("DELETE FROM `release` WHERE `release`.status='old'", $link);

// delete not existing references in dependencies table
mysql_query ("DELETE dependency FROM dependency LEFT JOIN `release` USING (releaseid) WHERE `release`.releaseid IS NULL", $link);

/*
CREATE TABLE `release` (
  `releaseid` int(10) unsigned NOT NULL auto_increment,
  `package` varchar(64) NOT NULL default '',
  `version` varchar(16) NOT NULL default '',
  `installedsize` int(10) unsigned default NULL,
  `buildduration` int(10) unsigned default NULL,
  `builddate` int(11) default NULL,
  `buildhost` varchar(255) default NULL,
  PRIMARY KEY  (`releaseid`),
  UNIQUE KEY `versionedname` (`package`,`version`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
*/
?>