synergy/server/db/CaseDAO.php (473 lines of code) (raw):

<?php namespace Synergy\DB; use PDO; use Synergy\Controller\Mediator; use Synergy\Misc\Util; use Synergy\Model\Bug; use Synergy\Model\Label; use Synergy\Model\LabelResult; use Synergy\Model\TestCase; use Synergy\Model\TestCaseImage; /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * Description of CaseDAO * * @author lada */ class CaseDAO { public function getCaseForSuite($id, $suiteId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT c.id, c.order, c.duration_count, c.duration, c.title,c.steps, c.result, GROUP_CONCAT(k.keyword SEPARATOR '|') as keywords FROM (`case` c, suite_has_case sc) LEFT JOIN (case_has_keyword ck, keyword k) ON (ck.case_id = c.id AND k.id=ck.keyword_id) WHERE c.id=:id AND c.id=sc.case_id AND sc.suite_id=:sid GROUP BY c.id"); $handler->bindParam(':id', $id); $handler->bindParam(':sid', $suiteId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $duration = round(intval($row['duration']) / intval($row['duration_count'])); $t = new TestCase($row['title'], $duration, $row['id'], $row['order']); $t->setKeywords($row['keywords'], '|'); $t->steps = $row['steps']; $t->result = $row['result']; $t->url = BASER_URL . "case.php?id=" . $id . "&suite=" . $suiteId; return $t; } return null; } public function getCase($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT c.id, c.duration_count, c.duration,c.order, c.title,c.steps, c.result, GROUP_CONCAT(k.keyword SEPARATOR '|') as keywords FROM (`case` c) LEFT JOIN (case_has_keyword ck, keyword k) ON (ck.case_id = c.id AND k.id=ck.keyword_id) WHERE c.id=:id GROUP BY c.id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $duration = round(intval($row['duration']) / intval($row['duration_count'])); $t = new TestCase($row['title'], $duration, $row['id'], $row['order']); $t->setKeywords($row['keywords'], '|'); $t->steps = $row['steps']; $t->result = $row['result']; $t->url = BASER_URL . "case.php?id=" . $id . "&suite=-1"; return $t; } return null; } public function getIssues($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT id, bug_id FROM bug WHERE case_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($data, new Bug($row['id'], $row['bug_id'])); } return $data; } public function getCasesByFilter($label, $page) { $start = intval((($page - 1) * LABEL_PAGE)); $stop = intval((LABEL_PAGE)); DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT c.title, c.id, k.keyword, s.title as stitle, s.id as sid, v.id as vid, v.version FROM (`case` c, case_has_keyword ck, keyword k) JOIN (suite s, suite_has_case sc, specification sp, version v) ON (sc.suite_id=s.id AND sc.case_id=c.id AND sp.id=s.specification_id AND v.id=sp.version_id) WHERE ck.case_id=c.id AND ck.keyword_id=k.id AND k.keyword=:label ORDER BY c.title ASC LIMIT " . $start . "," . $stop); $handler->bindParam(':label', $label); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = new LabelResult($page, $label); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $t = new TestCase($row['title'], 0, $row['id'], $row['vid']); $t->version = $row['version']; $t->suiteTitle = $row['stitle']; $t->suiteId = intval($row['sid']); array_push($data->cases, $t); } if (count($data->cases) < LABEL_PAGE) { $data->nextUrl = ""; } return $data; } /** * Add issues to case - if issue is already recorded, nothing happens * @param int $bugId * @param int $caseId * @return boolean true if success */ public function addIssue($bugId, $caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT bug_id FROM bug WHERE bug_id=:bid AND case_id=:cid"); $handler->bindValue(':bid', Util::purifyHTML($bugId)); $handler->bindParam(':cid', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return false; } DB_DAO::connectDatabase(); $handler2 = DB_DAO::getDB()->prepare("INSERT INTO bug (bug_id, case_id) VALUES (:bid, :cid)"); $handler2->bindParam(':bid', Util::purifyHTML($bugId)); $handler2->bindParam(':cid', $caseId); if (!$handler2->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("issueAddedToCase", array("caseId" => $caseId, "bugId" => $bugId)); return true; } /** * Removes issue from case * @param int $bugId * @param int $caseId * @return boolean true if success */ public function removeIssue($bugId, $caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM bug WHERE (bug_id=:bid OR bug_id='no-number') AND case_id=:cid"); $handler->bindParam(':bid', Util::purifyHTML($bugId)); $handler->bindParam(':cid', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("issueRemovedFromCase", array("caseId" => $caseId, "bugId" => $bugId)); return true; } public function addLabel($label, $caseId, $kid) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO case_has_keyword (keyword_id, case_id) VALUES (:kid, :cid)"); $handler->bindParam(':kid', $kid); $handler->bindParam(':cid', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("labelAddedToCase", array("caseId" => $caseId, "label" => $label)); return true; } public function getKeywordId($label) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT id FROM keyword WHERE keyword=:k"); $handler->bindParam(':k', $label); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row['id']); } return -1; } public function createKeyword($label) { DB_DAO::connectDatabase(); $handler2 = DB_DAO::getDB()->prepare("INSERT INTO keyword (keyword) VALUES (:k)"); $handler2->bindValue(':k', Util::purifyHTML($label)); if (!$handler2->execute()) { DB_DAO::throwDbError($handler2->errorInfo()); } return intval(DB_DAO::getDB()->lastInsertId()); } /** * Removes keyword from case * @param type $label * @param type $caseId * @return boolean true if successful */ public function removelabel($label, $caseId, $kid) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM case_has_keyword WHERE case_id=:cid AND keyword_id=:kid"); $handler->bindParam(':kid', $kid); $handler->bindParam(':cid', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("labelRemovedFromCase", array("caseId" => $caseId, "label" => $label)); return true; } /** * Creates new case and add it to given suite * @param type $parentSuiteId * @param type $title * @param type $steps * @param type $result * @param type $duration * @return boolean */ public function createCase($title, $steps, $result, $duration, $order) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO `case` (duration, title, steps, result,`order`) VALUES (:d, :t, :s, :r,:o)"); $handler->bindParam(':d', $duration); $handler->bindValue(':t', Util::purifyHTML($title)); $handler->bindValue(':s', Util::purifyHTML($steps)); $handler->bindValue(':r', Util::purifyHTML($result)); $handler->bindValue(':o', $order); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $caseId = DB_DAO::getDB()->lastInsertId(); return intval($caseId); } public function createDuplicitCase($title, $steps, $result, $duration, $order) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO `case` (duration, title, steps, result,`order`) VALUES (:d, :t, :s, :r,:o)"); $handler->bindParam(':d', $duration); $handler->bindValue(':t', Util::purifyHTML($title)); $handler->bindValue(':s', Util::purifyHTML($steps)); $handler->bindValue(':r', Util::purifyHTML($result)); $handler->bindValue(':o', $order); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $caseId = DB_DAO::getDB()->lastInsertId(); return intval($caseId); } /** * Removes case from suite * @param int $suiteId * @param int $caseId * @return boolean true if success */ public function removeCaseFromSuite($suiteId, $caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM suite_has_case WHERE case_id=:cid AND suite_id=:sid"); $handler->bindParam(':cid', $caseId); $handler->bindParam(':sid', $suiteId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("caseRemovedFromSuite", array("caseId" => $caseId, "suiteId" => $suiteId)); return true; } /** * Returns cases (up to 25) that match given criteria * @param type $_REQUEST * @return Case[] array of cases, each instance has defined only ID and title */ public function findMatchingCases($title) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT title, id FROM `case` WHERE title LIKE :title ORDER BY title ASC LIMIT 0,25"); $title = "%" . $title . "%"; $handler->bindParam(':title', $title, PDO::PARAM_STR); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $results = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($results, new TestCase($row['title'], -1, $row['id'], -1)); } return $results; } /** * Edit case but does not change duration * @return boolean */ public function edit($id, $title, $steps, $result, $order) { DB_DAO::connectDatabase(); if (is_null($order)) { $handler = DB_DAO::getDB()->prepare("UPDATE `case` SET title=:title, steps=:steps, result=:res WHERE id=:id "); } else { $handler = DB_DAO::getDB()->prepare("UPDATE `case` SET title=:title, steps=:steps, result=:res,`order`=:or WHERE id=:id "); $handler->bindValue(':or', $order); } $handler->bindParam(':id', $id); $handler->bindValue(':title', Util::purifyHTML($title)); $handler->bindValue(':steps', Util::purifyHTML($steps)); $handler->bindValue(':res', Util::purifyHTML($result)); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); return false; } Mediator::emit("caseUpdated", $id); return true; } /** * Edits case with duration and sets duration count to 1 * @return boolean */ public function editWithDuration($id, $title, $steps, $result, $duration, $order) { DB_DAO::connectDatabase(); if(is_null($order)){ $handler = DB_DAO::getDB()->prepare("UPDATE `case` SET title=:title, steps=:steps, result=:res, duration=:dur, duration_count=1 WHERE id=:id "); }else{ $handler = DB_DAO::getDB()->prepare("UPDATE `case` SET title=:title, steps=:steps, result=:res, duration=:dur, `order`=:or, duration_count=1 WHERE id=:id "); $handler->bindValue(':or', $order); } $handler->bindParam(':id', $id); $handler->bindValue(':title', Util::purifyHTML($title)); $handler->bindValue(':steps', Util::purifyHTML($steps)); $handler->bindValue(':res', Util::purifyHTML($result)); $handler->bindValue(':dur', intval($duration)); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); return false; } Mediator::emit("caseUpdated", $id); return true; } public function cloneLabels($id, $newId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT keyword_id FROM case_has_keyword WHERE case_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $insertQuery = ""; while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $insertQuery = $insertQuery . "INSERT INTO case_has_keyword (case_id, keyword_id) VALUES (" . intval($newId) . ", " . $row['keyword_id'] . ");"; } return $insertQuery; } public function cloneIssues($id, $newId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT bug_id FROM bug WHERE case_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $insertQuery = ""; while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $insertQuery = $insertQuery . "INSERT INTO bug (case_id, bug_id) VALUES (" . intval($newId) . ", '" . $row['bug_id'] . "');"; } return $insertQuery; } /** * Returns cases ID and duration where $c_id is SQL "OR" statement for id * @param type $c_id * @return TestCase[] */ public function getCasesDuration($c_id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT id, duration, duration_count FROM `case` WHERE " . $c_id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $cases = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $d = round(intval($row['duration']) / intval($row['duration_count'])); array_push($cases, new TestCase('', $d, $row['id'])); } return $cases; } /** * Updates duration of given test case * @param type $caseId * @param int $duration Duration in minutes * @return boolean */ public function updateDuration($id, $duration) { DB_DAO::connectDatabase(); if ($duration < 1) { // do not allow less then 1 minute $duration = 1; } $handler = DB_DAO::getDB()->prepare("UPDATE `case` SET duration=duration+" . $duration . ", duration_count=duration_count+1 WHERE id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); return false; } return true; } /** * Saves record about case's image to db * @param type $id case id * @param type $name image name * @param type $title image title * @return int new image ID */ public function saveImage($id, $name, $title) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO case_image (case_id, path, title) VALUES (:id, :name, :title)"); $handler->bindParam(':id', $id); $path = IMAGE_PATH . $name; $handler->bindParam(':name', $path); $handler->bindValue(':title', Util::purifyHTML($title)); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $newId = DB_DAO::getDB()->lastInsertId(); Mediator::emit("imageCreated", $newId); return intval($newId); } public function deleteImage($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM case_image WHERE id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("imageDeleted", $id); } public function getImageAttachment($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT path FROM case_image WHERE id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return $row['path']; } return ""; } /** * Returns all images for given test case * @param type $id */ public function getImages($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT path, title, id FROM case_image WHERE case_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($data, new TestCaseImage($row['path'], $row['id'], $id, $row['title'])); } return $data; } /** * Returns total number of cases * @return int */ public function getCasesCount() { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT count(id) as id FROM `case`"); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row['id']); } return 0; } public function getUnusedCases() { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT c.id FROM `case` c LEFT JOIN `suite_has_case` s ON s.case_id = c.id WHERE s.case_id IS NULL"); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $results = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($results, intval($row['id'])); } return $results; } public function removeIssuesForCase($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM bug WHERE case_id=:id "); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function removeLabelsForCase($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM case_has_keyword WHERE case_id=:id "); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function removeCase($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM `case` WHERE id=:id "); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function cloneImages($id, $newId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT path, title FROM case_image WHERE case_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { DB_DAO::executeQuery("INSERT INTO case_image (case_id, title, path) VALUES (" . intval($newId) . ", '" . $row['title'] . "', '" . $row['path'] . "');"); } } public function getSpecificationsIdForCase($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT DISTINCT s.specification_id as spec FROM `suite_has_case` c, suite s WHERE c.case_id=:id AND c.suite_id=s.id"); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $results = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($results, intval($row['spec'])); } return $results; } public function getLabels($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT keyword_id FROM case_has_keyword WHERE case_id=:id"); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($data, new Label('', $row['keyword_id'])); } return $data; } public function isCaseInUsedSpecification($caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.specification_id FROM assignment_progress a , suite u, suite_has_case h, test_assignement e WHERE h.suite_id=u.id AND h.case_id=:id AND a.test_assignement_id=e.id AND u.specification_id=e.specification_id LIMIT 0,1"); $handler->bindParam(':id', $caseId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; } return false; } public function caseHasLabel($labelId, $caseId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT c.case_id FROM `case_has_keyword` c WHERE c.case_id=:id AND c.keyword_id=:ld LIMIT 0,1"); $handler->bindParam(':id', $caseId); $handler->bindParam(':ld', $labelId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; } return false; } public function usedInCasesCount($path) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT COUNT(id) as totalUsed FROM `case_image` WHERE path=:p"); $handler->bindParam(':p', $path); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row["totalUsed"]); } return 0; } } ?>