Commit: 9b248f9ed6a53dcc6400edbc1e0728c25a44cf89
Author: Peter Kokot <[email protected]> Mon, 10 Dec 2018 01:41:56
+0100
Parents: 0173592272937e4c8c480da9932bbd418aef69eb
Branches: master
Link:
http://git.php.net/?p=web/bugs.git;a=commitdiff;h=9b248f9ed6a53dcc6400edbc1e0728c25a44cf89
Log:
Refactor get_pseudo_packages() to repository class
Changes:
- get_pseudo_packages() function is moved to its own repository class.
- Database::queryAll() removed since it is not used and the method
arguments don't match the number of used arguments anymore
- Project types configuration is moved to repository class for now.
- Some unused items removed
- Some template changes and show_project_options() helper function
integrated in the view layer directly since it is used in a simplified
way.
Changed paths:
M include/functions.php
M include/query.php
M src/Database/Database.php
A src/Repository/PackageRepository.php
M www/bug.php
M www/lstats.php
M www/patch-display.php
M www/report.php
M www/search.php
M www/stats.php
diff --git a/include/functions.php b/include/functions.php
index 8f35fe2..04ec1bb 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -33,11 +33,6 @@ $bug_types = [
'Security' => 'Sec Bug'
];
-$project_types = [
- 'PHP' => 'php',
- 'PECL' => 'pecl'
-];
-
// Used in show_state_options()
$state_types = [
'Open' => 2,
@@ -192,70 +187,6 @@ function bugs_authenticate (&$user, &$pw, &$logged_in,
&$user_flags)
}
}
-/**
- * Fetches pseudo packages from database
- *
- * @param string $project define what project
pseudo packages are returned
- * @param bool $return_disabled whether to return read-only
items, defaults to true
- *
- * @return array array of pseudo packages
- */
-function get_pseudo_packages($project, $return_disabled = true)
-{
- global $dbh, $project_types;
-
- $pseudo_pkgs = $nodes = $tree = [];
- $where = '1=1';
- $project = strtolower($project);
-
- if ($project !== false && in_array($project, $project_types)) {
- $where .= " AND project IN ('', '$project')";
- }
- if (!$return_disabled) {
- $where.= " AND disabled = 0";
- }
-
- $data = $dbh->queryAll("SELECT * FROM bugdb_pseudo_packages WHERE
$where ORDER BY parent, disabled, id", null, PDO::FETCH_ASSOC);
-
- // Convert flat array to nested strucutre
- foreach ($data as &$node)
- {
- $node['children'] = [];
- $id = $node['id'];
- $parent_id = $node['parent'];
- $nodes[$id] =& $node;
-
- if (array_key_exists($parent_id, $nodes)) {
- $nodes[$parent_id]['children'][] =& $node;
- } else {
- $tree[] =& $node;
- }
- }
-
- foreach ($tree as $data)
- {
- if (isset($data['children'])) {
- $pseudo_pkgs[$data['name']] = [$data['long_name'],
$data['disabled'], []];
- $children = &$pseudo_pkgs[$data['name']][2];
- $long_names = [];
- foreach ($data['children'] as $k => $v) {
- $long_names[$k] = strtolower($v['long_name']);
- }
- array_multisort($long_names, SORT_ASC, SORT_STRING,
$data['children']);
- foreach ($data['children'] as $child)
- {
- $pseudo_pkgs[$child['name']] =
["{$child['long_name']}", $child['disabled'], null];
- $children[] = $child['name'];
- }
-
- } elseif (!isset($pseudo_pkgs[$data['name']])) {
- $pseudo_pkgs[$data['name']] = [$data['long_name'],
$data['disabled'], null];
- }
- }
-
- return $pseudo_pkgs;
-}
-
/* Primitive check for SPAM. Add more later. */
function is_spam($string)
{
@@ -529,40 +460,6 @@ function show_limit_options($limit = 30)
}
/**
- * Prints bug project <option>'s for use in a <select>
- *
- * Options include "PHP" and "PECL".
- *
- * @param string $current bug's current project
- * @param bool $all whether or not 'All' should be an option
- *
- * @retun void
- */
-function show_project_options($current = 'php', $all = false)
-{
- global $project_types;
-
- if ($all) {
- if (!$current) {
- $current = 'All';
- }
- echo '<option value="All"';
- if ($current == 'All') {
- echo ' selected="selected"';
- }
- echo ">All</option>\n";
- } elseif (!$current) {
- $current = 'php';
- } else {
- $current = strtolower($current);
- }
-
- foreach ($project_types as $k => $v) {
- echo '<option value="', $k, '"', (($current == strtolower($k))
? ' selected="selected"' : ''), ">{$k}</option>\n";
- }
-}
-
-/**
* Prints bug type <option>'s for use in a <select>
*
* Options include "Bug", "Documentation Problem" and "Feature/Change Request."
diff --git a/include/query.php b/include/query.php
index 3e051a9..028f57a 100644
--- a/include/query.php
+++ b/include/query.php
@@ -1,5 +1,7 @@
<?php
+use App\Repository\PackageRepository;
+
$errors = [];
$warnings = [];
$order_options = [
@@ -20,7 +22,8 @@ $order_options = [
];
// Fetch pseudo packages
-$pseudo_pkgs = get_pseudo_packages(false);
+$packageRepository = new PackageRepository($dbh);
+$pseudo_pkgs = $packageRepository->findAll();
// Setup input variables..
$boolean_search = isset($_GET['boolean']) ? (int) $_GET['boolean'] : 0;
diff --git a/src/Database/Database.php b/src/Database/Database.php
index 37ae753..467f189 100644
--- a/src/Database/Database.php
+++ b/src/Database/Database.php
@@ -30,9 +30,4 @@ class Database extends \PDO
{
return substr($this->quote($text), 1, -1);
}
-
- public function queryAll($query, $types = null, $fetchmode = null, $rekey
= false, $force_array = false, $group = false)
- {
- return $this->query($query)->fetchAll();
- }
}
diff --git a/src/Repository/PackageRepository.php
b/src/Repository/PackageRepository.php
new file mode 100644
index 0000000..178a485
--- /dev/null
+++ b/src/Repository/PackageRepository.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace App\Repository;
+
+use App\Database\Database;
+
+/**
+ * Repository class for retrieving data from the bugdb_pseudo_packages database
+ * table.
+ */
+class PackageRepository
+{
+ /**
+ * Database handler.
+ * @var Database
+ */
+ private $dbh;
+
+ /**
+ * Project types.
+ */
+ public const PROJECTS = [
+ 'PHP' => 'php',
+ 'PECL' => 'pecl',
+ ];
+
+ /**
+ * Class constructor.
+ */
+ public function __construct(Database $dbh)
+ {
+ $this->dbh = $dbh;
+ }
+
+ /**
+ * Find all packages by project type.
+ */
+ public function findAll(string $project = ''): array
+ {
+ $sql = 'SELECT * FROM bugdb_pseudo_packages';
+ $arguments = [];
+
+ $project = strtolower($project);
+ if (in_array($project, self::PROJECTS)) {
+ $sql .= " WHERE project IN ('', ?)";
+ $arguments[] = $project;
+ }
+
+ $sql .= ' ORDER BY parent, disabled, id';
+
+ $data = $this->dbh->prepare($sql)->execute($arguments)->fetchAll();
+
+ return $this->getNested($data);
+ }
+
+ /**
+ * Find all enabled packages by project type.
+ */
+ public function findEnabled(string $project = ''): array
+ {
+ $sql = 'SELECT * FROM bugdb_pseudo_packages WHERE disabled = 0';
+ $arguments = [];
+
+ $project = strtolower($project);
+ if (in_array($project, self::PROJECTS)) {
+ $sql .= " AND project IN ('', ?)";
+ $arguments[] = $project;
+ }
+
+ $sql .= ' ORDER BY parent, id';
+
+ $data = $this->dbh->prepare($sql)->execute($arguments)->fetchAll();
+
+ return $this->getNested($data);
+ }
+
+ /**
+ * Convert flat array to nested structure.
+ */
+ private function getNested(array $data): array
+ {
+ $packages = [];
+ $nodes = [];
+ $tree = [];
+
+ foreach ($data as &$node) {
+ $node['children'] = [];
+ $id = $node['id'];
+ $parentId = $node['parent'];
+ $nodes[$id] =& $node;
+
+ if (array_key_exists($parentId, $nodes)) {
+ $nodes[$parentId]['children'][] =& $node;
+ } else {
+ $tree[] =& $node;
+ }
+ }
+
+ foreach ($tree as $data) {
+ if (isset($data['children'])) {
+ $packages[$data['name']] = [$data['long_name'],
$data['disabled'], []];
+ $children = &$packages[$data['name']][2];
+ $longNames = [];
+
+ foreach ($data['children'] as $k => $v) {
+ $longNames[$k] = strtolower($v['long_name']);
+ }
+
+ array_multisort($longNames, SORT_ASC, SORT_STRING,
$data['children']);
+
+ foreach ($data['children'] as $child) {
+ $packages[$child['name']] = ["{$child['long_name']}",
$child['disabled'], null];
+ $children[] = $child['name'];
+ }
+ } elseif (!isset($packages[$data['name']])) {
+ $packages[$data['name']] = [$data['long_name'],
$data['disabled'], null];
+ }
+ }
+
+ return $packages;
+ }
+}
diff --git a/www/bug.php b/www/bug.php
index bb87dc7..2dbb79c 100644
--- a/www/bug.php
+++ b/www/bug.php
@@ -2,6 +2,7 @@
/* User interface for viewing and editing bug details */
use App\Repository\ObsoletePatchRepository;
+use App\Repository\PackageRepository;
use App\Repository\PatchRepository;
use App\Utils\Captcha;
use App\Repository\PullRequestRepository;
@@ -182,7 +183,8 @@ $project = $bug['project'];
// Only fetch stuff when it's really needed
if ($edit && $edit < 3) {
- $pseudo_pkgs = get_pseudo_packages(false, false); // false == no
read-only packages included
+ $packageRepository = new PackageRepository($dbh);
+ $pseudo_pkgs = $packageRepository->findEnabled();
}
// Fetch RESOLVE_REASONS array
diff --git a/www/lstats.php b/www/lstats.php
index b0ccc9a..ff8cc20 100644
--- a/www/lstats.php
+++ b/www/lstats.php
@@ -1,5 +1,7 @@
<?php
+use App\Repository\PackageRepository;
+
require '../include/prepend.php';
function status_print ($status, $num, $width, $align = STR_PAD_LEFT)
@@ -44,8 +46,8 @@ if (!$phpver || ($phpver !== 5 && $phpver !== 7)) {
if (isset($_GET['per_category']))
{
- $project = !empty($_GET['project']) ? $_GET['project'] : false;
- $pseudo_pkgs = get_pseudo_packages($project);
+ $packageRepository = new PackageRepository($dbh);
+ $pseudo_pkgs = $packageRepository->findAll($_GET['project'] ?? '');
$totals = [];
foreach ($pseudo_pkgs as $category => $data) {
diff --git a/www/patch-display.php b/www/patch-display.php
index bcf82f5..1735b1c 100644
--- a/www/patch-display.php
+++ b/www/patch-display.php
@@ -54,8 +54,6 @@ if (!bugs_has_access($bug_id, $buginfo, $pw, $user_flags)) {
exit;
}
-$pseudo_pkgs = get_pseudo_packages(false);
-
if (isset($patch_name) && isset($revision)) {
if ($revision == 'latest') {
$revisions = $patchRepository->findRevisions($buginfo['id'],
$patch_name);
diff --git a/www/report.php b/www/report.php
index 9cd6414..4ff4869 100644
--- a/www/report.php
+++ b/www/report.php
@@ -1,5 +1,6 @@
<?php
+use App\Repository\PackageRepository;
use App\Utils\Captcha;
use App\Utils\PatchTracker;
use App\Utils\Uploader;
@@ -14,8 +15,8 @@ session_start();
$errors = [];
$ok_to_submit_report = false;
-$project = !empty($_GET['project']) ? $_GET['project'] : false;
-$pseudo_pkgs = get_pseudo_packages($project, false); // false == no read-only
packages included
+$packageRepository = new PackageRepository($dbh);
+$pseudo_pkgs = $packageRepository->findEnabled($_GET['project'] ?? '');
// Authenticate
bugs_authenticate($user, $pw, $logged_in, $user_flags);
@@ -277,10 +278,8 @@ REPORT;
$type = 'unknown';
}
- $project = !empty($_GET['project']) ? $_GET['project']
: false;
-
// provide shortcut URLS for "quick bug fixes"
- list($RESOLVE_REASONS, $FIX_VARIATIONS) =
get_resolve_reasons($project);
+ list($RESOLVE_REASONS, $FIX_VARIATIONS) =
get_resolve_reasons($_GET['project'] ?? false);
$dev_extra = '';
$maxkeysize = 0;
diff --git a/www/search.php b/www/search.php
index 2ae7571..d99f20e 100644
--- a/www/search.php
+++ b/www/search.php
@@ -1,5 +1,7 @@
<?php
+use App\Repository\PackageRepository;
+
// Start session
session_start();
@@ -256,7 +258,14 @@ display_bug_error($warnings, 'warnings', 'WARNING:');
<td style="white-space: nowrap">
<label for="bug_type">Return bugs with <b>project</b></label>
</td>
- <td><select id="project" name="project"><?php show_project_options($project,
true);?></select></td>
+ <td><select id="project" name="project">
+ <option value="All"<?php if ($project === ''): ?>
selected="selected"<?php endif;?>>All</option>
+
+ <?php foreach (PackageRepository::PROJECTS as $key => $value): ?>
+ <option value="<?= htmlspecialchars($key, ENT_QUOTES); ?>" <?php if
($project === strtolower($key)): ?> selected="selected"<?php endif; ?>><?=
htmlspecialchars($key, ENT_QUOTES); ?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
</tr>
</table>
diff --git a/www/stats.php b/www/stats.php
index 06c1d5f..8b161c4 100644
--- a/www/stats.php
+++ b/www/stats.php
@@ -35,7 +35,6 @@ $pkg_total = [];
$pkg_names = [];
$all = [];
$pseudo = true;
-$pseudo_pkgs = get_pseudo_packages($site);
if (!array_key_exists($sort_by, $titles)) {
$sort_by = 'Open';
--
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php