Your IP : 216.73.217.79


Current Path : /var/www/cesa.co.za/php/includes/
Upload File :
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;
    }
}