| Current Path : /var/www/cesa.co.za/php/includes/ |
| Current File : /var/www/cesa.co.za/php/includes/KeyValue.php |
<?php
/*
* Contact otto@igotafrica.com for details
*/
/**
* Manage the key_value table.
*
* @author otto
*/
class KeyValue extends BaseTableClass
{
private $tableName = 'key_value';
private $tableColumns = null;
private function getTableColumns()
{
if (is_array($this->tableColumns)) {
return $this->tableColumns;
}
$columns = array();
$result = $this->sqlf->getAll("SHOW COLUMNS FROM " . $this->tableName);
if (is_array($result)) {
foreach ($result as $column) {
if (!empty($column['Field'])) {
$columns[$column['Field']] = $column;
}
}
}
$this->tableColumns = $columns;
return $this->tableColumns;
}
private function hasColumn($columnName)
{
$columns = $this->getTableColumns();
return isset($columns[$columnName]);
}
private function generateUuidV4()
{
$data = random_bytes(16);
$data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
$data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
public function findOneByKeyValueName($keyValueName)
{
$keyValueName = trim((string)$keyValueName);
if ($keyValueName === '') {
return null;
}
return $this->sqlf->getRow(
"SELECT * FROM " . $this->tableName
. " WHERE key_value_name = " . $this->sqlf->qstr($keyValueName)
. " LIMIT 1"
);
}
public function getKeysByStartValue($keyValueStart)
{
$keyValueStart = trim((string)$keyValueStart);
if ($keyValueStart === '') {
return array();
}
return $this->sqlf->getAll(
"SELECT * FROM " . $this->tableName
. " WHERE key_value_name LIKE " . $this->sqlf->qstr($keyValueStart . '%')
. " ORDER BY key_value_name ASC"
);
}
public function getKeyValue($keyValueName, $default = '', $isArray = false)
{
$row = $this->findOneByKeyValueName($keyValueName);
if (!is_array($row) || count($row) === 0) {
return $default;
}
$value = (string)($row['key_value'] ?? '');
if ($value === '') {
return $default;
}
if ($isArray) {
$decoded = json_decode($value, true);
if (is_array($decoded)) {
return $decoded;
}
return is_array($default) ? $default : array();
}
return $value;
}
public function setKeyValue($keyValueName, $keyValueData, $isArray = false, $createdBy = '')
{
$keyValueName = trim((string)$keyValueName);
if ($keyValueName === '') {
return false;
}
if ($isArray) {
$keyValueData = json_encode($keyValueData);
}
if (!is_string($keyValueData)) {
$keyValueData = strval($keyValueData);
}
$existing = $this->findOneByKeyValueName($keyValueName);
$columns = $this->getTableColumns();
$now = date('Y-m-d H:i:s');
if (is_array($existing) && count($existing) > 0) {
$record = array(
'key_value_name' => $keyValueName,
'key_value' => $keyValueData
);
if ($this->hasColumn('created_by')) {
$record['created_by'] = (string)$createdBy;
}
if ($this->hasColumn('updated_at')) {
$record['updated_at'] = $now;
}
$where = '';
if ($this->hasColumn('id') && isset($existing['id']) && trim((string)$existing['id']) !== '') {
$where = "id = " . $this->sqlf->qstr((string)$existing['id']);
} else {
$where = "key_value_name = " . $this->sqlf->qstr($keyValueName);
}
$this->sqlf->autoExecute($this->tableName, $record, 'UPDATE', $where, 'id');
return true;
}
$record = array(
'key_value_name' => $keyValueName,
'key_value' => $keyValueData
);
if ($this->hasColumn('created_by')) {
$record['created_by'] = (string)$createdBy;
}
if ($this->hasColumn('created_at')) {
$record['created_at'] = $now;
}
if ($this->hasColumn('updated_at')) {
$record['updated_at'] = $now;
}
if ($this->hasColumn('id')) {
$idColumn = $columns['id'];
$idDefault = $idColumn['Default'] ?? null;
$idNull = $idColumn['Null'] ?? 'YES';
if (($idDefault === null || $idDefault === '') && strtoupper((string)$idNull) === 'NO') {
$record['id'] = $this->generateUuidV4();
}
}
$this->sqlf->autoExecute($this->tableName, $record, 'INSERT', null, 'id');
return true;
}
}