Skip to content

Commit

Permalink
Use doctrine for database statements
Browse files Browse the repository at this point in the history
  • Loading branch information
digedag committed Sep 28, 2024
1 parent 8913514 commit 6251065
Show file tree
Hide file tree
Showing 11 changed files with 451 additions and 184 deletions.
3 changes: 3 additions & 0 deletions .php-cs-fixer.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
'phpdoc_separation' => [
'skip_unlisted_annotations' => true,
],
'trailing_comma_in_multiline' => [
'elements' => ['arrays'],
]
])
->setLineEnding("\n")
;
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
Changelog
---------

v1.19.0 (??.10.2024)
* Use Doctrine and QueryBuilder for insert, update and delete statements
* new delete()-method for PersistanceRepository

v1.18.2 (11.07.2024)
* Fix PHP warnings

Expand Down
146 changes: 73 additions & 73 deletions Classes/Database/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,9 @@ private function doSelectByQueryBuilder(QueryBuilder $queryBuilder, From $from,
$wrapper = is_string($arr['wrapperclass'] ?? null) ? trim($arr['wrapperclass']) : 0;
$callback = isset($arr['callback']) ? $arr['callback'] : false;

foreach ($queryBuilder->execute()->fetchAll() as $row) {
$executeMethod = method_exists($queryBuilder, 'executeQuery') ? 'executeQuery' : 'execute';

foreach ($queryBuilder->$executeMethod()->fetchAll() as $row) {
$this->appendRow($rows, $row, $from->getTableName(), $wrapper, $callback, $arr);
}

Expand Down Expand Up @@ -508,9 +510,6 @@ public function doInsert($tablename, $values, $arr = [])
if (!is_array($arr)) {
$arr = ['debug' => $arr];
}
$debug = intval($arr['debug'] ?? 0) > 0;

$database = $this->getDatabaseConnection($arr);

Misc::callHook(
'rn_base',
Expand All @@ -522,35 +521,19 @@ public function doInsert($tablename, $values, $arr = [])
]
);

if ($debug || !empty($arr['sqlonly'] ?? false)) {
$sqlQuery = $database->INSERTquery($tablename, $values);
if (!empty($arr['sqlonly'] ?? false)) {
return $sqlQuery;
}
$time = microtime(true);
$mem = memory_get_usage();
}
$from = From::buildInstance($tablename);
$qbFacade = new QueryBuilderFacade();
$arr['values'] = $values;
$queryBuilder = $qbFacade->doInsert($from, $arr);

$storeLastBuiltQuery = $database->store_lastBuiltQuery;
$database->store_lastBuiltQuery = true;
$this->watchOutDB(
$database->exec_INSERTquery(
$tablename,
$values
),
$database
);
$database->store_lastBuiltQuery = $storeLastBuiltQuery;
$affectedRows = $this->doStatementByQueryBuilder($queryBuilder, $from, $arr);

if ($debug) {
Debug::debug([
'SQL ' => $sqlQuery,
'Time ' => (microtime(true) - $time),
'Memory consumed ' => (memory_get_usage() - $mem),
], 'SQL statistics');
if (is_string($affectedRows) || (TYPO3::isTYPO87OrHigher() && $affectedRows instanceof QueryBuilder)) {
// sqlOnly
return $affectedRows;
}

$insertId = $database->sql_insert_id();
$insertId = $queryBuilder->getConnection()->lastInsertId();

Misc::callHook(
'rn_base',
Expand Down Expand Up @@ -619,8 +602,8 @@ public function doUpdate($tablename, $where, $values, $arr = [], $noQuoteFields
if (!is_array($arr)) {
$arr = ['debug' => $arr];
}
$debug = intval($arr['debug'] ?? 0) > 0;
$database = $this->getDatabaseConnection($arr);
// $debug = intval($arr['debug'] ?? 0) > 0;
// $database = $this->getDatabaseConnection($arr);

Misc::callHook(
'rn_base',
Expand All @@ -634,29 +617,43 @@ public function doUpdate($tablename, $where, $values, $arr = [], $noQuoteFields
]
);

if ($debug || !empty($arr['sqlonly'])) {
$sql = $database->UPDATEquery($tablename, $where, $values, $noQuoteFields);
if (!empty($arr['sqlonly'])) {
return $sql;
}
Debug::debug($sql, 'SQL');
Debug::debug([$tablename, $where, $values]);
$from = From::buildInstance($tablename);
$qbFacade = new QueryBuilderFacade();
$arr['where'] = $where;
$arr['values'] = $values;
$queryBuilder = $qbFacade->doUpdate($from, $arr);

$affectedRows = $this->doStatementByQueryBuilder($queryBuilder, $from, $arr);

if (is_string($affectedRows) || (TYPO3::isTYPO87OrHigher() && $affectedRows instanceof QueryBuilder)) {
// sqlOnly
return $affectedRows;
}

$storeLastBuiltQuery = $database->store_lastBuiltQuery;
$database->store_lastBuiltQuery = true;
$this->watchOutDB(
$database->exec_UPDATEquery(
$tablename,
$where,
$values,
$noQuoteFields
),
$database
);
$database->store_lastBuiltQuery = $storeLastBuiltQuery;

$affectedRows = $database->sql_affected_rows();
// if ($debug || !empty($arr['sqlonly'])) {
// $sql = $database->UPDATEquery($tablename, $where, $values, $noQuoteFields);
// if (!empty($arr['sqlonly'])) {
// return $sql;
// }
// Debug::debug($sql, 'SQL');
// Debug::debug([$tablename, $where, $values]);
// }

// $storeLastBuiltQuery = $database->store_lastBuiltQuery;
// $database->store_lastBuiltQuery = true;
// $this->watchOutDB(
// $database->exec_UPDATEquery(
// $tablename,
// $where,
// $values,
// $noQuoteFields
// ),
// $database
// );
// $database->store_lastBuiltQuery = $storeLastBuiltQuery;

// $affectedRows = $database->sql_affected_rows();

Misc::callHook(
'rn_base',
Expand All @@ -681,16 +678,15 @@ public function doUpdate($tablename, $where, $values, $arr = [], $noQuoteFields
* @param string $where
* @param array $arr
*
* @return int number of rows affected
* @return int|QueryBuilder number of rows affected
*/
public function doDelete($tablename, $where, $arr = [])
{
// fallback, $arr war früher $debug
if (!is_array($arr)) {
$arr = ['debug' => $arr];
}
$debug = intval($arr['debug'] ?? 0) > 0;
$database = $this->getDatabaseConnection($arr);
$debug = $debug ?? intval($arr['debug'] ?? 0) > 0;

Misc::callHook(
'rn_base',
Expand All @@ -702,27 +698,17 @@ public function doDelete($tablename, $where, $arr = [])
]
);

if ($debug || !empty($arr['sqlonly'] ?? false)) {
$sql = $database->DELETEquery($tablename, $where);
if (!empty($arr['sqlonly'] ?? false)) {
return $sql;
}
Debug::debug($sql, 'SQL');
Debug::debug([$tablename, $where]);
}
$from = From::buildInstance($tablename);
$qbFacade = new QueryBuilderFacade();
$arr['where'] = $where;
$queryBuilder = $qbFacade->doDelete($from, $arr);

$storeLastBuiltQuery = $database->store_lastBuiltQuery;
$database->store_lastBuiltQuery = true;
$this->watchOutDB(
$database->exec_DELETEquery(
$tablename,
$where
),
$database
);
$database->store_lastBuiltQuery = $storeLastBuiltQuery;
$affectedRows = $this->doStatementByQueryBuilder($queryBuilder, $from, $arr);

$affectedRows = $database->sql_affected_rows();
if (is_string($affectedRows) || (TYPO3::isTYPO87OrHigher() && $affectedRows instanceof QueryBuilder)) {
// sqlOnly
return $affectedRows;
}

Misc::callHook(
'rn_base',
Expand All @@ -738,6 +724,20 @@ public function doDelete($tablename, $where, $arr = [])
return $affectedRows;
}

private function doStatementByQueryBuilder(QueryBuilder $queryBuilder, From $from, array $arr)
{
$sqlOnly = intval($arr['sqlonly'] ?? null) > 0;

if ($sqlOnly) {
return $queryBuilder;
}

$executeMethod = method_exists($queryBuilder, 'executeStatement') ? 'executeStatement' : 'execute';
$rows = $queryBuilder->$executeMethod();

return $rows;
}

/**
* Escaping and quoting values for SQL statements.
*
Expand Down
103 changes: 102 additions & 1 deletion Classes/Database/QueryBuilderFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
/***************************************************************
* Copyright notice
*
* (c) 2006-2021 Rene Nitzsche
* (c) 2006-2024 Rene Nitzsche
* Contact: [email protected]
* All rights reserved
*
Expand All @@ -41,6 +41,107 @@

class QueryBuilderFacade
{
public function doInsert(From $from, $arr): ?QueryBuilder
{
if (!empty($from->getClause()) || $from->isComplexTable()) {
return null;
}
$tableName = $from->getTableName();
$debug = intval($arr['debug'] ?? null) > 0;
$values = $arr['values'] ?? null;

$queryBuilder = $this->getConnectionPool()->getQueryBuilderForTable($tableName);
$queryBuilder->insert($tableName, $tableName)
->values($values);

if ($debug) {
Debug::debug($queryBuilder->getSQL(), 'SQL');
Debug::debug(['from' => $from, 'options' => $arr, 'params' => $queryBuilder->getParameters()], 'Parts');
}

return $queryBuilder;
}

public function doUpdate(From $from, $arr): ?QueryBuilder
{
if (!empty($from->getClause()) || $from->isComplexTable()) {
return null;
}
$joins = $from->getJoins();
$tableName = $from->getTableName();
$tableAlias = $from->getAlias();
$where = isset($arr['where']) ? $arr['where'] : null;
$debug = intval($arr['debug'] ?? null) > 0;
$values = $arr['values'] ?? null;

$queryBuilder = $this->getConnectionPool()->getQueryBuilderForTable($tableName);
$queryBuilder->update($tableName, $tableAlias != $tableName ? $tableAlias : null);
foreach($values as $col => $value) {
$queryBuilder->set($col, $value);
}

foreach ($joins as $join) {
if (Join::TYPE_INNER == $join->getType()) {
$queryBuilder->innerJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
} elseif (Join::TYPE_LEFT == $join->getType()) {
$queryBuilder->leftJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
} elseif (Join::TYPE_RIGHT == $join->getType()) {
$queryBuilder->rightJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
}
}

if (is_string($where)) {
$queryBuilder->andWhere($where);
} elseif (is_callable($where)) {
$where($queryBuilder);
}

if ($debug) {
Debug::debug($queryBuilder->getSQL(), 'SQL');
Debug::debug(['from' => $from, 'options' => $arr, 'params' => $queryBuilder->getParameters()], 'Parts');
}

return $queryBuilder;
}


public function doDelete(From $from, $arr): ?QueryBuilder
{
if (!empty($from->getClause()) || $from->isComplexTable()) {
return null;
}
$joins = $from->getJoins();
$tableName = $from->getTableName();
$tableAlias = $from->getAlias();
$where = isset($arr['where']) ? $arr['where'] : null;
$debug = intval($arr['debug'] ?? null) > 0;

$queryBuilder = $this->getConnectionPool()->getQueryBuilderForTable($tableName);
$queryBuilder->delete($tableName, $tableAlias != $tableName ? $tableAlias : null);
foreach ($joins as $join) {
if (Join::TYPE_INNER == $join->getType()) {
$queryBuilder->innerJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
} elseif (Join::TYPE_LEFT == $join->getType()) {
$queryBuilder->leftJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
} elseif (Join::TYPE_RIGHT == $join->getType()) {
$queryBuilder->rightJoin($tableAlias, $join->getTable(), $join->getAlias(), $join->getOnClause());
}
}

if (is_string($where)) {
$queryBuilder->andWhere($where);
} elseif (is_callable($where)) {
$where($queryBuilder);
}

if ($debug) {
Debug::debug($queryBuilder->getSQL(), 'SQL');
Debug::debug(['from' => $from, 'options' => $arr, 'params' => $queryBuilder->getParameters()], 'Parts');
}

return $queryBuilder;
}

public function doSelect($what, From $from, $arr): ?QueryBuilder
{
// if (isset($from['clause']) && !is_array($from['clause'])) {
Expand Down
2 changes: 1 addition & 1 deletion Classes/Domain/Model/DomainModelInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public function setProperty($property, $value = null);
*
* @param string $property
*
* @return string
* @return string|array
*/
public function getProperty($property = null);

Expand Down
Loading

0 comments on commit 6251065

Please sign in to comment.