Changeset 1926


Ignore:
Timestamp:
4/16/2010 2:03:12 PM (5 years ago)
Author:
lowjoel
Message:

Improved on the Download class to be usable for Update querying as well, and upgrade the UpdateList? classes to use the class directly instead of querying the database. This removes one more dependency on the traditional mysql PHP functions.

Location:
trunk/website/scripts
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/website/scripts/Download.php

    r1914 r1926  
    88 
    99require_once('Database.php'); 
     10require_once('Publisher.php'); 
    1011 
    1112/** 
     
    1617    protected $ID; 
    1718    protected $Downloads; 
     19    protected $Superseded; 
     20 
    1821    protected $Name; 
    1922    protected $Released; 
    20     protected $Superseded; 
     23    protected $Type; 
     24    protected $Version; 
     25    protected $Publisher; 
     26    protected $Architecture; 
     27    protected $Filesize; 
    2128    protected $Link; 
    2229 
     
    2936    { 
    3037        $pdo = new Database(); 
    31         $statement = $pdo->prepare('SELECT Name, Released, Superseded, Link FROM downloads WHERE DownloadID=?'); 
     38        $statement = $pdo->prepare('SELECT Name, Superseded, Released, Type, Version, PublisherID, 
     39            Architecture, Filesize, Link FROM downloads WHERE DownloadID=?'); 
    3240        $statement->bindParam(1, $downloadId); 
    3341        $statement->execute(); 
     
    3543        //Set the name, release date and supersedence as well as the link. 
    3644        $statement->bindColumn('Name', $this->Name); 
     45        $statement->bindColumn('Superseded', $this->Superseded); 
    3746        $statement->bindColumn('Released', $this->Released); 
    38         $statement->bindColumn('Superseded', $this->Superseded); 
     47        $statement->bindColumn('Type', $this->Type); 
     48        $statement->bindColumn('Version', $this->Version); 
     49        $statement->bindColumn('PublisherID', $this->Publisher); 
     50        $statement->bindColumn('Architecture', $this->Architecture); 
     51        $statement->bindColumn('Filesize', $this->Filesize); 
    3952        $statement->bindColumn('Link', $this->Link); 
    4053        if ($statement->fetch() === false) 
     
    5669    public function __get($name) 
    5770    { 
    58         return $this->$name; 
     71        switch ($name) 
     72        { 
     73            case 'Publisher': 
     74                return new Publisher($this->Publisher); 
     75            default: 
     76                return $this->$name; 
     77        } 
    5978    } 
    6079 
     
    7695            default: 
    7796                throw new ErrorException(sprintf('The property %s does not exist or cannot be writte to.', $name)); 
     97        } 
     98    } 
     99 
     100    /** 
     101     * Gets the link to the download that can be referenced publicly. 
     102     * 
     103     * @return string The URL to this download. 
     104     */ 
     105    public function GetDisplayedLink() 
     106    { 
     107        if (preg_match('/http(s{0,1}):\/\/(.*)/', $this->Link)) 
     108        { 
     109            return $this->Link; 
     110        } 
     111        else if (substr($this->Link, 0, 1) == '?') 
     112        { 
     113            return sprintf('http://%s/download.php?id=%d', $_SERVER['SERVER_NAME'], $this->ID); 
     114        } 
     115        else 
     116        { 
     117            throw new Exception('Unknown download link'); 
    78118        } 
    79119    } 
  • trunk/website/scripts/updates.php

    r1763 r1926  
    11<?php 
     2require_once('Database.php'); 
     3require_once('Download.php'); 
     4 
     5/** 
     6 * Base class for all update lists types. 
     7 */ 
    28abstract class UpdateListBase 
    39{ 
     10    /** 
     11     * Gets the version of the update list generated. 
     12     * 
     13     * @return string 
     14     */ 
    415    protected abstract function GetVersion(); 
     16 
     17    /** 
     18     * Gets the updates that the client may require. 
     19     * 
     20     * @param string $clientVersion The version string of the client. 
     21     * @return array                An array of Download objects which will be presented to the client. 
     22     */ 
    523    protected abstract function GetUpdates($clientVersion); 
     24 
     25    /** 
     26     * Triggers the generation of the update body for the client. 
     27     * 
     28     * @param string $clientVersion The version string of the client. 
     29     */ 
    630    protected abstract function OutputBodyXml($clientVersion); 
    7      
     31 
     32    /** 
     33     * Generates an update list for a client with the given version string. 
     34     * 
     35     * @param string $clientVersion The version string of the client. 
     36     */ 
    837    public function Output($clientVersion) 
    938    { 
     
    2251    protected function OutputUpdates($clientVersion) 
    2352    { 
    24         $query = $this->GetUpdates($clientVersion); 
     53        $updates = $this->GetUpdates($clientVersion); 
    2554 
    2655        $lastItemType = null; 
    27         while ($row = mysql_fetch_array($query)) 
     56        foreach ($updates as $update) 
    2857        { 
    29             if ($row['Type'] != $lastItemType) 
     58            //Output the closing type tag and open a new type tag for the new update type. 
     59            if ($update->Type != $lastItemType) 
    3060            { 
    3161                if ($lastItemType !== null) 
    3262                    printf('    </%s>' . "\n", $lastItemType); 
    33                 printf('    <%s>' . "\n", $row['Type']); 
    34                 $lastItemType = $row['Type']; 
     63                printf('    <%s>' . "\n", $update->Type); 
     64                $lastItemType = $update->Type; 
    3565            } 
    36          
    37             //Get the link to the download. We got three forms, relative, absolute and query. 
    38             //Relative links are mirrored by SF. 
    39             //Absolute links... are absolute links. 
    40             //Query links are prefixed with ?, they are handled by download.php on the Eraser website. 
    41             if (substr($row['Link'], 0, 1) == '?') 
    42                 $link = 'http://' . $_SERVER['SERVER_NAME'] . '/download.php?id=' . $row['DownloadID']; 
    43             else 
    44                 $link = $row['Link']; 
     66 
     67            //Print the download entry. 
    4568            printf('        <item name="%s" version="%s" publisher="%s" architecture="%s" filesize="%d">%s</item> 
    46 ', htmlentities($row['Name']), $row['Version'], htmlentities($row['PublisherName']), $row['Architecture'], 
    47                 $row['Filesize'], htmlentities($link)); 
     69', htmlentities($update->Name), $update->Version, htmlentities($update->Publisher->Name), $update->Architecture, 
     70                $update->Filesize, htmlentities($update->GetDisplayedLink())); 
    4871        } 
    4972         
     
    6891    { 
    6992        //Prepare the list of updates 
    70         return mysql_query(sprintf('SELECT downloads.*, publishers.Name as PublisherName 
     93        $pdo = new Database(); 
     94        $statement = $pdo->prepare('SELECT DownloadID 
    7195            FROM downloads 
    72             INNER JOIN publishers ON 
    73                 downloads.PublisherID=publishers.PublisherID 
    7496            WHERE 
    7597                (Superseded = 0) AND 
     
    7799                ( 
    78100                    (MinVersion IS NULL AND MaxVersion IS NULL) OR 
    79                     (MinVersion IS NULL AND MaxVersion > \'%1$s\') OR 
     101                    (MinVersion IS NULL AND MaxVersion > :Version) OR 
    80102                    (MinVersion <= \'%1$s\' AND MaxVersion IS NULL) OR 
    81                     (MinVersion <= \'%1$s\' AND MaxVersion > \'%1$s\') 
     103                    (MinVersion <= \'%1$s\' AND MaxVersion > :Version) 
    82104                ) 
    83             ORDER BY `Type` ASC', mysql_real_escape_string($clientVersion))); 
     105            ORDER BY `Type` ASC'); 
     106        $statement->bindParam('Version', $clientVersion); 
     107        $statement->execute(); 
     108 
     109        $result = array(); 
     110        $downloadId = null; 
     111        $statement->bindColumn('DownloadID', $downloadId); 
     112        while ($statement->fetch()) 
     113            $result[] = new Download($downloadId); 
     114 
     115        return $result; 
    84116    } 
    85117     
     
    87119    { 
    88120        //Output the list of mirrors 
    89         $query = mysql_query('SELECT * FROM mirrors ORDER By Continent, Country, City'); 
     121        $pdo = new Database(); 
     122        $statement = $pdo->query('SELECT * FROM mirrors ORDER By Continent, Country, City'); 
    90123        echo '  <mirrors> 
    91124        <mirror location="(automatically decide)">http://downloads.sourceforge.net/eraser/</mirror> 
    92125'; 
    93         while ($row = mysql_fetch_array($query)) 
    94         { 
    95             printf('        <mirror location="%s, %s">%s</mirror>' . "\n", $row['City'], $row['Country'], 
    96                 $row['URL']); 
    97         } 
    98         echo '  </mirrors>'; 
     126 
     127        $statement->bindColumn('City', $city); 
     128        $statement->bindColumn('Country', $country); 
     129        $statement->bindColumn('URL', $url); 
     130        while ($statement->fetch()) 
     131            printf('        <mirror location="%s, %s">%s</mirror>' . "\n", $city, $country, $url); 
     132        echo '  </mirrors>' . "\n"; 
    99133    } 
    100134 
     
    116150    { 
    117151        //Prepare the list of updates 
    118         return mysql_query(sprintf('SELECT downloads.*, publishers.Name as PublisherName 
     152        $pdo = new Database(); 
     153        $statement = $pdo->prepare('SELECT DownloadID 
    119154            FROM downloads 
    120             INNER JOIN publishers ON 
    121                 downloads.PublisherID=publishers.PublisherID 
    122155            WHERE 
    123156                (Superseded = 0) AND 
     
    126159                        (`Type` <> \'build\') AND 
    127160                        (MinVersion IS NULL AND MaxVersion IS NULL) OR 
    128                         (MinVersion IS NULL AND MaxVersion > \'%1$s\') OR 
     161                        (MinVersion IS NULL AND MaxVersion > :Version) OR 
    129162                        (MinVersion <= \'%1$s\' AND MaxVersion IS NULL) OR 
    130                         (MinVersion <= \'%1$s\' AND MaxVersion > \'%1$s\') 
     163                        (MinVersion <= \'%1$s\' AND MaxVersion > :Version) 
    131164                    ) OR 
    132165                    (                                                           -- Nightly builds greater than our version 
    133166                        (`Type` = \'build\') AND 
    134                         (Version > \'%1$s\') 
     167                        (Version > :Version) 
    135168                    ) 
    136169                ) 
    137             ORDER BY `Type` ASC', mysql_real_escape_string($clientVersion))); 
     170            ORDER BY `Type` ASC'); 
     171        $statement->bindParam('Version', $clientVersion); 
     172        $statement->execute(); 
     173 
     174        $result = array(); 
     175        $downloadId = null; 
     176        $statement->bindColumn('DownloadID', $downloadId); 
     177        while ($statement->fetch()) 
     178            $result[] = new Download($downloadId); 
     179 
     180        return $result; 
    138181    } 
    139182     
Note: See TracChangeset for help on using the changeset viewer.