source: trunk/www/ports.php @ 35225

Last change on this file since 35225 was 35225, checked in by eridius@…, 12 years ago

Auto-page any output of ports.php that exceeds the pagesize

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-php
File size: 12.1 KB
Line 
1<?php
2    /* -*- coding: utf-8; mode: php; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=php:et:sw=4:ts=4:sts=4 */
3    /* Web client to the PortIndex2MySQL script located in MacPorts base/portmgr/jobs svn directory. */
4    /* $Id: ports.php 35225 2008-03-21 06:31:53Z eridius@macports.org $ */
5    /* Copyright (c) 2004, OpenDarwin. */
6    /* Copyright (c) 2004-2007, The MacPorts Project. */
7   
8    $MPWEB = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME']);
9    include_once("$MPWEB/includes/common.inc");
10   
11    $portsdb_info = portsdb_connect($portsdb_host, $portsdb_user, $portsdb_passwd);
12    $sql = "SELECT UNIX_TIMESTAMP(activity_time) FROM $portsdb_name.log ORDER BY UNIX_TIMESTAMP(activity_time) DESC";
13    $result = mysql_query($sql);
14    if ($result && $row = mysql_fetch_row($result)) {
15        $date = date('Y-m-d', $row[0]);
16        $time = date('H:i:s e', $row[0]);
17    } else {
18        $date = '(unknown)';
19        $time = '(unknown)';
20    }
21    $by = isset($_GET['by']) ? $_GET['by'] : '';
22    $substr = isset($_GET['substr']) ? $_GET['substr'] : '';
23    $page = isset($_GET['page']) ? max($_GET['page'], 1) : '1';
24    $pagesize = isset($_GET['pagesize']) ? max($_GET['pagesize'], 1) : 50; # arbitrary setting
25
26    print_header('The MacPorts Project -- Available Ports', 'utf-8');
27?>
28
29<div id="content">
30
31    <h2 class="hdr">MacPorts Portfiles</h2>
32
33    <p>The MacPorts Project currently distributes <b><?php print $portsdb_info['num_ports']; ?></b> ports, organized across
34    <?php print $portsdb_info['num_categories']; ?> different categories and available below for viewing. This form allows
35    you to search the MacPorts software index, last updated on <?php print '<b>' . $date . '</b> at <b>' . $time . '</b>'; ?>.
36    </p>
37   
38    <br />
39
40    <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="get">
41        <p>
42            <label>Search by:</label>
43            <select name="by">
44                <option value="name"<?php if ($by == 'name') { print ' selected="selected"'; } ?>>Software Title</option>
45                <option value="category"<?php if ($by == 'category') { print ' selected="selected"'; } ?>>Category</option>
46                <option value="maintainer"<?php if ($by == 'maintainer') { print ' selected="selected"'; } ?>>Maintainer</option>
47<!--                <option value="library"<?php if ($by == 'dependency') { print ' selected="selected"'; } ?>>Dependency</option> -->
48                <option value="variant"<?php if ($by == 'variant') { print ' selected="selected"'; } ?>>Variant</option>
49                <option value="platform"<?php if ($by == 'platform') { print ' selected="selected"'; } ?>>Platform</option>
50            </select>
51            <input type="text" name="substr" size="40" />
52            <input type="submit" value="Search" />
53        </p>
54    </form>
55
56    <p>Or view the complete <a href="<?php print $_SERVER['PHP_SELF']; ?>?by=all">ports list (<?php print $portsdb_info['num_ports']; ?>
57    ports)</a>.</p>
58    <br />
59
60<?php
61    /* If no valid search criteria is specified (by set and not equal to all and a valid substring) we output port categories
62     as possible searches */
63    if (!$by || ($by != 'all' && !$substr)) {
64        $query = "SELECT DISTINCT category FROM $portsdb_name.categories ORDER BY category";
65        $result = mysql_query($query);
66        if ($result) {
67            $max_entries_per_column = floor($portsdb_info['num_categories']/4);
68            $columns = 0;
69            print '<h3>Port Categories</h3><div id="categories"><ul>';
70            while ($columns < 4) {
71                $entries_per_colum = 0;
72                print '<li><ul>';
73                while ($row = mysql_fetch_assoc($result)) {
74                    print "<li><a href=\"$_SERVER[PHP_SELF]?by=category&amp;substr=" . urlencode($row['category']) . '">'
75                    . htmlspecialchars($row['category']) . '</a></li>';
76                    if ($entries_per_colum == $max_entries_per_column) break;
77                    $entries_per_colum++;
78                }
79                print '</ul></li>';
80                $columns++;
81            }
82            print '</ul></div>';
83        }
84    }
85
86    /* If valid criteria is specified (by set and a valid substring, or by set to all) we poll the db and display the results */
87    if ($by && ($substr || $by == 'all')) {
88        $fields = 'name, path, version, description';
89        $tables = "$portsdb_name.portfiles AS p";
90        switch ($by) {
91        case 'name':
92            $criteria = "p.name LIKE '%" . mysql_real_escape_string($substr) . "%'";
93            break;
94        case 'category':
95            $tables .= ", $portsdb_name.categories AS c";
96            $criteria = "c.portfile = p.name AND c.category = '" . mysql_real_escape_string($substr) . "'";
97            break;
98        case 'maintainer':
99            $tables .= ", $portsdb_name.maintainers AS m";
100            $criteria = "m.portfile = p.name AND m.maintainer LIKE '%" . mysql_real_escape_string($substr) . "%'";
101            break;
102        case 'library':
103            $criteria = "p.name = '" . mysql_real_escape_string($substr) . "'";
104            break;
105        case 'variant':
106            $tables .= ", $portsdb_name.variants AS v";
107            $criteria = "v.portfile = p.name AND v.variant = '" . mysql_real_escape_string($substr) . "'";
108            break;
109        case 'platform':
110            $tables .= ", $portsdb_name.platforms AS pl";
111            $criteria = "pl.portfile = p.name AND pl.platform = '" . mysql_real_escape_string($substr) . "'";
112            break;
113        case 'all':
114            $criteria = '';
115            break;
116        default:
117            $criteria = '0';
118            break;
119        }
120        $where = ($criteria == '' ? '' : "WHERE $criteria");
121        $query = "SELECT DISTINCT $fields FROM $tables $where ORDER BY name";
122        $result = mysql_query($query);
123       
124        /* Main query sent to the DB */
125        if ($result) {
126            $numrows = mysql_num_rows($result);
127            if ($numrows > $pagesize) {
128                $paging = true;
129                $pagecount = ceil($numrows / $pagesize);
130                $page = min($page, $pagecount);
131                $offset = $pagesize * ($page-1);
132                $curpagesize = min($pagesize, $numrows - $offset);
133                # generate a paging control and cache it so we can show it twice
134                $pagecontrol = "<p>Page ";
135                for ($i = 1; $i <= $pagecount; $i++) {
136                    if ($i != 1) {
137                        $pagecontrol .= " | ";
138                    }
139                    if ($i == $page) {
140                        $pagecontrol .= "<b>$i</b>";
141                    } else {
142                        $pagecontrol .= "<a href=\"$_SERVER[PHP_SELF]?by=$by&amp;substr=$substr&amp;page=$i&amp;pagesize=$pagesize\">$i</a>";
143                    }
144                }
145                $pagecontrol .= "</p>";
146
147                # seek the data pointer
148                mysql_data_seek($result, $offset);
149            }
150
151            print '<h3>Query Results</h3>';
152            if ($paging) {
153                print $pagecontrol;
154                $numrowtext = ($offset+1) . "-" . ($offset + $curpagesize) . " of $numrows Portfile" . ($curpagesize == 1 ? '' : 's');
155            } else {
156                $numrowtext = "$numrows Portfile" . ($numrows == 1 ? '' : 's');
157            }
158            print "<p><i>$numrowtext Selected</i></p>";
159
160            print '<dl>';
161            /* Iterate over the entire set of returned ports */
162            for ($row = mysql_fetch_assoc($result), $i = 0;
163                 $row && (!$paging || $i < $curpagesize);
164                 $row = mysql_fetch_assoc($result), $i++) {
165
166                /* Port name and Portfile URL */
167                print "<dt><b><a href=\"${trac_url}browser/trunk/dports/$row[path]/Portfile\">" . htmlspecialchars($row['name'])
168                . '</a></b> ' . htmlspecialchars($row['version']) . '</dt>';
169               
170                print '<dd>';
171                /* Port short description */
172                print htmlspecialchars($row['description']) . '<br />';
173               
174                /* Maintainers */
175                $nquery = "SELECT maintainer FROM $portsdb_name.maintainers WHERE portfile='" . mysql_real_escape_string($row['name']) .
176                "' ORDER BY is_primary DESC, maintainer";
177                $nresult = mysql_query($nquery);
178                if ($nresult) {
179                    $primary = 1;
180                    print '<i>Maintained by:</i>';
181                    while ($nrow = mysql_fetch_row($nresult)) {
182                        if ($primary) { print ' <b>'; }
183                        else { print ' '; }
184                        print obfuscate_email($nrow[0]);;
185                        if ($primary) { print '</b>'; }
186                        $primary = 0;
187                    }
188                }
189
190                /* Categories */
191                $nquery = "SELECT category FROM $portsdb_name.categories WHERE portfile='" . mysql_real_escape_string($row['name']) .
192                "' ORDER BY is_primary DESC, category";
193                $nresult = mysql_query($nquery);
194                if ($nresult) {
195                    $primary = 1;
196                    print '<br /><i>Categories:</i>';
197                    while ($nrow = mysql_fetch_row($nresult)) {
198                        if ($primary) { print ' <b>'; }
199                        else { print ' '; }
200                        print "<a href=\"$_SERVER[PHP_SELF]?by=category&amp;substr=" . urlencode($nrow[0]) . '">'
201                        . htmlspecialchars($nrow[0]) . '</a>';
202                        if ($primary) { print '</b>'; }
203                        $primary = 0;
204                    }
205                }
206
207                /* Platforms */
208                $nquery = "SELECT platform FROM $portsdb_name.platforms WHERE portfile='" . mysql_real_escape_string($row['name']) .
209                "' ORDER BY platform";
210                $nresult = mysql_query($nquery);
211                if ($nresult) {
212                    print '<br /><i>Platforms:</i> ';
213                    while ($nrow = mysql_fetch_row($nresult)) {
214                        print "<a href=\"$_SERVER[PHP_SELF]?by=platform&amp;substr=" . urlencode($nrow[0]) . '">'
215                        . htmlspecialchars($nrow[0]) . '</a> ';
216                    }
217                }
218
219                /* Dependencies */
220                $nquery = "SELECT library FROM $portsdb_name.dependencies WHERE portfile='" . mysql_real_escape_string($row['name']) .
221                "' ORDER BY library";
222                $nresult = mysql_query($nquery);
223                if ($nresult && mysql_num_rows($nresult) > 0) {
224                    print '<br /><i>Dependencies:</i> ';
225                    while ($nrow = mysql_fetch_row($nresult)) {
226                        $library = eregi_replace('^([^:]*:[^:]*:|[^:]*:)', '', $nrow[0]);
227                        print "<a href=\"$_SERVER[PHP_SELF]?by=library&amp;substr=" . urlencode($library) . '">'
228                        . htmlspecialchars($library) . '</a> ';
229                    }
230                }
231
232                /* Variants */
233                $nquery = "SELECT variant FROM $portsdb_name.variants WHERE portfile='" . mysql_real_escape_string($row['name']) .
234                "' ORDER BY variant";
235                $nresult = mysql_query($nquery);
236                if ($nresult && mysql_num_rows($nresult) > 0) {
237                    print '<br /><i>Variants:</i> ';
238                    while ($nrow = mysql_fetch_row($nresult)) {
239                        print "<a href=\"$_SERVER[PHP_SELF]?by=variant&amp;substr=" . urlencode($nrow[0]) . '">'
240                        . htmlspecialchars($nrow[0]) . '</a> ';
241                    }
242                }
243                print '<br /><br /></dd>';
244               
245            } /* while (listing of macthing ports) */
246            print '</dl>';
247
248            if ($paging) {
249                print $pagecontrol;
250            }
251
252        /* When we hit this else, the query failed for some reason */
253        } else {
254            print '<p>An Error Occurred: '. mysql_error($portsdb_info['connection_handler']) . '</p>';
255        }
256       
257    } /* if (main query sent to the DB) */
258?>
259
260</div>
261
262
263<?php
264    print_footer();
265    mysql_close($portsdb_info['connection_handler']);
266?>
Note: See TracBrowser for help on using the repository browser.