first commit
This commit is contained in:
277
class/class.DatabaseCommunication.php
Normal file
277
class/class.DatabaseCommunication.php
Normal file
@@ -0,0 +1,277 @@
|
||||
<?php
|
||||
|
||||
trait DatabaseCommunication
|
||||
{
|
||||
public function insertSQL($table, $SQLFields, $except = [], $types = [])
|
||||
{
|
||||
wpj_debug(['insertSQL', 'table' => $table, 'SQLFields' => $SQLFields, 'except' => $except, 'types' => $types]);
|
||||
$conn = $this->getDbalConnection();
|
||||
|
||||
return $conn->insert(getTableName($table), $this->escapeFields($this->excludeFields($SQLFields, $except)), $types);
|
||||
}
|
||||
|
||||
public function updateSQL($table, $SQLFields, $idArray, $except = [], $types = [])
|
||||
{
|
||||
wpj_debug(['updateSQL', 'table' => $table, 'SQLFields' => $SQLFields, 'idArray' => $idArray, 'except' => $except, 'types' => $types]);
|
||||
$conn = $this->getDbalConnection();
|
||||
|
||||
return $conn->update(getTableName($table), $this->escapeFields($this->excludeFields($SQLFields, $except)), $idArray, $types);
|
||||
}
|
||||
|
||||
public function deleteSQL($table, $idArray)
|
||||
{
|
||||
wpj_debug(['deleteSQL', 'table' => $table, 'idArray' => $idArray]);
|
||||
$conn = $this->getDbalConnection();
|
||||
|
||||
return $conn->delete(getTableName($table), $idArray);
|
||||
}
|
||||
|
||||
public function replaceSQL($table, $SQLFields, $except = [], $types = [])
|
||||
{
|
||||
wpj_debug(['replaceSQL', 'table' => $table, 'SQLFields' => $SQLFields, 'except' => $except, 'types' => $types]);
|
||||
$conn = $this->getDbalConnection();
|
||||
$values = $this->escapeFields($this->excludeFields($SQLFields, $except));
|
||||
|
||||
return $conn->executeUpdate("REPLACE INTO {$table}".$this->createInsert($values), $values, $types);
|
||||
}
|
||||
|
||||
public function selectSQL($table, $idArray, $fields = null)
|
||||
{
|
||||
wpj_debug(['selectSQL', 'table' => $table, 'idArray' => $idArray, 'fields' => $fields]);
|
||||
if ($fields) {
|
||||
if (is_string(array_keys($fields)[0])) {
|
||||
$fields = join(',', array_map(function ($alias, $value) {
|
||||
return "{$value} as {$alias}";
|
||||
}, array_keys($fields), $fields));
|
||||
} else {
|
||||
$fields = join(',', $fields);
|
||||
}
|
||||
} else {
|
||||
$fields = '*';
|
||||
}
|
||||
|
||||
$conn = $this->getDbalConnection();
|
||||
$sql = "SELECT {$fields} FROM ".getTableName($table).' WHERE '.$this->createWhere($idArray);
|
||||
|
||||
return $conn->executeQuery($sql, $idArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Doctrine\DBAL\Query\QueryBuilder
|
||||
*/
|
||||
public function getQueryBuilder()
|
||||
{
|
||||
return sqlQueryBuilder();
|
||||
}
|
||||
|
||||
public function getConnection()
|
||||
{
|
||||
return $this->getDbalConnection();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Doctrine\DBAL\Connection
|
||||
*/
|
||||
public function getDbalConnection()
|
||||
{
|
||||
$conn = sqlGetConnection();
|
||||
|
||||
static $initialized = false;
|
||||
if (!$initialized) {
|
||||
$platform = $conn->getDatabasePlatform();
|
||||
$platform->registerDoctrineTypeMapping('enum', 'string');
|
||||
$platform->registerDoctrineTypeMapping('point', 'string');
|
||||
|
||||
$initialized = true;
|
||||
}
|
||||
|
||||
return $conn;
|
||||
}
|
||||
|
||||
public function escapeFields($fields)
|
||||
{
|
||||
return array_combine(
|
||||
array_map(function ($field) {
|
||||
switch ($field) {
|
||||
case 'interval':
|
||||
case 'number':
|
||||
case 'set':
|
||||
return "`{$field}`";
|
||||
|
||||
default:
|
||||
return $field;
|
||||
}
|
||||
}, array_keys($fields)),
|
||||
array_values($fields));
|
||||
}
|
||||
|
||||
public function filterFields($values, $fields)
|
||||
{
|
||||
return array_intersect_key($values, array_flip($fields));
|
||||
}
|
||||
|
||||
public function excludeFields($values, $fields)
|
||||
{
|
||||
return array_diff_key($values, array_flip($fields));
|
||||
}
|
||||
|
||||
public function createWhere($values)
|
||||
{
|
||||
$ret = [];
|
||||
|
||||
foreach ($values as $field => $value) {
|
||||
$param = $field;
|
||||
if (($pos = strpos($param, '.')) !== false) {
|
||||
$param = substr($param, $pos + 1);
|
||||
}
|
||||
|
||||
if ($value === null) {
|
||||
$ret[] = "{$field} IS NULL";
|
||||
} else {
|
||||
$ret[] = "{$field} = :{$param}";
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($ret)) {
|
||||
$ret[] = '1=1';
|
||||
}
|
||||
|
||||
return join(' AND ', $ret);
|
||||
}
|
||||
|
||||
public function createUpdate($values)
|
||||
{
|
||||
return join(', ', array_map(function ($field) {
|
||||
return "{$field} = :{$field}";
|
||||
}, array_keys($values)));
|
||||
}
|
||||
|
||||
public function createInsert($values)
|
||||
{
|
||||
$fields = array_keys($this->escapeFields($values));
|
||||
|
||||
return '('.join(', ', $fields).') VALUES ('.join(', ', array_map(function ($x) {
|
||||
return ':'.$x;
|
||||
}, $fields)).')';
|
||||
}
|
||||
|
||||
public function fetchObject($table, $ID)
|
||||
{
|
||||
$SQL = sqlQuery('SELECT * FROM '.getTableName($table)." WHERE id='{$ID}' ");
|
||||
if (sqlNumRows($SQL) == 1) {
|
||||
return sqlFetchAssoc($SQL);
|
||||
}
|
||||
}
|
||||
|
||||
public function preparePrice(&$price)
|
||||
{
|
||||
if (($price === '') || ($price === null)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $price = floatval(preg_replace('/[^\d\.-]/', '', str_replace(',', '.', $price)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $price array [value, with_vat, vat]
|
||||
*
|
||||
* @return Decimal
|
||||
*/
|
||||
public function prepareVatPrice($price)
|
||||
{
|
||||
if ($price['value'] === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$dbcfg = Settings::getDefault();
|
||||
$priceWithVat = $price['with_vat'] ?? ($dbcfg['prod_prefer_price_vat'] == 'Y' || $dbcfg['prod_prefer_price_vat'] == 'F');
|
||||
$vat = $price['vat'] ?? getAdminVat()['value'];
|
||||
$price = toDecimal($this->preparePrice($price['value']));
|
||||
if ($priceWithVat) {
|
||||
$price = $price->removeVat($vat);
|
||||
}
|
||||
|
||||
return $price;
|
||||
}
|
||||
|
||||
public function prepareInt(&$number, $default = 0)
|
||||
{
|
||||
if (!is_numeric($number)) {
|
||||
$number = $default;
|
||||
}
|
||||
|
||||
return $number = intval(str_replace([',', ' '], ['.', ''], $number));
|
||||
}
|
||||
|
||||
public function prepareBoolean(&$bool)
|
||||
{
|
||||
return $bool = ($bool == 'Y' || $bool == '1') ? 1 : 0;
|
||||
}
|
||||
|
||||
public function prepareYesNo(&$bool)
|
||||
{
|
||||
$this->prepareBoolean($bool);
|
||||
|
||||
return $bool ? 'Y' : 'N';
|
||||
}
|
||||
|
||||
public function prepareNull(&$value)
|
||||
{
|
||||
$value = trim($value);
|
||||
|
||||
return $value = $value == '' ? null : $value;
|
||||
}
|
||||
|
||||
public function prepareDate($date)
|
||||
{
|
||||
if (empty($date)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (!$date instanceof DateTime) {
|
||||
$date = DateTime::createFromFormat(Settings::getDateFormat(), $date);
|
||||
if ($date == false) {
|
||||
$date = new DateTime();
|
||||
}
|
||||
}
|
||||
|
||||
return $date->format('Y-m-d');
|
||||
}
|
||||
|
||||
public function prepareDateTime($datetime)
|
||||
{
|
||||
if (empty($datetime)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (!$datetime instanceof DateTimeInterface) {
|
||||
$format = Settings::getDateFormat().' '.Settings::getTimeFormat();
|
||||
|
||||
$datetime = DateTime::createFromFormat($format, $datetime);
|
||||
if ($datetime == false) {
|
||||
$datetime = new DateTime();
|
||||
}
|
||||
}
|
||||
|
||||
return $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Doctrine\DBAL\DBALException $e
|
||||
*/
|
||||
public function translateException($e)
|
||||
{
|
||||
$exception = $e->getPrevious();
|
||||
switch (intval($exception->errorInfo[1])) {
|
||||
case 1062:
|
||||
// Message: Duplicate entry '17-ZE523' for key 'id_supplier_2'
|
||||
preg_match("/Duplicate entry '([^']+)' for key '([^']+)'/", $exception->errorInfo[2], $matches);
|
||||
$ErrStr = "Duplicitni kombinace {$matches[1]}";
|
||||
|
||||
return $ErrStr;
|
||||
|
||||
default:
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user