source: trunk/www/ports.php @ 56562

Last change on this file since 56562 was 48228, checked in by raimue@…, 11 years ago

www:
More modeline fixes for vim

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