synergy/server/db/SpecificationDAO.php (622 lines of code) (raw):
<?php
namespace Synergy\DB;
use PDO;
use Synergy\App\Synergy;
use Synergy\Controller\Mediator;
use Synergy\Misc\Util;
use Synergy\Model\Specification;
use Synergy\Model\SpecificationAttachment;
use Synergy\Model\SpecificationsSimpleNameList;
use Synergy\Model\Suite;
use Synergy\Model\Project\Project;
use \Synergy\Controller\ProjectCtrl;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of SpecificationDAO
*
* @author vriha
*/
class SpecificationDAO {
/**
* Returns all specifications for version given by ID
* @param int $versionID version ID
* @return array
*/
public function getSpecifications($versionID, $userId = -1) {
DB_DAO::connectDatabase();
if ($userId < 0) {
$handler = DB_DAO::getDB()->prepare("SELECT specification.id, title, description, author_id, owner_id,GROUP_CONCAT( p.id SEPARATOR ';') AS pids, GROUP_CONCAT( p.name SEPARATOR ';') AS pnames FROM specification LEFT JOIN specification_has_project shp ON shp.specification_id = specification.id LEFT JOIN project p ON shp.project_id = p.id WHERE version_id=:version AND is_active=1 GROUP BY specification.id ORDER BY title ASC ");
} else {
$handler = DB_DAO::getDB()->prepare("SELECT s.id, title, description, author_id, owner_id, f.user_id, GROUP_CONCAT( p.id SEPARATOR ';' ) AS pids, GROUP_CONCAT( p.name SEPARATOR ';' ) AS pnames FROM specification s LEFT JOIN user_has_favorite f ON ( f.specification_id = s.id AND f.user_id =:uid ) LEFT JOIN specification_has_project shp ON shp.specification_id = s.id LEFT JOIN project p ON shp.project_id = p.id WHERE version_id =:version AND is_active =1 GROUP BY s.id ORDER BY title ASC");
}
$handler->bindParam(':version', $versionID);
if ($userId > 0)
$handler->bindParam(':uid', $userId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$sp = new Specification(intval($row['id']), $row['description'], $row['title'], $versionID, $row['author_id'], $row['owner_id']);
if ($userId > -1 && strval($row['user_id']) === strval($userId)) {
$sp->isFavorite = 1;
}
if (strlen($row["pids"]) > 0) {
$sp->ext["projects"] = array();
$pids = explode(";", $row["pids"]);
$pnames = explode(";", $row["pnames"]);
foreach ($pids as $index => $value) {
$sp->ext["projects"][] = new Project($value, $pnames[$index]);
}
}
array_push($data, $sp);
}
return $data;
}
public function getAllSpecifications($userId = -1) {
DB_DAO::connectDatabase();
if ($userId < 0) {
$handler = DB_DAO::getDB()->prepare("SELECT specification.id, title, description, author_id, owner_id, simpleName, version_id, v.version FROM specification, version v WHERE v.id=specification.version_id AND v.isObsolete=0 AND specification.is_active=1 ORDER BY title ASC");
} else {
$handler = DB_DAO::getDB()->prepare("SELECT s.id, title, description, author_id, owner_id,simpleName, f.user_id, version_id, v.version FROM specification s JOIN version v ON s.version_id=v.id LEFT JOIN user_has_favorite f ON (f.specification_id=s.id AND f.user_id=:uid) WHERE v.isObsolete=0 AND s.is_active=1 ORDER BY title ASC");
$handler->bindParam(':uid', $userId);
}
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$sp = new Specification(intval($row['id']), $row['description'], $row['title'], $row['version_id'], $row['author_id'], $row['owner_id']);
$sp->version = $row['version'];
$sp->simpleName = $row['simpleName'];
if ($userId > -1 && strval($row['user_id']) === strval($userId))
$sp->isFavorite = 1;
array_push($data, $sp);
}
return $data;
}
/**
* Returns favorite specification of given user
* @param String $username
* @return Specification[]
*/
public function getFavoriteSpecifications($username) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.author_id,v.version, s.version_id, s.owner_id FROM specification s, user_has_favorite f, user u, version v WHERE f.user_id=u.id AND u.username=:username AND f.specification_id=s.id AND s.is_active=1 AND s.version_id=v.id ORDER BY s.title ASC");
$handler->bindParam(':username', $username);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], $row['version_id'], $row['author_id'], $row['owner_id']);
$s->version = $row['version'];
$s->isFavorite = 1;
array_push($data, $s);
}
return $data;
}
/**
* Returns complete specification with test suites and attachments
* @param type $id
* @param String $label not required, if given, only cases with this label will be counted
* @return Specification|null
*/
public function getSpecification($id, $label = '', $userId) {// TODO owner
DB_DAO::connectDatabase();
// $handler = DB_DAO::getDB()->prepare("SELECT s.id, s.last_updated,s.simpleName, s.title, s.description, s.author_id,s.version_id, v.version, u.username, u.first_name, u.last_name, s.owner_id FROM specification s, version v, user u WHERE s.id=:id AND s.version_id=v.id AND u.id=s.author_id");
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.last_updated,s.simpleName, s.title, s.description, s.author_id,s.version_id, v.version, u.username, u.first_name, u.last_name, s.owner_id, f.user_id FROM specification s, version v, user u LEFT JOIN user_has_favorite f ON (f.specification_id=:id AND f.user_id=:ud) WHERE s.id=:sd AND s.is_active=1 AND s.version_id=v.id AND u.id=s.author_id");
$handler->bindParam(':id', $id);
$handler->bindParam(':sd', $id);
$handler->bindParam(':ud', $userId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], $row['version_id'], $row['author_id'], $row['owner_id']);
$s->author = $row['username'];
if (isset($row['user_id']) && !is_null($row['user_id'])) {
$s->isFavorite = 1;
}
$s->version = $row['version'];
$s->simpleName = $row['simpleName'];
$s->authorName = $row['first_name'] . " " . $row['last_name'];
$s->setLastUpdated($row['last_updated']);
return $s;
}
return null;
}
/**
* Returns all attachments for given specification
* @param type $id
* @return SpecificationAttachment[]
*/
public function getAttachments($id) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.path FROM specification_attachement s WHERE s.specification_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 SpecificationAttachment($row['path'], $row['id'], $id));
}
return $data;
}
/**
* Returns all test suites for given specification
* @param type $id
* @return Suite[]
*/
public function getTestSuites($id) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.product, s.component, s.order FROM suite s WHERE s.specification_id=:id ORDER BY s.order, s.id ASC");
$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 Suite($row['id'], $row['description'], $row['title'], $row['product'], $row['component'], $id, $row['order']));
}
return $data;
}
/**
* Returns sum of duration of all cases for given specification
* @param type $id
* @param String $label not required, if given, only cases with this label will be counted
* @return int
*/
public function getEstimatedTime($id, $label = '') {
DB_DAO::connectDatabase();
if (strlen($label) > 0) {
$handler = DB_DAO::getDB()->prepare("SELECT cs.duration, cs.duration_count FROM suite_has_case sc, suite s, `case` cs, case_has_keyword ck, keyword kw WHERE s.specification_id =:id AND sc.suite_id=s.id AND cs.id=sc.case_id AND kw.keyword=:label AND kw.id=ck.keyword_id AND ck.case_id=cs.id");
$handler->bindParam(':id', $id);
$handler->bindParam(':label', $label);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$estimatedTime = 0;
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$estimatedTime += round(intval($row['duration']) / intval($row['duration_count']));
}
return $estimatedTime;
} else {
$handler = DB_DAO::getDB()->prepare("SELECT cs.duration, cs.duration_count FROM suite_has_case sc, suite s, `case` cs WHERE s.specification_id =:id AND sc.suite_id=s.id AND cs.id=sc.case_id");
$handler->bindParam(':id', $id);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$estimatedTime = 0;
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$estimatedTime += round(intval($row['duration']) / intval($row['duration_count']));
}
return $estimatedTime;
}
}
/**
* Updates specification
* @param type $id
* @param type $title
* @param type $desc
* @return boolean
*/
public function updateSpecification($id, $title, $desc, $ownerId, $simpleName) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET last_updated=:lu, title=:title, description=:desc, owner_id=:o, simpleName=:simple WHERE id=:id ");
$handler->bindParam(':id', $id);
$handler->bindParam(':o', $ownerId);
date_default_timezone_set('UTC');
$localTime = date('Y-m-d H:i:s');
$handler->bindParam(':lu', $localTime);
$handler->bindValue(':title', Util::purifyHTML($title));
$handler->bindValue(':desc', Util::purifyHTML($desc));
$handler->bindValue(':simple', $simpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
Mediator::emit("specificationUpdated", $id);
return true;
}
public function deleteSpecification($id) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET is_active=0, simpleName='__deleted_specification__' WHERE id=:id ");
// $handler = DB_DAO::getDB()->prepare("DELETE FROM specification WHERE id=:id ");
$handler->bindParam(':id', $id);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
Mediator::emit("specificationDeleted", $id);
return true;
}
/**
* Returns array of IDs of suites that belongs to given specification
* @param type $spec_id
* @return array
*/
public function getSuitesIDs($spec_id) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT id FROM suite WHERE specification_id =:id");
$handler->bindParam(':id', $spec_id);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$ids = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
array_push($ids, intval($row['id']));
}
return $ids;
}
public function getSpecificationTitleIdBySuiteId($suiteId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.title, s.id, v.version FROM specification s, suite su, version v WHERE su.id=:id AND s.is_active=1 AND s.version_id=v.id AND su.specification_id = s.id");
$handler->bindParam(':id', $suiteId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
$data[0] = "";
$data[1] = "-1";
$data[2] = "";
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$data[0] = $row['title'];
$data[1] = intval($row['id']);
$data[2] = $row['version'];
}
return $data;
}
public function getSpecificationsByAuthor($username) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.author_id,v.version, s.version_id, s.owner_id FROM specification s, user u, version v WHERE s.author_id=u.id AND s.is_active=1 AND u.username=:username AND s.version_id=v.id");
$handler->bindParam(':username', $username);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], $row['version_id'], $row['author_id'], $row['owner_id']);
$s->version = $row['version'];
array_push($data, $s);
}
return $data;
}
public function getSpecificationsByOwner($username) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.author_id,v.version, s.version_id, s.owner_id FROM specification s, user u, version v WHERE s.owner_id=u.id AND s.is_active=1 AND u.username=:username AND s.version_id=v.id");
$handler->bindParam(':username', $username);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], intval($row['version_id']), $row['author_id'], $row['owner_id']);
$s->version = $row['version'];
array_push($data, $s);
}
return $data;
}
/**
* @return Specification[]
*/
public function getSpecificationsByOwnerAndVersion($username, $versionId, $projectId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.author_id,v.version, s.version_id, s.owner_id FROM (specification s, user u, version v) JOIN specification_has_project ON specification_has_project.specification_id=s.id WHERE specification_has_project.project_id=:projectId AND s.owner_id=u.id AND s.is_active=1 AND u.username=:username AND s.version_id=v.id AND v.id=:versionId GROUP BY s.id");
$handler->bindParam(':username', $username);
$handler->bindParam(':versionId', $versionId);
$handler->bindParam(':projectId', $projectId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], intval($row['version_id']), $row['author_id'], $row['owner_id']);
$s->version = $row['version'];
array_push($data, $s);
}
return $data;
}
public function createSpecification($title, $desc, $versionId, $userId, $ownerId, $simpleName) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("INSERT INTO specification (title, description, author_id, version_id, owner_id, last_updated, simpleName, is_active) VALUES (:t, :d, :a, :v, :o, :lu, :s, 1)");
$handler->bindParam(':v', $versionId);
date_default_timezone_set('UTC');
$localTime = date('Y-m-d H:i:s');
$handler->bindParam(':lu', $localTime);
$handler->bindParam(':a', $userId);
$handler->bindParam(':o', $ownerId);
$handler->bindValue(':t', Util::purifyHTML($title));
$handler->bindValue(':d', Util::purifyHTML($desc));
$handler->bindValue(':s', $simpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return -1;
}
$newid = DB_DAO::getDB()->lastInsertId();
Mediator::emit("specificationCreated", $newid);
return $newid;
}
public function cloneSpecificationAttachment($specification, $newSpecId) {
$att = "";
for ($i = 0, $max = count($specification->attachments); $i < $max; $i++) {
$att = $att . "INSERT INTO specification_attachement (path, specification_id) VALUES ('" . $specification->attachments[$i]->getPath() . "', " . $newSpecId . ");";
}
if (strlen($att) > 1) {
DB_DAO::executeQuery($att);
}
}
public function cloneSpecificationCases($cases, $newSuiteId) {
$sc = "";
for ($j = 0, $max = count($cases); $j < $max; $j++) {
$sc = $sc . "INSERT INTO suite_has_case (suite_id, case_id) VALUES (" . $newSuiteId . "," . $cases[$j] . ");";
}
if (strlen($sc) > 1) {
DB_DAO::executeQuery($sc);
}
}
public function findMatchingSpecifications($title, $limit = 15) {
DB_DAO::connectDatabase();
$title = strtolower($title);
$handler = DB_DAO::getDB()->prepare("SELECT specification.id,title, v.version, GROUP_CONCAT(project.name SEPARATOR ';') AS pnames, GROUP_CONCAT(project.id SEPARATOR ';') AS pids FROM (specification, version v) LEFT JOIN specification_has_project shp ON shp.specification_id=specification.id LEFT JOIN project ON project.id=shp.project_id WHERE LOWER(title) LIKE :t AND v.id=specification.version_id AND specification.is_active=1 GROUP BY specification.id ORDER BY title ASC LIMIT 0," . $limit);
$title = "%" . $title . "%";
$handler->bindParam(':t', $title, PDO::PARAM_STR);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$results = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification($row['id'], '', $row['title'], -1, -1, -1);
$s->version = $row['version'];
$s->setProjects($row["pids"], $row["pnames"]);
array_push($results, $s);
}
return $results;
}
/**
* Returns number of all cases for given specification
* @param type $id
* @param type $labelId if greater than 0, then only cases with this label will be counted
* @return int
*/
public static function getCasesCount($id, $labelId = 0) {
if ($labelId < 1) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT COUNT(c.case_id) as cid FROM suite s,suite_has_case c WHERE s.specification_id=:id AND s.id=c.suite_id");
$handler->bindValue(':id', intval($id));
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return $row['cid'];
}
} else {
DB_DAO::connectDatabase();
// $handler = DB_DAO::getDB()->prepare("SELECT COUNT(c.case_id) as cid FROM suite s,suite_has_case c WHERE s.specification_id=:id AND s.id=c.suite_id");
$handler = DB_DAO::getDB()->prepare("SELECT COUNT(c.id) as cid FROM (`case` c, case_has_keyword ck, keyword k) JOIN (suite s, suite_has_case sc, specification sp) ON (sc.suite_id=s.id AND sc.case_id=c.id AND sp.id=s.specification_id) WHERE ck.case_id=c.id AND ck.keyword_id=k.id AND k.id=:lid AND sp.id=:id");
$handler->bindValue(':id', intval($id));
$handler->bindValue(':lid', intval($labelId));
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return $row['cid'];
}
}
return 0;
}
/**
* Returns $limit latest specfications. Age of specification is derived from ID (auto increment in DB)
* @param type $limit
* @return array
*/
public function getLatestSpecifications($limit) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT specification.id, title, description, author_id, owner_id, simpleName, v.version FROM specification, version v WHERE version_id=v.id AND specification.is_active=1 ORDER BY specification.id DESC LIMIT " . intval($limit));
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$sp = new Specification(intval($row['id']), $row['description'], $row['title'], -1, $row['author_id'], $row['owner_id']);
$sp->simpleName = $row['simpleName'];
$sp->version = $row['version'];
array_push($data, $sp);
}
return $data;
}
/**
* Quazi removes authorship. Because DB constraints have to correct, current user is set as auhtor
* @param type $userId
*/
public function deleteAuthorship($userId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET author_id=:nid WHERE author_id=:id ");
$handler->bindParam(':id', $userId);
$handler->bindValue(':nid', Synergy::getSessionProvider()->getUserId());
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
return true;
}
/**
* Quazi removes ownership. Because DB constraints have to correct, current user is set as owner
* @param type $userId
*/
public function deleteOwnership($userId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET owner_id=:nid WHERE owner_id=:id ");
$handler->bindParam(':id', $userId);
$handler->bindValue(':nid', Synergy::getSessionProvider()->getUserId());
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
return true;
}
/**
* Returns total number of
* @return int
*/
public function getSpecificationsCount() {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT count(id) as id FROM specification WHERE is_active=1");
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return intval($row['id']);
}
return 0;
}
public function setLastUpdatedDate($date, $specificationId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET last_updated=:d WHERE id=:i ");
$handler->bindParam(':i', $specificationId);
$handler->bindValue(':d', $date);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
return true;
}
public function setAuthorship($userId, $specificationId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET author_id=:d WHERE id=:i ");
$handler->bindParam(':i', $specificationId);
$handler->bindValue(':d', $userId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
return true;
}
public function getSpecificationAlias($simpleName, $versionID) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.last_updated,s.title, s.description, s.author_id,s.version_id, v.version, u.username, u.first_name, u.last_name, s.owner_id FROM specification s, version v, user u WHERE s.simpleName=:simple AND s.version_id=:vid AND s.version_id=v.id AND u.id=s.author_id AND s.is_active=1 ORDER BY v.version DESC");
$handler->bindParam(':simple', $simpleName);
$handler->bindParam(':vid', $versionID);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], intval($row['version_id']), $row['author_id'], $row['owner_id']);
$s->author = $row['username'];
$s->version = $row['version'];
$s->simpleName = $simpleName;
$s->authorName = $row['first_name'] . " " . $row['last_name'];
$s->setLastUpdated($row['last_updated']);
return $s;
}
return null;
}
public function getSpecificationVersionID($specificationID) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.version_id FROM specification s WHERE s.id=:s");
$handler->bindParam(':s', $specificationID);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return intval($row['version_id']);
}
return -1;
}
public function findMatchingSpecification($specificationID, $simpleName, $versionID) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id FROM specification s WHERE s.id!=:s AND s.version_id=:v AND s.is_active=1 AND s.simpleName=:n");
$handler->bindParam(':s', $specificationID);
$handler->bindParam(':v', $versionID);
$handler->bindParam(':n', $simpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return intval($row['id']);
}
return -1;
}
public function findSimilar($simpleName, $excludedId) {
DB_DAO::connectDatabase();
$simpleName = strtolower($simpleName);
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, v.version FROM specification s, version v WHERE LOWER(s.simpleName)=:s AND s.version_id=v.id AND s.id!=:e AND s.is_active=1 ORDER BY v.version DESC");
$handler->bindParam(':s', $simpleName);
$handler->bindParam(':e', $excludedId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification($row['id'], '', $row['title'], -1, -1, -1);
$s->version = $row['version'];
array_push($data, $s);
}
return $data;
}
public function setSimpleName($id, $title) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET simpleName=:d WHERE id=:i ");
$handler->bindParam(':i', $id);
$handler->bindValue(':d', $title);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
return false;
}
return true;
}
public function getAllSpecificationsGroupedBySimpleName() {
DB_DAO::connectDatabase();
$simpleName = strtolower($simpleName);
$handler = DB_DAO::getDB()->prepare("SELECT s.simpleName as simple, GROUP_CONCAT(u.username SEPARATOR ';') as owners, GROUP_CONCAT(u.role SEPARATOR ';') as roles,GROUP_CONCAT(s.id SEPARATOR ';') as ids, GROUP_CONCAT(s.title SEPARATOR ';') as titles, GROUP_CONCAT(v.version SEPARATOR ';') as versions FROM specification s, version v, user u WHERE v.isObsolete=0 AND s.version_id=v.id AND s.is_active=1 AND LENGTH(s.simpleName) >0 AND u.id=s.owner_id GROUP BY s.simpleName ORDER BY s.simpleName ASC");
$handler->bindParam(':s', $simpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$latestSpecs = array();
$dataAssoc = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$c = new SpecificationsSimpleNameList($row['simple']);
$c->populate($row['ids'], $row['titles'], $row['versions'], $row['owners'], $row['roles']);
$dataAssoc["id" . $c->getLatestId()] = $c;
$latestSpecs[] = $c->getLatestId();
}
$projectCtrl = new ProjectCtrl();
$projects = $projectCtrl->getProjectsForSpecifications($latestSpecs);
foreach ($dataAssoc as $group) {
if (array_key_exists("id" . $group->getLatestId(), $projects)) {
$group->projects = $projects["id" . $group->getLatestId()];
}
}
return array_values($dataAssoc);
}
public function updateSimpleNames($oldSipleName, $newSimpleName) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("UPDATE specification SET simpleName=:d WHERE simpleName=:i ");
$handler->bindParam(':i', $oldSipleName);
$handler->bindValue(':d', $newSimpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
}
public function isUniqueSimpleName($newSimpleName) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT id FROM specification s WHERE simpleName=:s LIMIT 0,1");
$handler->bindParam(':s', $newSimpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return false;
}
return true;
}
public function getSpecificationAliasLatest($simpleName) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.last_updated,s.title, s.description, s.author_id,s.version_id, v.version, u.username, u.first_name, u.last_name, s.owner_id FROM specification s, version v, user u WHERE s.simpleName=:simple AND s.version_id=v.id AND s.is_active=1 AND u.id=s.author_id ORDER BY v.version DESC LIMIT 0,1");
$handler->bindParam(':simple', $simpleName);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification(intval($row['id']), $row['description'], $row['title'], intval($row['version_id']), $row['author_id'], $row['owner_id']);
$s->author = $row['username'];
$s->version = $row['version'];
$s->simpleName = $simpleName;
$s->authorName = $row['first_name'] . " " . $row['last_name'];
$s->setLastUpdated($row['last_updated']);
return $s;
}
return null;
}
public function isSpecificationFavorite($specificationId, $userId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id FROM specification s, user_has_favorite u WHERE u.user_id=:user AND u.specification_id=:spec LIMIT 0,1");
$handler->bindParam(':spec', $specificationId);
$handler->bindParam(':user', $userId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return 1;
}
return 0;
}
public function isSpecificationUsed($specificationId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id FROM specification s, assignment_progress p, test_assignement t WHERE s.id=:id AND s.id=t.specification_id AND t.id=p.test_assignement_id LIMIT 0,1");
$handler->bindParam(':id', $specificationId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return 1;
}
return 0;
}
public function getOwnerId($specificationId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT owner_id FROM specification WHERE id=:id");
$handler->bindParam(':id', $specificationId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
return intval($row["owner_id"]);
}
return -1;
}
public function getSpecificationOverview($specificationId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT u.username, s.title, s.id, u.id AS uid FROM specification s LEFT JOIN user u ON u.id=s.owner_id WHERE s.id=:id ");
$handler->bindParam(':id', $specificationId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$s = new Specification($row["id"], "", $row["title"], "", "", "");
$s->owner = $row["username"];
$s->ownerId = intval($row["uid"]);
return $s;
}
return null;
}
public function getSpecificationsForProject($projectId) {
DB_DAO::connectDatabase();
$handler = DB_DAO::getDB()->prepare("SELECT s.id, s.title, s.description, s.author_id, s.owner_id, s.simpleName, s.version_id, v.version FROM specification s, version v, specification_has_project shp WHERE shp.specification_id=s.id AND shp.project_id=:p AND v.id=s.version_id AND v.isObsolete=0 AND s.is_active=1 GROUP BY s.id ORDER BY s.title ASC");
$handler->bindParam(':p', $projectId);
if (!$handler->execute()) {
DB_DAO::throwDbError($handler->errorInfo());
}
$data = array();
while ($row = $handler->fetch(PDO::FETCH_ASSOC)) {
$sp = new Specification(intval($row['id']), $row['description'], $row['title'], $row['version_id'], $row['author_id'], $row['owner_id']);
$sp->version = $row['version'];
$sp->simpleName = $row['simpleName'];
array_push($data, $sp);
}
return $data;
}
}
?>