source: trunk/www/ports.php @ 57343

Last change on this file since 57343 was 56622, checked in by jmpp@…, 11 years ago

Glue code to show per port licensing information on the ports.php page, disabled for the time being
until problem 1) explained in r56620 is worked out and the revised PortIndex2MySQL.tcl script is run
at least once on the server with the 'create_tables' variable set to true, to create the necessary table.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-php
File size: 13.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 56622 2009-08-31 02:57:23Z jmpp@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<!--                <option value="license"<?php if ($by == 'license') { print ' selected="selected"'; } ?>>License</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/*
114        case 'license':
115            $tables .= ", $portsdb_name.licenses AS lc";
116            $criteria = "lc.portfile = p.name AND lc.license = '" . mysql_real_escape_string($substr) . "'";
117            break;
118*/
119        case 'all':
120            $criteria = '';
121            break;
122        default:
123            $criteria = '0';
124            break;
125        }
126        $where = ($criteria == '' ? '' : "WHERE $criteria");
127        $query = "SELECT DISTINCT $fields FROM $tables $where ORDER BY name";
128        $result = mysql_query($query);
129       
130        /* Main query sent to the DB */
131        if ($result) {
132            $numrows = mysql_num_rows($result);
133            if ($numrows > $pagesize) {
134                $paging = true;
135                $pagecount = ceil($numrows / $pagesize);
136                $page = min($page, $pagecount);
137                $offset = $pagesize * ($page-1);
138                $curpagesize = min($pagesize, $numrows - $offset);
139                # generate a paging control and cache it so we can show it twice
140                $pagecontrol = "<p>Page ";
141                for ($i = 1; $i <= $pagecount; $i++) {
142                    if ($i != 1) {
143                        $pagecontrol .= " | ";
144                    }
145                    if ($i == $page) {
146                        $pagecontrol .= "<b>$i</b>";
147                    } else {
148                        $pagecontrol .= "<a href=\"$_SERVER[PHP_SELF]?by=$by&amp;substr=" . htmlspecialchars($substr) . "&amp;page=$i&amp;pagesize=$pagesize\">$i</a>";
149                    }
150                }
151                $pagecontrol .= "</p>";
152
153                # seek the data pointer
154                mysql_data_seek($result, $offset);
155            }
156
157            print '<h3>Query Results</h3>';
158            if ($paging) {
159                print $pagecontrol;
160                $numrowtext = ($offset+1) . "-" . ($offset + $curpagesize) . " of $numrows Portfile" . ($curpagesize == 1 ? '' : 's');
161            } else {
162                $numrowtext = "$numrows Portfile" . ($numrows == 1 ? '' : 's');
163            }
164            print "<p><i>$numrowtext Selected</i></p>";
165
166            print '<dl>';
167            /* Iterate over the entire set of returned ports */
168            for ($row = mysql_fetch_assoc($result), $i = 0;
169                 $row && (!$paging || $i < $curpagesize);
170                 $row = mysql_fetch_assoc($result), $i++) {
171
172                /* Port name and Portfile URL */
173                print "<dt><b><a href=\"${trac_url}browser/trunk/dports/" . $row['path'] . "/Portfile\">" . htmlspecialchars($row['name'])
174                . '</a></b> ' . htmlspecialchars($row['version']) . '</dt>';
175               
176                print '<dd>';
177                /* Port short description */
178                print htmlspecialchars($row['description']) . '<br />';
179               
180                /* Licenses */
181                $nquery = "SELECT license FROM $portsdb_name.licenses WHERE portfile='" . mysql_real_escape_string($row['name']) .
182                "' ORDER BY license";
183                $nresult = mysql_query($nquery);
184                if ($nresult && mysql_num_rows($nresult) > 0) {
185                    print '<i>Licenses:</i> ';
186                    while ($nrow = mysql_fetch_row($nresult)) {
187                        print "<a href=\"$_SERVER[PHP_SELF]?by=license&amp;substr=" . urlencode($nrow[0]) . '">'
188                        . htmlspecialchars($nrow[0]) . '</a> ';
189                    }
190                    print "<br />";
191                }
192
193                /* Maintainers */
194                $nquery = "SELECT maintainer FROM $portsdb_name.maintainers WHERE portfile='" . mysql_real_escape_string($row['name']) .
195                "' ORDER BY is_primary DESC, maintainer";
196                $nresult = mysql_query($nquery);
197                if ($nresult) {
198                    $primary = 1;
199                    print '<i>Maintained by:</i>';
200                    while ($nrow = mysql_fetch_row($nresult)) {
201                        if ($primary) { print ' <b>'; }
202                        else { print ' '; }
203                        print obfuscate_email($nrow[0]);
204                        if ($primary) { print '</b>'; }
205                        $primary = 0;
206                    }
207                }
208
209                /* Categories */
210                $nquery = "SELECT category FROM $portsdb_name.categories WHERE portfile='" . mysql_real_escape_string($row['name']) .
211                "' ORDER BY is_primary DESC, category";
212                $nresult = mysql_query($nquery);
213                if ($nresult) {
214                    $primary = 1;
215                    print '<br /><i>Categories:</i>';
216                    while ($nrow = mysql_fetch_row($nresult)) {
217                        if ($primary) { print ' <b>'; }
218                        else { print ' '; }
219                        print "<a href=\"$_SERVER[PHP_SELF]?by=category&amp;substr=" . urlencode($nrow[0]) . '">'
220                        . htmlspecialchars($nrow[0]) . '</a>';
221                        if ($primary) { print '</b>'; }
222                        $primary = 0;
223                    }
224                }
225
226                /* Platforms */
227                $nquery = "SELECT platform FROM $portsdb_name.platforms WHERE portfile='" . mysql_real_escape_string($row['name']) .
228                "' ORDER BY platform";
229                $nresult = mysql_query($nquery);
230                if ($nresult) {
231                    print '<br /><i>Platforms:</i> ';
232                    while ($nrow = mysql_fetch_row($nresult)) {
233                        print "<a href=\"$_SERVER[PHP_SELF]?by=platform&amp;substr=" . urlencode($nrow[0]) . '">'
234                        . htmlspecialchars($nrow[0]) . '</a> ';
235                    }
236                }
237
238                /* Dependencies */
239                $nquery = "SELECT library FROM $portsdb_name.dependencies WHERE portfile='" . mysql_real_escape_string($row['name']) .
240                "' ORDER BY library";
241                $nresult = mysql_query($nquery);
242                if ($nresult && mysql_num_rows($nresult) > 0) {
243                    print '<br /><i>Dependencies:</i> ';
244                    while ($nrow = mysql_fetch_row($nresult)) {
245                        $library = eregi_replace('^([^:]*:[^:]*:|[^:]*:)', '', $nrow[0]);
246                        print "<a href=\"$_SERVER[PHP_SELF]?by=library&amp;substr=" . urlencode($library) . '">'
247                        . htmlspecialchars($library) . '</a> ';
248                    }
249                }
250
251                /* Variants */
252                $nquery = "SELECT variant FROM $portsdb_name.variants WHERE portfile='" . mysql_real_escape_string($row['name']) .
253                "' ORDER BY variant";
254                $nresult = mysql_query($nquery);
255                if ($nresult && mysql_num_rows($nresult) > 0) {
256                    print '<br /><i>Variants:</i> ';
257                    while ($nrow = mysql_fetch_row($nresult)) {
258                        print "<a href=\"$_SERVER[PHP_SELF]?by=variant&amp;substr=" . urlencode($nrow[0]) . '">'
259                        . htmlspecialchars($nrow[0]) . '</a> ';
260                    }
261                }
262
263                print '<br /><br /></dd>';
264            } /* while (listing of macthing ports) */
265            print '</dl>';
266
267            if ($paging) {
268                print $pagecontrol;
269            }
270
271        /* When we hit this else, the query failed for some reason */
272        } else {
273            print '<p>An Error Occurred: '. mysql_error($portsdb_info['connection_handler']) . '</p>';
274        }
275       
276    } /* if (main query sent to the DB) */
277?>
278
279</div>
280
281
282<?php
283    print_footer();
284    mysql_close($portsdb_info['connection_handler']);
285?>
Note: See TracBrowser for help on using the repository browser.