DBal migration completed #6 and #4 repaired

This commit is contained in:
José Luis Garrido Labrador
2018-10-11 15:39:11 +02:00
parent dffbaacfbd
commit be6caf9702
16 changed files with 771 additions and 1840 deletions

View File

@@ -10,57 +10,41 @@ class DB
/**
* @var bool connection with database
*/
public $conn;
private $conn;
/**
* DB constructor
*/
function __construct()
function __construct($db)
{
$this->conn = Config::getDBConexion();
$this->conn = $db;
$this->createTable();
}
/**
* Close the connection
*/
public function close()
{
dbw_close($this->conn);
/*Base methods*/
public function newQueryBuilder(){
$queryBuilder = new \Doctrine\DBAL\Query\QueryBuilder($this->conn);
return $queryBuilder;
}
/**
* Get the first array of a query result
*
* @param $query sql query
* @return array array
*/
private function getQuery($query)
{
return dbw_fetch_array($this->conn, dbw_query($this->conn, $query));
public function execute($queryBuilder){
$query = $queryBuilder->execute();
return $query;
}
/**
* Get the total of codes in database
*
* @return int total of codes
*/
private function numOfCodes()
{
return $this->getQuery("SELECT COUNT(*) FROM Sources")[0];
public function getData($queryBuilder){
return $this->execute($queryBuilder)->fetchAll();
}
/*End methods*/
/**
* Create table if not exist in deploy (Database must be exist).
*/
private function createTable()
{
$query = "SET NAMES utf8; SET time_zone = '+00:00'; CREATE TABLE IF NOT EXISTS `Users`( `IDU` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(64) NOT NULL, `pass` varchar(64) NOT NULL, `nick` varchar(40) NOT NULL, `token` varchar(50) DEFAULT NULL, `ROLE` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`IDU`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `Codes` ( `IDC` int(11) NOT NULL AUTO_INCREMENT, `UserCreator` int(11) NOT NULL, `Name` varchar(80) NOT NULL, `Description` text NOT NULL, `Input` text NOT NULL, `Output` text NOT NULL, PRIMARY KEY (`IDC`), KEY `UserCreator` (`UserCreator`), CONSTRAINT `Codes_ibfk_1` FOREIGN KEY (`UserCreator`) REFERENCES `Users` (`IDU`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `Sources` ( `IDC` int(11) NOT NULL, `IDU` int(11) NOT NULL, `Lang` varchar(15) NOT NULL, `Version` int(11) NOT NULL, `Modification` int(11) NOT NULL, `Code` text NOT NULL, `UseExtLib` text, `UseExtLibVer` varchar(55) DEFAULT NULL, PRIMARY KEY (`IDC`,`Lang`,`Version`), KEY `IDU` (`IDU`), CONSTRAINT `Sources_ibfk_1` FOREIGN KEY (`IDU`) REFERENCES `Users` (`IDU`), CONSTRAINT `Sources_ibfk_2` FOREIGN KEY (`IDC`) REFERENCES `Codes` (`IDC`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8";
$query = explode(";",$query);
foreach ($query as $queryPart){
dbw_query($this->conn,$queryPart);
}
//dbw_multi_query($this->conn, $query);
/*TODO*/
}
/*
@@ -77,8 +61,16 @@ class DB
*/
public function loadOriginalAuthor($IDC)
{
$query = "SELECT UserCreator FROM Codes WHERE IDC='$IDC'";
return $this->getQuery($query)[0];
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('UserCreator')
->from('Codes')
->where($queryBuilder->expr()->eq(
'IDC','?'
))
->setParameter(0,$IDC);
return $this->getData($queryBuilder)[0];
}
/**
@@ -91,9 +83,29 @@ class DB
*/
public function loadAll($id, $lang, $version)
{
$query = "SELECT * FROM Users NATURAL JOIN Sources NATURAL JOIN Codes WHERE IDC=$id AND Lang='$lang' AND Version=$version";
$code = $this->getQuery($query);
return $code;
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('*')
->from('Users','u')
->join('u','Sources','s',
$queryBuilder->expr()->eq(
'u.IDU','s.IDU'
))
->join('s','Codes','c',
$queryBuilder->expr()->eq(
's.IDC','c.IDC'
))
->where($queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('c.IDC','?'),
$queryBuilder->expr()->eq('s.Lang','?'),
$queryBuilder->expr()->eq('s.Version','?')
))
->setParameter(0,$id)
->setParameter(1,$lang)
->setParameter(2,$version);
$data = $this->getData($queryBuilder)[0];
return $data;
}
/**
@@ -103,11 +115,40 @@ class DB
*/
public function loadLast($page = 0)
{
$page=$page*10;
$query = "SELECT IDC,Name,nick,Lang,Description,Code,Version FROM Users NATURAL JOIN Sources as S NATURAL JOIN Codes WHERE Version = (SELECT MAX(Version) FROM Sources WHERE S.Lang = Lang AND S.IDC = IDC) ORDER BY Modification DESC LIMIT $page, 10";
//echo $query;
$code = dbw_query($this->conn, $query);
return $code;
$each=10;
$page=$page*$each;
$queryBuilder = $this->newQueryBuilder();
$subQuery = $this->newQueryBuilder();
$queryBuilder
->select("c.IDC","Name","nick","Lang","Description","Code","Version")
->from('Users','u')
->join('u','Sources','s',
$queryBuilder->expr()->eq(
'u.IDU','s.IDU'
))
->join('s','Codes','c',
$queryBuilder->expr()->eq(
's.IDC','c.IDC'
))
->where(
$queryBuilder->expr()->eq(
's.Version','('.
$subQuery
->select('MAX(Version)')
->from('Sources')
->where(
$subQuery->expr()->andX(
$subQuery->expr()->eq('s.Lang','Lang'),
$subQuery->expr()->eq('s.IDC','IDC')
))
->getSql()
.')'
))
->orderBy('Modification','DESC')
->setFirstResult($page)
->setMaxResults(10);
return $this->execute($queryBuilder);
}
/**
@@ -119,8 +160,22 @@ class DB
*/
public function loadOtherVersion($id, $lang)
{
$query = "SELECT * FROM Users NATURAL JOIN Sources NATURAL JOIN Codes WHERE IDC='$id' AND Lang='$lang' ORDER BY Version ASC";
return dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('*')
->from('Users','u')
->join('u','Sources','s',
$queryBuilder->expr()->eq('u.IDU','s.IDU'))
->join('s','Codes','c',
$queryBuilder->expr()->eq('s.IDC','c.IDC'))
->where($queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('c.IDC','?'),
$queryBuilder->expr()->eq('s.Lang','?')
))
->orderBy('Version','ASC')
->setParameter(0,$id)
->setParameter(1,$lang);
return $this->execute($queryBuilder);
}
/**
@@ -132,10 +187,26 @@ class DB
*/
public function loadDiff($id, $lang)
{
$lang=dbw_escape_string($this->conn,$lang);
$query = "SELECT Lang,Code,Version FROM Sources WHERE IDC=$id AND Lang<>'$lang' AND Version = (SELECT MAX(Version) FROM Sources WHERE IDC=$id AND Lang='$lang')";
$code = dbw_query($this->conn, $query);
return $code;
$queryBuilder = $this->newQueryBuilder();
$subQueryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('s.Lang','s.Code','s.Version')
->from('Sources','s')
->where($queryBuilder->expr()->andX(
$queryBuilder->expr()->neq('s.Lang','?'),
$queryBuilder->expr()->eq('s.IDC','?'),
$queryBuilder->expr()->eq('s.Version','('.
$subQueryBuilder
->select('MAX(su.Version)')
->from('Sources','su')
->where($subQueryBuilder->expr()->andX(
$queryBuilder->expr()->eq('su.IDC','?'),
$queryBuilder->expr()->eq('su.Lang','?')
))->getSQL().')'
)
))
->setParameters(array($lang,$id,$id,$lang));
return $this->getData($queryBuilder);
}
/**
@@ -146,10 +217,15 @@ class DB
*/
public function loadLangs($IDC)
{
$query = "SELECT DISTINCT Lang FROM Sources WHERE IDC='$IDC'";
$toFetch = dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('DISTINCT Lang')
->from('Sources')
->where($queryBuilder->expr()->eq('IDC','?'))
->setParameter(0,$IDC);
$query = $this->getData($queryBuilder);
$toReturn = array();
while ($var = dbw_fetch_array($this->conn, $toFetch)) {
foreach ($query as $var) {
array_push($toReturn, $var["Lang"]);
}
return $toReturn;
@@ -164,8 +240,17 @@ class DB
*/
public function getLastVersion($IDC, $lang)
{
$query = "SELECT MAX(Version) FROM Sources WHERE IDC='$IDC' AND Lang='$lang'";
return $this->getQuery($query)[0];
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('MAX(Version)')
->from('Sources')
->where($queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('IDC','?'),
$queryBuilder->expr()->eq('Lang','?')
))
->setParameter(0,$IDC)
->setParameter(1,$lang);
return $this->getData($queryBuilder)[0]['MAX(Version)'];
}
/**
@@ -175,8 +260,13 @@ class DB
*/
public function getLastIDC($name)
{
$query = "SELECT MAX(IDC) FROM Codes WHERE name='$name'";
return $this->getQuery($query)[0];
$queryBuiler = $this->newQueryBuilder();
$queryBuiler
->select('MAX(IDC)')
->from('Codes')
->where($queryBuiler->expr()->eq('name','?'))
->setParameter(0,$name);
return $this->getData($queryBuiler)[0]['MAX(IDC)'];
}
/**
@@ -187,8 +277,13 @@ class DB
*/
public function loadCode($idc)
{
$query = "SELECT * FROM Codes WHERE IDC=" . $idc;
return $this->getQuery($query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('*')
->from('Codes')
->where($queryBuilder->expr()->eq('IDC','?'))
->setParameter(0,$idc);
return $this->getData($queryBuilder);
}
/**
@@ -199,35 +294,54 @@ class DB
*/
public function loadFilter($array,$global_search)
{
$query = "SELECT IDC,Name,nick,Lang,Description,Code,Version FROM Users NATURAL JOIN Sources as S NATURAL JOIN Codes ";
$where = "WHERE (";
$count = false;
foreach ($array as $key => $value) {
if ($key != "search" and $key != "o") {
if ($count) {
$where = $where . "OR S.Lang='$value' ";
} else {
$where = $where . "S.Lang='$value' ";
$count = !$count;
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('c.IDC','c.Name','u.nick','s.Lang','c.Description','s.Code','s.Version')
->from('Users','u')
->join('u','Sources','s',
$queryBuilder->expr()->eq('u.IDU','s.IDU'))
->join('s','Codes','c',
$queryBuilder->expr()->eq('s.IDC','c.IDC'));
if($global_search){
$queryBuilder
->where('TRUE');
}
else{
$count = false;
foreach ($array as $key => $value) {
if ($key != "search" and $key != "o") {
if ($count) {
$queryBuilder
->orWhere($queryBuilder->expr()->eq('s.Lang',"'$value'"));
} else {
$queryBuilder->where($queryBuilder->expr()->eq('s.Lang',"'$value'"));
$count = !$count;
}
}
}
}
//var_dump($global_search);
if ($global_search){
$where = "WHERE (TRUE";
}
if (array_key_exists("o",$array))
$first = $array["o"] * 10;
else
$first = 0;
if(array_key_exists("search",$array))
$search = $this->search($array["search"]);
else
$search = "";
$queryLast = ") AND Version = (SELECT MAX(Version) FROM Sources WHERE S.Lang = Lang AND S.IDC = IDC)" . $search . " ORDER BY Modification DESC LIMIT $first, 10";
//echo $query.$where.$queryLast;
return dbw_query($this->conn, $query . $where . $queryLast);
$queryBuilder = $this->search($queryBuilder,$array["search"]);
$subQuery = $this->newQueryBuilder();
$queryBuilder->andWhere(
$queryBuilder->expr()->eq('s.Version','('.
$subQuery
->select('MAX(su.Version)')
->from('Sources','su')
->where($subQuery->expr()->andX(
$subQuery->expr()->eq('s.Lang','su.Lang'),
$subQuery->expr()->eq('s.IDC','su.IDC'))
)->getSQL().')'
))
->orderBy('Modification','DESC')
->setFirstResult($first)
->setMaxResults(10);
return $this->execute($queryBuilder);
}
/**
@@ -236,26 +350,24 @@ class DB
* @param $text input by user
* @return string sql query fragment
*/
public function search($text)
public function search(Doctrine\DBAL\Query\QueryBuilder $queryBuilder, $text)
{
$text = dbw_escape_string($this->conn, $text);
$subWhere = "";
if ($text != "") {
$query = "";
$textExplode = explode(" ", $text);
$value = true;
$value = 0;
foreach ($textExplode as $find) {
if ($find != "") {
if ($value) {
$query = $query . "AND (Description LIKE '%" . $find . "%' OR Name LIKE '%" . $find . "%'";
$value = false;
} else {
$query = $query . "AND Description LIKE '%" . $find . "%' OR Name LIKE '%" . $find . "%'";
if ($value != 0) {
$subWhere .= " AND ";
}
$subWhere.="c.Description LIKE ".$queryBuilder->getConnection()->quote("%$find%")." OR c.Name LIKE ".$queryBuilder->getConnection()->quote("%$find%");
$value++;
}
}
return $query . ")";
return $queryBuilder->andWhere($subWhere);
} else {
return "";
return $queryBuilder;
}
}
@@ -286,13 +398,24 @@ class DB
$version = 0;
$version++;
$modification = time();
$query = "INSERT INTO Sources (`IDC`,`Lang`,`Version`,`Modification`,`Code`,`UseExtLib`,`UseExtLibVer`,`IDU`) VALUES ('$IDC','$lang',$version,$modification,'$code','$lib','$libV','$IDU')";
//echo $query . ';';
dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->insert('Sources')
->values(
array(
'IDC' => '?',
'Lang' => '?',
'Version' => '?',
'Modification' => '?',
'Code' => '?',
'UseExtLib' => '?',
'UseExtLibVer' => '?',
'IDU' => '?'
)
)
->setParameters(array($IDC,$lang,$version,$modification,$code,$lib,$libV,$IDU));
$this->execute($queryBuilder);
return $version;
}
/**
@@ -312,34 +435,58 @@ class DB
*/
public function addOrModifyCodes($IDC, $name, $description, $input, $output, $lang, $code, $IDU, $extlib = null, $extlibver = null)
{
$in = dbw_escape_string($this->conn, $input);
$out = dbw_escape_string($this->conn, $output);
$_code = dbw_escape_string($this->conn, $code);
if ($IDC == 0) {
$query = "INSERT INTO Codes (`UserCreator`,`Name`,`Description`,`Input`,`Output`) VALUES ('$IDU','$name','$description','$in','$out') ";
//echo $query.';';
//die();
dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->insert('Codes')
->values(array(
'UserCreator' => '?',
'Name' => '?',
'Description' => '?',
'Input' => '?',
'Output' => '?'
))
->setParameters(array($IDU,$name,$description,$input,$output));
//$query = "INSERT INTO Codes (`UserCreator`,`Name`,`Description`,`Input`,`Output`) VALUES ('$IDU','$name','$description','$in','$out') ";
$this->execute($queryBuilder);
$myID = $this->getLastIDC($name);
$this->addSource($myID, $lang, $_code, $IDU, $extlib, $extlibver);
$this->addSource($myID, $lang, $code, $IDU, $extlib, $extlibver);
return $myID;
} else {
$arr = $this->loadAll($IDC, $lang, $this->getLastVersion($IDC, $lang));
$codewrite = $arr["Code"];
$version = 0;
if ($_code != dbw_escape_string($this->conn,$codewrite)) {
$version = $this->addSource($IDC, $lang, $_code, $IDU, $extlib, $extlibver,$codewrite);
if ($code != $codewrite) {
$version = $this->addSource($IDC, $lang, $code, $IDU, $extlib, $extlibver);
} else if ($extlib != $arr["UseExtLib"] || $extlibver != $arr["UseExtLibVer"]) {
$query = "UPDATE Sources SET `UseExtLib`='$extlib', `UseExtLibVer`='$extlibver' WHERE IDC=$IDC AND Lang='$arr[Lang]' AND Version=$arr[Version]";
//echo $query.';';
dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->update('Sources')
->set('UseExtLib','?')
->set('UseExtLibVer','?')
->where($queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('IDC','?'),
$queryBuilder->expr()->eq('Lang','?'),
$queryBuilder->expr()->eq('Version','?')
))
->setParameter(0,$extlib)
->setParameter(1,$extlibver)
->setParameter(2,$IDC)
->setParameter(3,$arr['Lang'])
->setParameter(4,$arr['Version']);
$this->execute($queryBuilder);
}
$query = "UPDATE Codes SET `Name`='$name', `Description`='$description', `Input`='$in', `Output`='$out' WHERE IDC='$IDC'";
//echo $query.';';
dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->update('Codes')
->set('Name','?')
->set('Description','?')
->set('Input','?')
->set('Output','?')
->where($queryBuilder->expr()->eq('IDC','?'))
->setParameters(array($name,$description,$input,$output,$IDC));
$this->execute($queryBuilder);
return $version;
}
}
@@ -372,8 +519,13 @@ class DB
*/
public function loadProfile($id)
{
$query = "SELECT * FROM Users WHERE IDU=" . $id;
return $this->getQuery($query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('*')
->from('Users','u')
->where($queryBuilder->expr()->eq('u.IDU','?'))
->setParameter(0,$id);
return $this->getData($queryBuilder)[0];
}
/**
@@ -384,8 +536,13 @@ class DB
*/
public function loadIDU($field,$mode='email')
{
$query = "SELECT IDU FROM Users WHERE $mode='" . $field . "'";
return $this->getQuery($query)["IDU"];
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('IDU')
->from('Users')
->where($queryBuilder->expr()->eq($mode,'?'))
->setParameter(0,$field);
return $this->getData($queryBuilder)[0]['IDU'];
}
/**
@@ -397,7 +554,13 @@ class DB
*/
public function checkCookie($IDU, $token)
{
$tokenDB = $this->getQuery("SELECT token FROM Users WHERE IDU=" . $IDU)["token"];
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select('token')
->from('Users')
->where($queryBuilder->expr()->eq('IDU','?'))
->setParameter(0,$IDU);
$tokenDB = $this->getData($queryBuilder)[0]["token"];
if ($tokenDB == $token)
return true;
else
@@ -413,8 +576,13 @@ class DB
*/
public function checkPass($email, $pass)
{
$query = "SELECT pass FROM Users WHERE email='$email'";
$passDB = $this->getQuery($query)["pass"];
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->select("pass")
->from("Users")
->where($queryBuilder->expr()->eq('email','?'))
->setParameter(0,$email);
$passDB = $this->getData($queryBuilder)[0]["pass"];
if ($passDB == hash('sha256', $pass))
return true;
else
@@ -439,7 +607,16 @@ class DB
return 'NICK_IN_USE';
else {
$password = hash('sha256', $pass);
dbw_query($this->conn, "INSERT INTO Users (`email`,`pass`,`nick`) VALUES ('$email','$password','$nick')");
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->insert('Users')
->values(array(
'email' => '?',
'pass' => '?',
'nick' => '?'
))
->setParameters(array($email,$password,$nick));
$this->execute($queryBuilder);
return 'CORRECT';
}
}
@@ -452,7 +629,14 @@ class DB
*/
public function setToken($IDU, $token)
{
dbw_query($this->conn, "UPDATE Users SET token='$token' WHERE IDU='$IDU'");
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->update('Users')
->set('token','?')
->where($queryBuilder->expr()->eq('IDU','?'))
->setParameter(0,$token)
->setParameter(1,$IDU);
$this->execute($queryBuilder);
}
/**
@@ -463,7 +647,13 @@ class DB
*/
public function updatePass($idu, $pass)
{
$query = "UPDATE Users SET pass='" . hash('sha256', $pass) . "' WHERE IDU='$idu'";
dbw_query($this->conn, $query);
$queryBuilder = $this->newQueryBuilder();
$queryBuilder
->update('Users')
->set('pass','?')
->where($queryBuilder->expr()->eq('IDU','?'))
->setParameter(0,hash('sha256',$pass))
->setParameter(1,$idu);
$this->execute($queryBuilder);
}
}