<?php
        require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";
        require_once "/home/data/httpd/eclipse-php-classes/system/app.class.php";

        #*****************************************************************************
        #
        # mir_list.php
        #
        # Author:       Denis Roy
        # Date:         2004-11-16
        #
        # Description:  Logic for displaying mirrors according to incoming parameters
        #
        # HISTORY:
        #
        #*****************************************************************************


	$_drop_id 	= $_GET['drop_id'] ? $_GET['drop_id'] : $_POST['drop_id'];
	$_format 	= $_GET['format'] ? $_GET['format'] : $_POST['format'];
	$_debug 	= $_GET['debug'];
	$_protocol 	= $_GET['protocol'] ? $_GET['protocol'] : $_POST['protocol'];
	$_version 	= $_GET['version'] ? $_GET['version'] : $_POST['version'];
	
	if($_format != "html" && $_format != "xml") {
		$_format = "html";
	}
	if($_protocol != "http" && $_protocol != "ftp" && $_protocol != "rsync" && $_protocol != "bittorrent") {
		$_protocol = "";
	}

	# Connect to database
	$dbc 	= new DBConnectionRW();
	$dbh 	= $dbc->connect();

	$app = new App();

        # ensure incoming drop_id parameter is a valid drop_id

        if($_drop_id != "") {
                $sql = "SELECT
                                COUNT(drop_id) AS RecordCount
                        FROM drops
                        WHERE drop_id = '$_drop_id'
                ";
		$rs = mysql_query($sql, $dbh);

                $myrow = mysql_fetch_assoc($rs);

		if($myrow['RecordCount'] == 0) {
                	$_drop_id = "";
                }
	}


	# Build where string
	if($_drop_id == "") {
		$_drop_id = "Full";
	}

	$where = " DRP.drop_id = 'EclipseFull'";

	# temp table req'd because curent version of mysql doesn't support union
	createTmpMirList($_drop_id, $_drop_id, "_tmp_mir_list", $dbh, false);

	# Add Full
	if($_drop_id == "Update" || $_drop_id == "Stable" || $_drop_id == "Release") {
		createTmpMirList($_drop_id, "Full", "_tmp_mir_list2", $dbh, true);
		$sql = "INSERT INTO _tmp_mir_list SELECT * FROM _tmp_mir_list2";
		if($_debug == 1) {
			echo $sql;
		}
		mysql_query($sql,$dbh);
		mysql_query("DROP TABLE _tmp_mir_list2", $dbh);
	}


	# Add EclipseFull
	if($_drop_id != "EclipseFull") {
		createTmpMirList($_drop_id, "EclipseFull", "_tmp_mir_list3", $dbh, true);
		$sql = "INSERT INTO _tmp_mir_list SELECT * FROM _tmp_mir_list3";
		if($_debug == 1) {
			echo $sql;
		}
		mysql_query($sql,$dbh);
		mysql_query("DROP TABLE _tmp_mir_list3", $dbh);
	}


	#Fetch complete resultset
	$sql = "SELECT TMP.*, 
				COU.en_description AS country_desc, 
				CON.en_description AS continent_desc 
				FROM _tmp_mir_list AS TMP
					INNER JOIN SYS_countries AS COU ON COU.ccode = TMP.ccode
					INNER JOIN SYS_continents AS CON ON CON.continent_code = COU.continent_code
				ORDER BY TMP.organization";
	if($_debug == 1) {
		echo $sql;
	}

	$rs 	= mysql_query($sql, $dbh);


	if($_format == "html") {
		include("inc/en_mir_list.php");
	}
	if($_format == "xml") {
		$app->sendXMLHeader();
		include("inc/en_mir_list_xml.php");
	}



	$dbc->disconnect();
	$rs 	= null;
	$dbh 	= null;
	$dbc 	= null;





	# Local subroutines
	function createTmpMirList($_drop_id_wanted, $_drop_id_search, $_table_name, $_dbh, $_exclude_dups) {
		global $_debug;
		global $_protocol;

		# Add EclipseFull
		$join = "";
		$where = " MRD.drop_id = '$_drop_id_search'";
		if($_exclude_dups) {
			$join = "LEFT JOIN _tmp_mir_list AS TMP ON TMP.mirror_id = MIR.mirror_id";
			$where .= " AND TMP.drop_id IS NULL";
		}
		if($_protocol != "") {
			$where .= " AND MRP.protocol = '$_protocol'";
		}

        	$sql = "CREATE TEMPORARY TABLE $_table_name AS
                	SELECT
                        	MIR.mirror_id,
	                        MIR.organization,
				MIR.ccode,
        	                MRD.drop_id,
                	        DRP.our_path,
                        	MRP.protocol,
	                        MRP.base_path,
        	                MRD.rel_path_override,
				DRW.our_path AS our_path2
                	FROM mirrors AS MIR
                        	INNER JOIN mirror_protocols AS MRP on MRP.mirror_id = MIR.mirror_id
	                        INNER JOIN mirror_drops AS MRD ON MRD.mirror_id = MIR.mirror_id
        	                        AND MRD.protocol = MRP.protocol
                	        INNER JOIN drops as DRP ON DRP.drop_id = '$_drop_id_search'
                	        INNER JOIN drops as DRW ON DRW.drop_id = '$_drop_id_wanted'
				$join
	                WHERE
        	                MIR.is_internal <> 1
                	        AND MIR.is_advertise = 1
                        	AND MIR.create_status = 'active'
	                        AND $where
	        ";
		
		if($_debug == 1) {
			echo $sql;
		}
		mysql_query($sql, $_dbh);
	}

	function getPath($_cur_drop_id, $_drop_id, $_rel_path_override, $_our_path, $_our_path2) {
		global $_version;
		
		$path = "";
        if($_cur_drop_id == $_drop_id) {
                if($_rel_path_override != "") {
                        $path = $_rel_path_override;
                }
                else {
                        $path = $_our_path;
                }
        }
        else {
                if($_rel_path_override != "") {
                        # Build path
                        $our_path2 = str_replace($_our_path, $_rel_path_override, $_our_path2);

                        $path = $our_path2;
                }
                else {
                        $path = $_our_path2;
                }
        }

		if($_version != "") {
			$path .= "/" . $_version;
		}
		
		return $path;
	}
?>

