Merge pull request #11665 from Quix0r/rewrites/dba-array-string-table

Rewrites/dba array string table
This commit is contained in:
Hypolite Petovan 2022-06-21 15:15:57 -04:00 committed by GitHub
commit 1c57ea7f75
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 180 additions and 176 deletions

View file

@ -130,7 +130,7 @@ class BoundariesPager extends Pager
return Renderer::replaceMacros($tpl, ['pager' => $data]); return Renderer::replaceMacros($tpl, ['pager' => $data]);
} }
public function renderFull($itemCount) public function renderFull(int $itemCount)
{ {
throw new \BadMethodCallException(); throw new \BadMethodCallException();
} }

View file

@ -160,7 +160,7 @@ class Pager
* @return string HTML string of the pager * @return string HTML string of the pager
* @throws \Exception * @throws \Exception
*/ */
public function renderMinimal(int $itemCount) public function renderMinimal(int $itemCount): string
{ {
$displayedItemCount = max(0, intval($itemCount)); $displayedItemCount = max(0, intval($itemCount));
@ -203,7 +203,7 @@ class Pager
* @return string HTML string of the pager * @return string HTML string of the pager
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public function renderFull($itemCount) public function renderFull(int $itemCount): string
{ {
$totalItemCount = max(0, intval($itemCount)); $totalItemCount = max(0, intval($itemCount));

View file

@ -86,7 +86,7 @@ class UserImport
* @return array|bool * @return array|bool
* @throws \Exception * @throws \Exception
*/ */
private static function dbImportAssoc($table, $arr) private static function dbImportAssoc(string $table, array $arr)
{ {
if (isset($arr['id'])) { if (isset($arr['id'])) {
unset($arr['id']); unset($arr['id']);
@ -105,10 +105,11 @@ class UserImport
* Import account file exported from mod/uexport * Import account file exported from mod/uexport
* *
* @param array $file array from $_FILES * @param array $file array from $_FILES
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function importAccount($file) public static function importAccount(array $file)
{ {
Logger::notice("Start user import from " . $file['tmp_name']); Logger::notice("Start user import from " . $file['tmp_name']);
/* /*

View file

@ -77,7 +77,7 @@ class DBA
* *
* @return string with either "pdo" or "mysqli" * @return string with either "pdo" or "mysqli"
*/ */
public static function getDriver() public static function getDriver(): string
{ {
return DI::dba()->getDriver(); return DI::dba()->getDriver();
} }
@ -218,12 +218,12 @@ class DBA
/** /**
* Check if data exists * Check if data exists
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $condition array of fields for condition * @param array $condition Array of fields for condition
* @return boolean Are there rows for that condition? * @return boolean Are there rows for that condition?
* @throws \Exception * @throws \Exception
*/ */
public static function exists($table, array $condition): bool public static function exists(string $table, array $condition): bool
{ {
return DI::dba()->exists($table, $condition); return DI::dba()->exists($table, $condition);
} }
@ -289,14 +289,13 @@ class DBA
/** /**
* Insert a row into a table * Insert a row into a table
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $param parameter array * @param array $param parameter array
* @param int $duplicate_mode What to do on a duplicated entry * @param int $duplicate_mode What to do on a duplicated entry
*
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public static function insert($table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT): bool public static function insert(string $table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT): bool
{ {
return DI::dba()->insert($table, $param, $duplicate_mode); return DI::dba()->insert($table, $param, $duplicate_mode);
} }
@ -305,13 +304,12 @@ class DBA
* Inserts a row with the provided data in the provided table. * Inserts a row with the provided data in the provided table.
* If the data corresponds to an existing row through a UNIQUE or PRIMARY index constraints, it updates the row instead. * If the data corresponds to an existing row through a UNIQUE or PRIMARY index constraints, it updates the row instead.
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $param parameter array * @param array $param parameter array
*
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public static function replace($table, array $param): bool public static function replace(string $table, array $param): bool
{ {
return DI::dba()->replace($table, $param); return DI::dba()->replace($table, $param);
} }
@ -331,12 +329,11 @@ class DBA
* *
* This function can be extended in the future to accept a table array as well. * This function can be extended in the future to accept a table array as well.
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
*
* @return boolean was the lock successful? * @return boolean was the lock successful?
* @throws \Exception * @throws \Exception
*/ */
public static function lock($table): bool public static function lock(string $table): bool
{ {
return DI::dba()->lock($table); return DI::dba()->lock($table);
} }
@ -385,13 +382,13 @@ class DBA
/** /**
* Delete a row from a table * Delete a row from a table
* *
* @param string|array $table Table name * @param string $table Table name
* @param array $conditions Field condition(s) * @param array $conditions Field condition(s)
* *
* @return boolean was the delete successful? * @return boolean was the delete successful?
* @throws \Exception * @throws \Exception
*/ */
public static function delete($table, array $conditions, array $options = []): bool public static function delete(string $table, array $conditions, array $options = []): bool
{ {
return DI::dba()->delete($table, $conditions, $options); return DI::dba()->delete($table, $conditions, $options);
} }
@ -417,7 +414,7 @@ class DBA
* Only set $old_fields to a boolean value when you are sure that you will update a single row. * Only set $old_fields to a boolean value when you are sure that you will update a single row.
* When you set $old_fields to "true" then $fields must contain all relevant fields! * When you set $old_fields to "true" then $fields must contain all relevant fields!
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields contains the fields that are updated * @param array $fields contains the fields that are updated
* @param array $condition condition array with the key values * @param array $condition condition array with the key values
* @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields) * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields)
@ -426,7 +423,7 @@ class DBA
* @return boolean was the update successfull? * @return boolean was the update successfull?
* @throws \Exception * @throws \Exception
*/ */
public static function update($table, array $fields, array $condition, $old_fields = [], array $params = []): bool public static function update(string $table, array $fields, array $condition, $old_fields = [], array $params = []): bool
{ {
return DI::dba()->update($table, $fields, $condition, $old_fields, $params); return DI::dba()->update($table, $fields, $condition, $old_fields, $params);
} }
@ -434,7 +431,7 @@ class DBA
/** /**
* Retrieve a single record from a table and returns it in an associative array * Retrieve a single record from a table and returns it in an associative array
* *
* @param string|array $table Table name or array [schema => table] * @param string|array $table Table name in format schema.table (while scheme is optiona)
* @param array $fields * @param array $fields
* @param array $condition * @param array $condition
* @param array $params * @param array $params
@ -450,16 +447,16 @@ class DBA
/** /**
* Select rows from a table and fills an array with the data * Select rows from a table and fills an array with the data
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields Array of selected fields, empty for all * @param array $fields Array of selected fields, empty for all
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* *
* @return array Data array * @return array Data array
* @throws \Exception * @throws \Exception
* @see self::select * @see self::select
*/ */
public static function selectToArray($table, array $fields = [], array $condition = [], array $params = []) public static function selectToArray(string $table, array $fields = [], array $condition = [], array $params = [])
{ {
return DI::dba()->selectToArray($table, $fields, $condition, $params); return DI::dba()->selectToArray($table, $fields, $condition, $params);
} }
@ -467,10 +464,10 @@ class DBA
/** /**
* Select rows from a table * Select rows from a table
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields Array of selected fields, empty for all * @param array $fields Array of selected fields, empty for all
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* *
* @return boolean|object * @return boolean|object
* *
@ -487,7 +484,7 @@ class DBA
* $data = DBA::select($table, $fields, $condition, $params); * $data = DBA::select($table, $fields, $condition, $params);
* @throws \Exception * @throws \Exception
*/ */
public static function select($table, array $fields = [], array $condition = [], array $params = []) public static function select(string $table, array $fields = [], array $condition = [], array $params = [])
{ {
return DI::dba()->select($table, $fields, $condition, $params); return DI::dba()->select($table, $fields, $condition, $params);
} }
@ -495,9 +492,9 @@ class DBA
/** /**
* Counts the rows from a table satisfying the provided condition * Counts the rows from a table satisfying the provided condition
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $condition array of fields for condition * @param array $condition array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* *
* @return int * @return int
* *
@ -511,7 +508,7 @@ class DBA
* $count = DBA::count($table, $condition); * $count = DBA::count($table, $condition);
* @throws \Exception * @throws \Exception
*/ */
public static function count($table, array $condition = [], array $params = []): int public static function count(string $table, array $condition = [], array $params = []): int
{ {
return DI::dba()->count($table, $condition, $params); return DI::dba()->count($table, $condition, $params);
} }
@ -524,37 +521,30 @@ class DBA
* - [table1, table2, ...] * - [table1, table2, ...]
* - [schema1 => table1, schema2 => table2, table3, ...] * - [schema1 => table1, schema2 => table2, table3, ...]
* *
* @param string|array $tables * @param array $tables Table names
* @return string * @return string
*/ */
public static function buildTableString($tables): string public static function buildTableString(array $tables): string
{ {
if (is_string($tables)) { // Quote each entry
$tables = [$tables]; return implode(',', array_map(['self', 'quoteIdentifier'], $tables));
}
$quotedTables = [];
foreach ($tables as $schema => $table) {
if (is_numeric($schema)) {
$quotedTables[] = self::quoteIdentifier($table);
} else {
$quotedTables[] = self::quoteIdentifier($schema) . '.' . self::quoteIdentifier($table);
}
}
return implode(', ', $quotedTables);
} }
/** /**
* Escape an identifier (table or field name) * Escape an identifier (table or field name) optional with a schema like (schema.)table
* *
* @param $identifier * @param $identifier Table, field name
* @return string * @return string Quotes table or field name
*/ */
public static function quoteIdentifier(string $identifier): string public static function quoteIdentifier(string $identifier): string
{ {
return '`' . str_replace('`', '``', $identifier) . '`'; return implode(
'.',
array_map(
function (string $identifier) { return '`' . str_replace('`', '``', $identifier) . '`'; },
explode('.', $identifier)
)
);
} }
/** /**

View file

@ -84,7 +84,7 @@ class DBStructure
'deliverq', 'dsprphotoq', 'ffinder', 'sign', 'spam', 'term', 'user-item', 'thread', 'item', 'challenge', 'deliverq', 'dsprphotoq', 'ffinder', 'sign', 'spam', 'term', 'user-item', 'thread', 'item', 'challenge',
'auth_codes', 'tokens', 'clients', 'profile_check', 'host']; 'auth_codes', 'tokens', 'clients', 'profile_check', 'host'];
$tables = DBA::selectToArray(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_NAME'], $tables = DBA::selectToArray('INFORMATION_SCHEMA.TABLES', ['TABLE_NAME'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']);
if (empty($tables)) { if (empty($tables)) {
@ -119,13 +119,13 @@ class DBStructure
public static function convertToInnoDB() public static function convertToInnoDB()
{ {
$tables = DBA::selectToArray( $tables = DBA::selectToArray(
['information_schema' => 'tables'], 'information_schema.tables',
['table_name'], ['table_name'],
['engine' => 'MyISAM', 'table_schema' => DBA::databaseName()] ['engine' => 'MyISAM', 'table_schema' => DBA::databaseName()]
); );
$tables = array_merge($tables, DBA::selectToArray( $tables = array_merge($tables, DBA::selectToArray(
['information_schema' => 'tables'], 'information_schema.tables',
['table_name'], ['table_name'],
['engine' => 'InnoDB', 'ROW_FORMAT' => ['COMPACT', 'REDUNDANT'], 'table_schema' => DBA::databaseName()] ['engine' => 'InnoDB', 'ROW_FORMAT' => ['COMPACT', 'REDUNDANT'], 'table_schema' => DBA::databaseName()]
)); ));
@ -465,19 +465,19 @@ class DBStructure
private static function createIndex(string $indexName, array $fieldNames, string $method = 'ADD') private static function createIndex(string $indexName, array $fieldNames, string $method = 'ADD')
{ {
$method = strtoupper(trim($method)); $method = strtoupper(trim($method));
if ($method != "" && $method != "ADD") { if ($method != '' && $method != 'ADD') {
throw new Exception("Invalid parameter 'method' in self::createIndex(): '$method'"); throw new Exception("Invalid parameter 'method' in self::createIndex(): '$method'");
} }
if (in_array($fieldNames[0], ["UNIQUE", "FULLTEXT"])) { if (in_array($fieldNames[0], ['UNIQUE', 'FULLTEXT'])) {
$index_type = array_shift($fieldNames); $index_type = array_shift($fieldNames);
$method .= " " . $index_type; $method .= " " . $index_type;
} }
$names = ""; $names = "";
foreach ($fieldNames as $fieldName) { foreach ($fieldNames as $fieldName) {
if ($names != "") { if ($names != '') {
$names .= ","; $names .= ',';
} }
if (preg_match('|(.+)\((\d+)\)|', $fieldName, $matches)) { if (preg_match('|(.+)\((\d+)\)|', $fieldName, $matches)) {
@ -487,7 +487,7 @@ class DBStructure
} }
} }
if ($indexName == "PRIMARY") { if ($indexName == 'PRIMARY') {
return sprintf("%s PRIMARY KEY(%s)", $method, $names); return sprintf("%s PRIMARY KEY(%s)", $method, $names);
} }
@ -851,18 +851,18 @@ class DBStructure
// This query doesn't seem to be executable as a prepared statement // This query doesn't seem to be executable as a prepared statement
$indexes = DBA::toArray(DBA::p("SHOW INDEX FROM " . DBA::quoteIdentifier($table))); $indexes = DBA::toArray(DBA::p("SHOW INDEX FROM " . DBA::quoteIdentifier($table)));
$fields = DBA::selectToArray(['INFORMATION_SCHEMA' => 'COLUMNS'], $fields = DBA::selectToArray('INFORMATION_SCHEMA.COLUMNS',
['COLUMN_NAME', 'COLUMN_TYPE', 'IS_NULLABLE', 'COLUMN_DEFAULT', 'EXTRA', ['COLUMN_NAME', 'COLUMN_TYPE', 'IS_NULLABLE', 'COLUMN_DEFAULT', 'EXTRA',
'COLUMN_KEY', 'COLLATION_NAME', 'COLUMN_COMMENT'], 'COLUMN_KEY', 'COLLATION_NAME', 'COLUMN_COMMENT'],
["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?", ["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?",
DBA::databaseName(), $table]); DBA::databaseName(), $table]);
$foreign_keys = DBA::selectToArray(['INFORMATION_SCHEMA' => 'KEY_COLUMN_USAGE'], $foreign_keys = DBA::selectToArray('INFORMATION_SCHEMA.KEY_COLUMN_USAGE',
['COLUMN_NAME', 'CONSTRAINT_NAME', 'REFERENCED_TABLE_NAME', 'REFERENCED_COLUMN_NAME'], ['COLUMN_NAME', 'CONSTRAINT_NAME', 'REFERENCED_TABLE_NAME', 'REFERENCED_COLUMN_NAME'],
["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL", ["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL",
DBA::databaseName(), $table]); DBA::databaseName(), $table]);
$table_status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], $table_status = DBA::selectFirst('INFORMATION_SCHEMA.TABLES',
['ENGINE', 'TABLE_COLLATION', 'TABLE_COMMENT'], ['ENGINE', 'TABLE_COLLATION', 'TABLE_COMMENT'],
["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?", ["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?",
DBA::databaseName(), $table]); DBA::databaseName(), $table]);
@ -1064,7 +1064,7 @@ class DBStructure
* @return boolean Does the table exist? * @return boolean Does the table exist?
* @throws Exception * @throws Exception
*/ */
public static function existsColumn($table, $columns = []) public static function existsColumn(string $table, array $columns = []): bool
{ {
if (empty($table)) { if (empty($table)) {
return false; return false;
@ -1106,7 +1106,7 @@ class DBStructure
*/ */
public static function existsForeignKeyForField(string $table, string $field): bool public static function existsForeignKeyForField(string $table, string $field): bool
{ {
return DBA::exists(['INFORMATION_SCHEMA' => 'KEY_COLUMN_USAGE'], return DBA::exists('INFORMATION_SCHEMA.KEY_COLUMN_USAGE',
["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ? AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL", ["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ? AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL",
DBA::databaseName(), $table, $field]); DBA::databaseName(), $table, $field]);
} }
@ -1126,7 +1126,7 @@ class DBStructure
$condition = ['table_schema' => DBA::databaseName(), 'table_name' => $table]; $condition = ['table_schema' => DBA::databaseName(), 'table_name' => $table];
return DBA::exists(['information_schema' => 'tables'], $condition); return DBA::exists('information_schema.tables', $condition);
} }
/** /**
@ -1181,9 +1181,9 @@ class DBStructure
if (self::existsTable('user') && !DBA::exists('user', ['uid' => 0])) { if (self::existsTable('user') && !DBA::exists('user', ['uid' => 0])) {
$user = [ $user = [
"verified" => true, 'verified' => true,
"page-flags" => User::PAGE_FLAGS_SOAPBOX, 'page-flags' => User::PAGE_FLAGS_SOAPBOX,
"account-type" => User::ACCOUNT_TYPE_RELAY, 'account-type' => User::ACCOUNT_TYPE_RELAY,
]; ];
DBA::insert('user', $user); DBA::insert('user', $user);
$lastid = DBA::lastInsertId(); $lastid = DBA::lastInsertId();
@ -1287,8 +1287,10 @@ class DBStructure
{ {
$isUpdate = false; $isUpdate = false;
$processes = DBA::select(['information_schema' => 'processlist'], ['info'], $processes = DBA::select('information_schema.processlist', ['info'], [
['db' => DBA::databaseName(), 'command' => ['Query', 'Execute']]); 'db' => DBA::databaseName(),
'command' => ['Query', 'Execute']
]);
while ($process = DBA::fetch($processes)) { while ($process = DBA::fetch($processes)) {
$parts = explode(' ', $process['info']); $parts = explode(' ', $process['info']);

View file

@ -64,7 +64,7 @@ class Database
protected $server_info = ''; protected $server_info = '';
/** @var PDO|mysqli */ /** @var PDO|mysqli */
protected $connection; protected $connection;
protected $driver; protected $driver = '';
protected $pdo_emulate_prepares = false; protected $pdo_emulate_prepares = false;
private $error = false; private $error = false;
private $errorno = 0; private $errorno = 0;
@ -181,7 +181,7 @@ class Database
// No suitable SQL driver was found. // No suitable SQL driver was found.
if (!$this->connected) { if (!$this->connected) {
$this->driver = null; $this->driver = '';
$this->connection = null; $this->connection = null;
} }
@ -233,7 +233,7 @@ class Database
} }
} }
$this->driver = null; $this->driver = '';
$this->connected = false; $this->connected = false;
} }
@ -820,13 +820,13 @@ class Database
/** /**
* Check if data exists * Check if data exists
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $condition array of fields for condition * @param array $condition Array of fields for condition
* *
* @return boolean Are there rows for that condition? * @return boolean Are there rows for that condition?
* @throws \Exception * @throws \Exception
*/ */
public function exists($table, array $condition): bool public function exists(string $table, array $condition): bool
{ {
if (empty($table)) { if (empty($table)) {
return false; return false;
@ -1003,14 +1003,14 @@ class Database
/** /**
* Insert a row into a table. Field value objects will be cast as string. * Insert a row into a table. Field value objects will be cast as string.
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $param parameter array * @param array $param parameter array
* @param int $duplicate_mode What to do on a duplicated entry * @param int $duplicate_mode What to do on a duplicated entry
* *
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public function insert($table, array $param, int $duplicate_mode = self::INSERT_DEFAULT): bool public function insert(string $table, array $param, int $duplicate_mode = self::INSERT_DEFAULT): bool
{ {
if (empty($table) || empty($param)) { if (empty($table) || empty($param)) {
$this->logger->info('Table and fields have to be set'); $this->logger->info('Table and fields have to be set');
@ -1019,7 +1019,7 @@ class Database
$param = $this->castFields($table, $param); $param = $this->castFields($table, $param);
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$fields_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param))); $fields_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param)));
@ -1054,13 +1054,12 @@ class Database
* Inserts a row with the provided data in the provided table. * Inserts a row with the provided data in the provided table.
* If the data corresponds to an existing row through a UNIQUE or PRIMARY index constraints, it updates the row instead. * If the data corresponds to an existing row through a UNIQUE or PRIMARY index constraints, it updates the row instead.
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $param parameter array * @param array $param parameter array
*
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public function replace($table, array $param): bool public function replace(string $table, array $param): bool
{ {
if (empty($table) || empty($param)) { if (empty($table) || empty($param)) {
$this->logger->info('Table and fields have to be set'); $this->logger->info('Table and fields have to be set');
@ -1069,7 +1068,7 @@ class Database
$param = $this->castFields($table, $param); $param = $this->castFields($table, $param);
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$fields_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param))); $fields_string = implode(', ', array_map([DBA::class, 'quoteIdentifier'], array_keys($param)));
@ -1103,12 +1102,11 @@ class Database
* *
* This function can be extended in the future to accept a table array as well. * This function can be extended in the future to accept a table array as well.
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
*
* @return boolean was the lock successful? * @return boolean was the lock successful?
* @throws \Exception * @throws \Exception
*/ */
public function lock($table): bool public function lock(string $table): bool
{ {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
if ($this->driver == self::PDO) { if ($this->driver == self::PDO) {
@ -1118,7 +1116,7 @@ class Database
$this->connection->autocommit(false); $this->connection->autocommit(false);
} }
$success = $this->e("LOCK TABLES " . DBA::buildTableString($table) . " WRITE"); $success = $this->e("LOCK TABLES " . DBA::buildTableString([$table]) . " WRITE");
if ($this->driver == self::PDO) { if ($this->driver == self::PDO) {
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
@ -1265,14 +1263,14 @@ class Database
* @return boolean was the delete successful? * @return boolean was the delete successful?
* @throws \Exception * @throws \Exception
*/ */
public function delete($table, array $conditions): bool public function delete(string $table, array $conditions): bool
{ {
if (empty($table) || empty($conditions)) { if (empty($table) || empty($conditions)) {
$this->logger->info('Table and conditions have to be set'); $this->logger->info('Table and conditions have to be set');
return false; return false;
} }
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$condition_string = DBA::buildCondition($conditions); $condition_string = DBA::buildCondition($conditions);
@ -1302,7 +1300,7 @@ class Database
* Only set $old_fields to a boolean value when you are sure that you will update a single row. * Only set $old_fields to a boolean value when you are sure that you will update a single row.
* When you set $old_fields to "true" then $fields must contain all relevant fields! * When you set $old_fields to "true" then $fields must contain all relevant fields!
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields contains the fields that are updated * @param array $fields contains the fields that are updated
* @param array $condition condition array with the key values * @param array $condition condition array with the key values
* @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields) * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields)
@ -1312,7 +1310,7 @@ class Database
* @throws \Exception * @throws \Exception
* @todo Implement "bool $update_on_duplicate" to avoid mixed type for $old_fields * @todo Implement "bool $update_on_duplicate" to avoid mixed type for $old_fields
*/ */
public function update($table, array $fields, array $condition, $old_fields = [], array $params = []) public function update(string $table, array $fields, array $condition, $old_fields = [], array $params = [])
{ {
if (empty($table) || empty($fields) || empty($condition)) { if (empty($table) || empty($fields) || empty($condition)) {
$this->logger->info('Table, fields and condition have to be set'); $this->logger->info('Table, fields and condition have to be set');
@ -1345,7 +1343,7 @@ class Database
$fields = $this->castFields($table, $fields); $fields = $this->castFields($table, $fields);
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$condition_string = DBA::buildCondition($condition); $condition_string = DBA::buildCondition($condition);
@ -1368,16 +1366,16 @@ class Database
/** /**
* Retrieve a single record from a table and returns it in an associative array * Retrieve a single record from a table and returns it in an associative array
* *
* @param string|array $table * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields * @param array $fields Array of selected fields, empty for all
* @param array $condition * @param array $condition Array of fields for condition
* @param array $params * @param array $params Array of several parameters
* *
* @return bool|array * @return bool|array
* @throws \Exception * @throws \Exception
* @see $this->select * @see $this->select
*/ */
public function selectFirst($table, array $fields = [], array $condition = [], array $params = []) public function selectFirst(string $table, array $fields = [], array $condition = [], array $params = [])
{ {
$params['limit'] = 1; $params['limit'] = 1;
$result = $this->select($table, $fields, $condition, $params); $result = $this->select($table, $fields, $condition, $params);
@ -1394,16 +1392,15 @@ class Database
/** /**
* Select rows from a table and fills an array with the data * Select rows from a table and fills an array with the data
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields Array of selected fields, empty for all * @param array $fields Array of selected fields, empty for all
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
*
* @return array Data array * @return array Data array
* @throws \Exception * @throws \Exception
* @see self::select * @see self::select
*/ */
public function selectToArray($table, array $fields = [], array $condition = [], array $params = []) public function selectToArray(string $table, array $fields = [], array $condition = [], array $params = [])
{ {
return $this->toArray($this->select($table, $fields, $condition, $params)); return $this->toArray($this->select($table, $fields, $condition, $params));
} }
@ -1469,14 +1466,14 @@ class Database
* *
* $data = DBA::select($table, $fields, $condition, $params); * $data = DBA::select($table, $fields, $condition, $params);
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $fields Array of selected fields, empty for all * @param array $fields Array of selected fields, empty for all
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* @return boolean|object * @return boolean|object
* @throws \Exception * @throws \Exception
*/ */
public function select($table, array $fields = [], array $condition = [], array $params = []) public function select(string $table, array $fields = [], array $condition = [], array $params = [])
{ {
if (empty($table)) { if (empty($table)) {
return false; return false;
@ -1489,7 +1486,7 @@ class Database
$select_string = '*'; $select_string = '*';
} }
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$condition_string = DBA::buildCondition($condition); $condition_string = DBA::buildCondition($condition);
@ -1509,9 +1506,9 @@ class Database
/** /**
* Counts the rows from a table satisfying the provided condition * Counts the rows from a table satisfying the provided condition
* *
* @param string|array $table Table name or array [schema => table] * @param string $table Table name in format schema.table (while scheme is optiona)
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* *
* @return int Count of rows * @return int Count of rows
* *
@ -1525,13 +1522,13 @@ class Database
* $count = DBA::count($table, $condition); * $count = DBA::count($table, $condition);
* @throws \Exception * @throws \Exception
*/ */
public function count($table, array $condition = [], array $params = []): int public function count(string $table, array $condition = [], array $params = []): int
{ {
if (empty($table)) { if (empty($table)) {
throw new InvalidArgumentException('Parameter "table" cannot be empty.'); throw new InvalidArgumentException('Parameter "table" cannot be empty.');
} }
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString([$table]);
$condition_string = DBA::buildCondition($condition); $condition_string = DBA::buildCondition($condition);
@ -1619,7 +1616,7 @@ class Database
return $fields; return $fields;
} }
foreach(array_keys($fields) as $field) { foreach (array_keys($fields) as $field) {
if (!empty($views[$table]['fields'][$field])) { if (!empty($views[$table]['fields'][$field])) {
$viewdef = $views[$table]['fields'][$field]; $viewdef = $views[$table]['fields'][$field];
if (!empty($tables[$viewdef[0]]['fields'][$viewdef[1]]['type'])) { if (!empty($tables[$viewdef[0]]['fields'][$viewdef[1]]['type'])) {
@ -1823,14 +1820,14 @@ class Database
/** /**
* Replaces a string in the provided fields of the provided table * Replaces a string in the provided fields of the provided table
* *
* @param string $table_name Table name * @param string $table Table name
* @param array $fields List of field names in the provided table * @param array $fields List of field names in the provided table
* @param string $search * @param string $search String to search for
* @param string $replace * @param string $replace String to replace with
* @return void * @return void
* @throws \Exception * @throws \Exception
*/ */
public function replaceInTableFields(string $table_name, array $fields, string $search, string $replace) public function replaceInTableFields(string $table, array $fields, string $search, string $replace)
{ {
$search = $this->escape($search); $search = $this->escape($search);
$replace = $this->escape($replace); $replace = $this->escape($replace);
@ -1843,9 +1840,9 @@ class Database
$upds = implode(', ', $upd); $upds = implode(', ', $upd);
$r = $this->e(sprintf("UPDATE %s SET %s;", DBA::quoteIdentifier($table_name), $upds)); $r = $this->e(sprintf("UPDATE %s SET %s;", DBA::quoteIdentifier($table), $upds));
if (!$this->isResult($r)) { if (!$this->isResult($r)) {
throw new \RuntimeException("Failed updating `$table_name`: " . $this->errorMessage()); throw new \RuntimeException("Failed updating `$table`: " . $this->errorMessage());
} }
} }
} }

View file

@ -183,7 +183,7 @@ class View
*/ */
private static function isView(string $view): bool private static function isView(string $view): bool
{ {
$status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'], $status = DBA::selectFirst('INFORMATION_SCHEMA.TABLES', ['TABLE_TYPE'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $view]); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $view]);
if (empty($status['TABLE_TYPE'])) { if (empty($status['TABLE_TYPE'])) {
@ -201,7 +201,7 @@ class View
*/ */
private static function isTable(string $table): bool private static function isTable(string $table): bool
{ {
$status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'], $status = DBA::selectFirst('INFORMATION_SCHEMA.TABLES', ['TABLE_TYPE'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $table]); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $table]);
if (empty($status['TABLE_TYPE'])) { if (empty($status['TABLE_TYPE'])) {

View file

@ -54,12 +54,12 @@ class Summary extends BaseAdmin
$warningtext[] = DI::l10n()->t('Template engine (%s) error: %s', $templateEngine::$name, $error); $warningtext[] = DI::l10n()->t('Template engine (%s) error: %s', $templateEngine::$name, $error);
} }
if (DBA::count(['information_schema' => 'tables'], ['engine' => 'myisam', 'table_schema' => DBA::databaseName()])) { if (DBA::count('information_schema.tables', ['engine' => 'myisam', 'table_schema' => DBA::databaseName()])) {
$warningtext[] = DI::l10n()->t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); $warningtext[] = DI::l10n()->t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html');
} }
// are there InnoDB tables in Antelope in the DB? If so, trigger a warning message // are there InnoDB tables in Antelope in the DB? If so, trigger a warning message
if (DBA::count(['information_schema' => 'tables'], ['ENGINE' => 'InnoDB', 'ROW_FORMAT' => ['COMPACT', 'REDUNDANT'], 'table_schema' => DBA::databaseName()])) { if (DBA::count('information_schema.tables', ['ENGINE' => 'InnoDB', 'ROW_FORMAT' => ['COMPACT', 'REDUNDANT'], 'table_schema' => DBA::databaseName()])) {
$warningtext[] = DI::l10n()->t('Your DB still runs with InnoDB tables in the Antelope file format. You should change the file format to Barracuda. Friendica is using features that are not provided by the Antelope format. See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html'); $warningtext[] = DI::l10n()->t('Your DB still runs with InnoDB tables in the Antelope file format. You should change the file format to Barracuda. Friendica is using features that are not provided by the Antelope format. See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html');
} }

View file

@ -904,12 +904,12 @@ class DFRN
XML::addElement($doc, $entry, "activity:object-type", Activity\ObjectType::COMMENT); XML::addElement($doc, $entry, "activity:object-type", Activity\ObjectType::COMMENT);
} }
$actobj = self::createActivity($doc, "activity:object", $item['object'], $item['uri-id']); $actobj = self::createActivity($doc, "activity:object", $item['object'] ?? '', $item['uri-id']);
if ($actobj) { if ($actobj) {
$entry->appendChild($actobj); $entry->appendChild($actobj);
} }
$actarg = self::createActivity($doc, "activity:target", $item['target'], $item['uri-id']); $actarg = self::createActivity($doc, "activity:target", $item['target'] ?? '', $item['uri-id']);
if ($actarg) { if ($actarg) {
$entry->appendChild($actarg); $entry->appendChild($actarg);
} }

View file

@ -119,7 +119,7 @@ abstract class MailBuilder
{ {
$this->recipientUid = $user['uid'] ?? 0; $this->recipientUid = $user['uid'] ?? 0;
try { try {
$this->l10n = $user['language'] ? $this->l10n->withLang($user['language']) : $this->l10n; $this->l10n = isset($user['language']) ? $this->l10n->withLang($user['language']) : $this->l10n;
} catch (Exception $e) { } catch (Exception $e) {
$this->logger->warning('cannot use language.', ['user' => $user, 'exception' => $e]); $this->logger->warning('cannot use language.', ['user' => $user, 'exception' => $e]);
} }

View file

@ -101,7 +101,7 @@ class ParseUrl
* @see ParseUrl::getSiteinfo() for more information about scraping * @see ParseUrl::getSiteinfo() for more information about scraping
* embeddable content * embeddable content
*/ */
public static function getSiteinfoCached($url, $do_oembed = true): array public static function getSiteinfoCached(string $url, bool $do_oembed = true): array
{ {
if (empty($url)) { if (empty($url)) {
return [ return [
@ -180,7 +180,7 @@ class ParseUrl
* </body> * </body>
* @endverbatim * @endverbatim
*/ */
public static function getSiteinfo($url, $do_oembed = true, $count = 1) public static function getSiteinfo(string $url, bool $do_oembed = true, int $count = 1)
{ {
if (empty($url)) { if (empty($url)) {
return [ return [
@ -633,15 +633,16 @@ class ParseUrl
* @param string $string Tags * @param string $string Tags
* @return array with formatted Hashtags * @return array with formatted Hashtags
*/ */
public static function convertTagsToArray($string) public static function convertTagsToArray(string $string): array
{ {
$arr_tags = str_getcsv($string); $arr_tags = str_getcsv($string);
if (count($arr_tags)) { if (count($arr_tags)) {
// add the # sign to every tag // add the # sign to every tag
array_walk($arr_tags, ["self", "arrAddHashes"]); array_walk($arr_tags, ['self', 'arrAddHashes']);
return $arr_tags; return $arr_tags;
} }
return [];
} }
/** /**
@ -653,9 +654,9 @@ class ParseUrl
* @param int $k Counter for internal use * @param int $k Counter for internal use
* @return void * @return void
*/ */
private static function arrAddHashes(&$tag, $k) private static function arrAddHashes(string &$tag, int $k)
{ {
$tag = "#" . $tag; $tag = '#' . $tag;
} }
/** /**
@ -672,41 +673,41 @@ class ParseUrl
* *
* @return string The url with a scheme * @return string The url with a scheme
*/ */
private static function completeUrl($url, $scheme) private static function completeUrl(string $url, string $scheme): string
{ {
$urlarr = parse_url($url); $urlarr = parse_url($url);
// If the url does allready have an scheme // If the url does allready have an scheme
// we can stop the process here // we can stop the process here
if (isset($urlarr["scheme"])) { if (isset($urlarr['scheme'])) {
return($url); return $url;
} }
$schemearr = parse_url($scheme); $schemearr = parse_url($scheme);
$complete = $schemearr["scheme"]."://".$schemearr["host"]; $complete = $schemearr['scheme'] . '://' . $schemearr['host'];
if (!empty($schemearr["port"])) { if (!empty($schemearr['port'])) {
$complete .= ":".$schemearr["port"]; $complete .= ':' . $schemearr['port'];
} }
if (!empty($urlarr["path"])) { if (!empty($urlarr['path'])) {
if (strpos($urlarr["path"], "/") !== 0) { if (strpos($urlarr['path'], '/') !== 0) {
$complete .= "/"; $complete .= '/';
} }
$complete .= $urlarr["path"]; $complete .= $urlarr['path'];
} }
if (!empty($urlarr["query"])) { if (!empty($urlarr['query'])) {
$complete .= "?".$urlarr["query"]; $complete .= '?' . $urlarr['query'];
} }
if (!empty($urlarr["fragment"])) { if (!empty($urlarr['fragment'])) {
$complete .= "#".$urlarr["fragment"]; $complete .= '#' . $urlarr['fragment'];
} }
return($complete); return $complete;
} }
/** /**
@ -716,7 +717,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseParts(array $siteinfo, array $jsonld) private static function parseParts(array $siteinfo, array $jsonld): array
{ {
if (!empty($jsonld['@graph']) && is_array($jsonld['@graph'])) { if (!empty($jsonld['@graph']) && is_array($jsonld['@graph'])) {
foreach ($jsonld['@graph'] as $part) { foreach ($jsonld['@graph'] as $part) {
@ -761,7 +762,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLd(array $siteinfo, array $jsonld) private static function parseJsonLd(array $siteinfo, array $jsonld): array
{ {
$type = JsonLD::fetchElement($jsonld, '@type'); $type = JsonLD::fetchElement($jsonld, '@type');
if (empty($type)) { if (empty($type)) {
@ -854,7 +855,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdAuthor(array $siteinfo, array $jsonld) private static function parseJsonLdAuthor(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -938,7 +939,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdArticle(array $siteinfo, array $jsonld) private static function parseJsonLdArticle(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -1008,7 +1009,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdWebPage(array $siteinfo, array $jsonld) private static function parseJsonLdWebPage(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -1047,7 +1048,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdWebSite(array $siteinfo, array $jsonld) private static function parseJsonLdWebSite(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -1085,7 +1086,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdWebOrganization(array $siteinfo, array $jsonld) private static function parseJsonLdWebOrganization(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -1131,7 +1132,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdWebPerson(array $siteinfo, array $jsonld) private static function parseJsonLdWebPerson(array $siteinfo, array $jsonld): array
{ {
$jsonldinfo = []; $jsonldinfo = [];
@ -1176,7 +1177,7 @@ class ParseUrl
* @param array $jsonld * @param array $jsonld
* @return array siteinfo * @return array siteinfo
*/ */
private static function parseJsonLdMediaObject(array $siteinfo, array $jsonld, string $name) private static function parseJsonLdMediaObject(array $siteinfo, array $jsonld, string $name): array
{ {
$media = []; $media = [];

View file

@ -97,7 +97,8 @@ class PidFile
* *
* @return boolean|string PID or "false" if not created * @return boolean|string PID or "false" if not created
*/ */
static public function create($file) { static public function create(string $file)
{
$pid = self::pidFromFile($file); $pid = self::pidFromFile($file);
// We have a process id? then we quit // We have a process id? then we quit
@ -119,7 +120,8 @@ class PidFile
* *
* @return boolean Is it running? * @return boolean Is it running?
*/ */
static public function delete($file) { static public function delete(string $file): bool
{
return @unlink($file); return @unlink($file);
} }
} }

View file

@ -45,7 +45,7 @@ class StaticDatabase extends Database
/** /**
* Override the behaviour of connect, due there is just one, static connection at all * Override the behaviour of connect, due there is just one, static connection at all
* *
* @return bool|void * @return bool Success
*/ */
public function connect(): bool public function connect(): bool
{ {
@ -179,7 +179,18 @@ class StaticDatabase extends Database
self::$staticConnection = @new ExtendedPDO($connect, $user, $pass); self::$staticConnection = @new ExtendedPDO($connect, $user, $pass);
self::$staticConnection->setAttribute(PDO::ATTR_AUTOCOMMIT,0); self::$staticConnection->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
} catch (PDOException $e) { } catch (PDOException $e) {
/// @TODO At least log exception, don't ignore it! /*
* @TODO Try to find a way to log this exception as it contains valueable information
* @nupplaphil@github.com comment:
*
* There is no easy possibility to add a logger here, that's why
* there isn't any yet and instead a placeholder.. This execution
* point is a critical state during a testrun, and tbh I'd like to
* leave here no further logic (yet) because I spent hours debugging
* cases, where transactions weren't fully closed and
* strange/unpredictable errors occur (sometimes -mainly during
* debugging other errors :) ...)
*/
} }
} }