From 98e04da076c502d4f6be2c8ed93565a7e12540bf Mon Sep 17 00:00:00 2001
From: markjcrane
Date: Wed, 26 Nov 2025 07:19:30 -0700
Subject: [PATCH] Format code with PHP Formatter - pretty-php
---
resources/classes/database.php | 2959 ++++++++++++++++----------------
1 file changed, 1473 insertions(+), 1486 deletions(-)
diff --git a/resources/classes/database.php b/resources/classes/database.php
index cdec798935..b068bdf9e6 100644
--- a/resources/classes/database.php
+++ b/resources/classes/database.php
@@ -1,29 +1,30 @@
- Copyright (C) 2010 - 2025
- All Rights Reserved.
-
- Contributor(s):
- Mark J Crane
- Luis Daniel Lucio Quiroz
-*/
+ * FusionPBX
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FusionPBX
+ *
+ * The Initial Developer of the Original Code is
+ * Mark J Crane
+ * Copyright (C) 2010 - 2025
+ * All Rights Reserved.
+ *
+ * Contributor(s):
+ * Mark J Crane
+ * Luis Daniel Lucio Quiroz
+ */
/**
* Database class
@@ -31,11 +32,8 @@
* @property $name Alias of app_name
*/
class database {
+ const TABLE_PREFIX = 'v_';
- /**
- *
- */
- const TABLE_PREFIX = "v_";
/**
* Stores the application built from the app_config files.
*
@@ -44,12 +42,14 @@ class database {
* @var array
*/
private static $apps = [];
+
/**
* Singleton type class
*
* @var database
*/
private static $database;
+
/**
* Database connection
*
@@ -57,6 +57,7 @@ class database {
* @var PDO object
*/
public $db;
+
/**
* Driver to use.
*
@@ -64,6 +65,7 @@ class database {
* @var string Can be pgsql, mysql, sqlite, odbc
*/
public $driver;
+
/**
* Alias of driver.
*
@@ -72,6 +74,7 @@ class database {
* @var string Can be pgsql, mysql, sqlite, odbc
*/
public $type;
+
/**
* Host for database connection
*
@@ -79,6 +82,7 @@ class database {
* @var string host name or IP address.
*/
public $host;
+
/**
* Port number
*
@@ -86,6 +90,7 @@ class database {
* @var int 1025 - 65534
*/
public $port;
+
/**
* Database name
*
@@ -93,6 +98,7 @@ class database {
* @var string
*/
public $db_name;
+
/**
* Database security
*
@@ -100,6 +106,7 @@ class database {
* @var boolean
*/
public $db_secure;
+
/**
* Specifies the file name of the client SSL certificate
*
@@ -107,6 +114,7 @@ class database {
* @var string full path
*/
public $db_cert_authority;
+
/**
* Username used to connect
*
@@ -114,6 +122,7 @@ class database {
* @var string
*/
public $username;
+
/**
* Password used to connect
*
@@ -121,14 +130,16 @@ class database {
* @var string
*/
public $password;
+
/**
* Full path to file name.
*
* @access public
* @var string full path to file name
*/
- public $path; //array
-/**
+ public $path;
+
+ /**
* Where clause(s) of an SQL statement.
* Array of arrays must be passed with each having the
* following keys:
@@ -147,8 +158,9 @@ class database {
* @see $order_by
* @var array Two dimensional array of key value pairs
*/
- public $where; //array
-/**
+ public $where; // array
+
+ /**
* Order By clause(s) of an SQL statement.
*
Array of arrays must be passed with each having the
* following keys:
@@ -168,6 +180,7 @@ class database {
* @var array Two dimensional array of key value pairs
*/
public $order_by;
+
/**
* Ascending or Descending order.
*
@@ -175,6 +188,7 @@ class database {
* @access public
*/
public $order_type;
+
/**
* Numerical value to limit returned results.
*
@@ -182,6 +196,7 @@ class database {
* @access public
*/
public $limit;
+
/**
* Numerical value to offset returned results.
*
@@ -189,6 +204,7 @@ class database {
* @access public
*/
public $offset;
+
/**
*
Array of fields.
* Fields are specified in 'name'=>'value' format.
@@ -200,6 +216,7 @@ class database {
* @var array Array of columns
*/
public $fields;
+
/**
* Unknown property
*
@@ -207,6 +224,7 @@ class database {
* @access public
*/
public $count;
+
/**
* Unknown property
*
@@ -214,6 +232,7 @@ class database {
* @access public
*/
public $sql;
+
/**
* Stores the application name making the request.
*
@@ -221,6 +240,7 @@ class database {
* @access public
*/
public $name;
+
/**
* Stores the application name making the request.
*
@@ -229,6 +249,7 @@ class database {
* @var string App name making database request.
*/
public $app_name;
+
/**
* Stores the application UUID making the request.
*
@@ -237,6 +258,7 @@ class database {
* @var string
*/
public $app_uuid;
+
/**
*
Stores the domain UUID making the request.
* This is defaulted to the Session domain UUID.
@@ -246,6 +268,7 @@ class database {
* @var string Domain UUID making request.
*/
public $domain_uuid;
+
/**
* Stores the user UUID making the request.
* This is defaulted to the Session domain UUID.
@@ -255,6 +278,7 @@ class database {
* @var string Domain UUID making request.
*/
public $user_uuid;
+
/**
* Message for the query results.
*
@@ -262,12 +286,14 @@ class database {
* @access private
*/
public $message;
+
/**
* SSL Mode used to connect to the database
*
* @var string prefer or verify-ca. Default is 'prefer'
*/
public $ssl_mode;
+
/**
* Table name.
*
@@ -275,6 +301,7 @@ class database {
* @var string sanitized
*/
private $table;
+
/**
* Stores the result from the most recent query. The type will be based on what was requested.
* NOTE: If an error occurred on the last query the result is set to an empty string.
@@ -282,6 +309,7 @@ class database {
* @var mixed
*/
private $result;
+
/**
* Config object used to get the database connection params
*
@@ -297,16 +325,15 @@ class database {
* @param array $params An optional array of settings to override default values. Defaults to [].
*/
public function __construct(array $params = []) {
-
- //handle the config object
+ // handle the config object
if (isset($params['config'])) {
$config = $params['config'];
} else {
- //use singleton config
+ // use singleton config
$config = config::load();
}
- //driver and type point to the same value
+ // driver and type point to the same value
$this->driver = $config->get('database.0.type', 'pgsql');
$this->type = $config->get('database.0.type', 'pgsql');
$this->host = $config->get('database.0.host', '127.0.0.1');
@@ -318,27 +345,27 @@ class database {
$this->db_cert_authority = $config->get('database.0.cert_authority', '');
$this->ssl_mode = $config->get('database.0.ssl_mode', '');
- //save the reference to the single instance of the config to this object
+ // save the reference to the single instance of the config to this object
$this->config = $config;
- //connect to the database now
+ // connect to the database now
$this->connect();
- //set the user_uuid
+ // set the user_uuid
if (!empty($params['user_uuid'])) {
- //use the parameter as the first priority when available
+ // use the parameter as the first priority when available
$this->user_uuid = $params['user_uuid'];
} elseif (!empty($_SESSION['user_uuid'])) {
- //use the session when available
+ // use the session when available
$this->user_uuid = $_SESSION['user_uuid'];
}
- //set the domain_uuid
+ // set the domain_uuid
if (!empty($params['domain_uuid'])) {
- //use the parameter as the first priority when available
+ // use the parameter as the first priority when available
$this->domain_uuid = $params['domain_uuid'];
} elseif (!empty($_SESSION['domain_uuid'])) {
- //use the session when available
+ // use the session when available
$this->domain_uuid = $_SESSION['domain_uuid'];
}
}
@@ -349,29 +376,27 @@ class database {
* For types other than sqlite. Execution will stop on failure.
*
* @depends database::driver Alias of database::type.
- *
*/
public function connect() {
+ // get the database connection settings
+ // $db_type = $conf['database.0.type'];
+ // $db_host = $conf['database.0.host'];
+ // $db_port = $conf['database.0.port'];
+ // $db_name = $conf['database.0.name'];
+ // $db_username = $conf['database.0.username'];
+ // $db_password = $conf['database.0.password'];
- //get the database connection settings
- //$db_type = $conf['database.0.type'];
- //$db_host = $conf['database.0.host'];
- //$db_port = $conf['database.0.port'];
- //$db_name = $conf['database.0.name'];
- //$db_username = $conf['database.0.username'];
- //$db_password = $conf['database.0.password'];
+ // debug info
+ // echo "db type:".$db_type."\n";
+ // echo "db host:".$db_host."\n";
+ // echo "db port:".$db_port."\n";
+ // echo "db name:".$db_name."\n";
+ // echo "db username:".$db_username."\n";
+ // echo "db password:".$db_password."\n";
+ // echo "db path:".$db_path."\n";
+ // echo "\n";
- //debug info
- //echo "db type:".$db_type."\n";
- //echo "db host:".$db_host."\n";
- //echo "db port:".$db_port."\n";
- //echo "db name:".$db_name."\n";
- //echo "db username:".$db_username."\n";
- //echo "db password:".$db_password."\n";
- //echo "db path:".$db_path."\n";
- //echo "\n";
-
- //set defaults
+ // set defaults
if (!isset($this->driver) && isset($db_type)) {
$this->driver = $db_type;
}
@@ -402,10 +427,10 @@ class database {
$this->path = $db_path;
}
- if ($this->driver == "sqlite") {
+ if ($this->driver == 'sqlite') {
if (empty($this->db_name)) {
- $server_name = $_SERVER["SERVER_NAME"];
- $server_name = str_replace("www.", "", $server_name);
+ $server_name = $_SERVER['SERVER_NAME'];
+ $server_name = str_replace('www.', '', $server_name);
$db_name_short = $server_name;
$this->db_name = $server_name . '.db';
} else {
@@ -413,13 +438,13 @@ class database {
}
$this->path = realpath($this->path);
if (file_exists($this->path . '/' . $this->db_name)) {
- //connect to the database
- $this->db = new PDO('sqlite:' . $this->path . '/' . $this->db_name); //sqlite 3
- //PRAGMA commands
+ // connect to the database
+ $this->db = new PDO('sqlite:' . $this->path . '/' . $this->db_name); // sqlite 3
+ // PRAGMA commands
$this->db->query('PRAGMA foreign_keys = ON;');
$this->db->query('PRAGMA journal_mode = wal;');
- //add additional functions to SQLite so that they are accessible inside SQL
- //bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] )
+ // add additional functions to SQLite so that they are accessible inside SQL
+ // bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] )
$this->db->sqliteCreateFunction('md5', 'php_md5', 1);
$this->db->sqliteCreateFunction('unix_timestamp', 'php_unix_timestamp', 1);
$this->db->sqliteCreateFunction('now', 'php_now', 0);
@@ -427,22 +452,22 @@ class database {
$this->db->sqliteCreateFunction('strleft', 'php_left', 2);
$this->db->sqliteCreateFunction('strright', 'php_right', 2);
} else {
- $error_message = "file not found";
+ $error_message = 'file not found';
$message['message'] = $error_message;
$this->message = $message;
return false;
}
}
- if ($this->driver == "mysql") {
+ if ($this->driver == 'mysql') {
try {
- //mysql pdo connection
+ // mysql pdo connection
if (strlen($this->host) == 0 && empty($this->port)) {
- //if both host and port are empty use the unix socket
+ // if both host and port are empty use the unix socket
$this->db = new PDO("mysql:host=$this->host;unix_socket=/var/run/mysqld/mysqld.sock;dbname=$this->db_name", $this->username, $this->password);
} else {
if (empty($this->port)) {
- //leave out port if it is empty
+ // leave out port if it is empty
$this->db = new PDO("mysql:host=$this->host;dbname=$this->db_name;", $this->username, $this->password, [
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION,
@@ -466,12 +491,12 @@ class database {
}
}
- if ($this->driver == "pgsql") {
- //database connection
+ if ($this->driver == 'pgsql') {
+ // database connection
try {
if (!empty($this->host)) {
if (empty($this->port)) {
- $this->port = "5432";
+ $this->port = '5432';
}
if ($this->db_secure === true) {
$this->db = new PDO("pgsql:host=$this->host port=$this->port dbname=$this->db_name user=$this->username password=$this->password sslmode=$this->ssl_mode sslrootcert=$this->db_cert_authority");
@@ -493,10 +518,10 @@ class database {
}
}
- if ($this->driver == "odbc") {
- //database connection
+ if ($this->driver == 'odbc') {
+ // database connection
try {
- $this->db = new PDO("odbc:" . $this->db_name, $this->username, $this->password);
+ $this->db = new PDO('odbc:' . $this->db_name, $this->username, $this->password);
} catch (PDOException $e) {
$message['message'] = $e->getMessage();
$message['code'] = $e->getCode();
@@ -509,7 +534,7 @@ class database {
}
}
- //connected to the database
+ // connected to the database
return true;
}
@@ -544,12 +569,12 @@ class database {
* @uses self::$apps directly
*/
public static function domain_uuid_exists($name) {
- //get the $apps array from the installed apps from the core and mod directories
+ // get the $apps array from the installed apps from the core and mod directories
if (count(self::$apps) == 0) {
self::get_apps();
}
- //search through all fields to see if domain_uuid exists
+ // search through all fields to see if domain_uuid exists
foreach (self::$apps as $x => &$app) {
if (is_array($app['db'])) {
foreach ($app['db'] as $y => $row) {
@@ -561,17 +586,17 @@ class database {
if ($table_name === self::TABLE_PREFIX . $name) {
if (is_array($row['fields'])) {
foreach ($row['fields'] as $field) {
- if ($field['name'] == "domain_uuid") {
+ if ($field['name'] == 'domain_uuid') {
return true;
}
- } //foreach
- } //is array
+ } // foreach
+ } // is array
}
- } //foreach
- } //is array
- } //foreach
+ } // foreach
+ } // is array
+ } // foreach
- //not found
+ // not found
return false;
}
@@ -588,8 +613,7 @@ class database {
* @see database::connect()
*/
public static function new(array $params = []) {
-
- //re-use the database connection
+ // re-use the database connection
if (self::$database === null) {
self::$database = new database($params);
if (!self::$database->is_connected()) {
@@ -597,21 +621,21 @@ class database {
}
}
- //set the user_uuid
+ // set the user_uuid
if (!empty($params['user_uuid'])) {
- //use the parameter as the first priority when available
+ // use the parameter as the first priority when available
self::$database->user_uuid = $params['user_uuid'];
} elseif (!empty($_SESSION['user_uuid'])) {
- //use the session when available
+ // use the session when available
self::$database->user_uuid = $_SESSION['user_uuid'];
}
- //set the domain_uuid
+ // set the domain_uuid
if (!empty($params['domain_uuid'])) {
- //use the parameter as the first priority when available
+ // use the parameter as the first priority when available
self::$database->domain_uuid = $params['domain_uuid'];
} elseif (!empty($_SESSION['domain_uuid'])) {
- //use the session when available
+ // use the session when available
self::$database->domain_uuid = $_SESSION['domain_uuid'];
}
@@ -629,13 +653,14 @@ class database {
public function is_connected(): bool {
try {
$stmt = false;
- if ($this->db !== null) $stmt = $this->db->query('SELECT 1');
+ if ($this->db !== null)
+ $stmt = $this->db->query('SELECT 1');
return $stmt !== false;
} catch (PDOException $ex) {
- //database is not connected
+ // database is not connected
return false;
} catch (Exception $e) {
- //some other error has occurred, so record it
+ // some other error has occurred, so record it
$message['message'] = $e->getMessage();
$message['code'] = $e->getCode();
$message['line'] = $e->getLine();
@@ -657,7 +682,7 @@ class database {
* @return mixed
*/
public function __get($name) {
- //remove any case statement below to remove access to the variable
+ // remove any case statement below to remove access to the variable
switch ($name) {
case 'name':
return $this->app_name;
@@ -744,10 +769,10 @@ class database {
$this->db_cert_authority = $value;
break;
case 'port':
- $value = (int)$value; // force cast to int
+ $value = (int) $value; // force cast to int
if ($value > 1023 && $value < 65536) {
$this->port = $value;
- } //valid values are 1024...65535
+ } // valid values are 1024...65535
else {
trigger_error('Port not a valid range', E_USER_ERROR);
}
@@ -769,7 +794,7 @@ class database {
$this->driver = $value;
break;
default:
- trigger_error("Type/Driver must be set to pgsql,mysql,sqlite,odbc", E_USER_ERROR);
+ trigger_error('Type/Driver must be set to pgsql,mysql,sqlite,odbc', E_USER_ERROR);
break;
}
case 'offset':
@@ -804,71 +829,70 @@ class database {
return preg_replace('#[^a-zA-Z0-9_\-]#', '', $value);
}
-/**
+ /**
* Counts the number of rows.
*
* @return int Represents the number of counted rows or -1 if failed.
*/
public function count() {
-
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //return if the table name is not set
+ // return if the table name is not set
if (empty($this->table)) {
return;
}
- //sanitize the table name
- //$this->table = self::sanitize($this->table); // no longer needed
+ // sanitize the table name
+ // $this->table = self::sanitize($this->table); // no longer needed
- //get the number of rows
- $sql = "select count(*) as num_rows from " . $this->table . " ";
+ // get the number of rows
+ $sql = 'select count(*) as num_rows from ' . $this->table . ' ';
$i = 0;
if (is_array($this->where)) {
foreach ($this->where as $row) {
- //sanitize the name
+ // sanitize the name
$row['name'] = self::sanitize($row['name']);
- //validate the operator
+ // validate the operator
switch ($row['operator']) {
- case "<":
+ case '<':
break;
- case ">":
+ case '>':
break;
- case "<=":
+ case '<=':
break;
- case ">=":
+ case '>=':
break;
- case "=":
+ case '=':
break;
- case "<>":
+ case '<>':
break;
- case "!=":
+ case '!=':
break;
default:
- //invalid operator
+ // invalid operator
return -1;
}
- //build the sql
+ // build the sql
if ($i == 0) {
- $sql .= "where " . $row['name'] . " " . $row['operator'] . " :" . $row['name'] . " ";
+ $sql .= 'where ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['name'] . ' ';
} else {
- $sql .= "and " . $row['name'] . " " . $row['operator'] . " :" . $row['name'] . " ";
+ $sql .= 'and ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['name'] . ' ';
}
- //add the name and value to the params array
+ // add the name and value to the params array
$params[$row['name']] = $row['value'];
- //increment $i
+ // increment $i
$i++;
}
}
- //unset($this->where); //should not be objects resposibility
+ // unset($this->where); //should not be objects resposibility
$prep_statement = $this->db->prepare($sql);
if ($prep_statement) {
if (!isset($params)) {
@@ -883,20 +907,18 @@ class database {
}
}
unset($prep_statement);
-
}
public function execute($sql, $parameters = null, $return_type = 'all') {
-
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //set the error mode
+ // set the error mode
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- //run the query, and return the results
+ // run the query, and return the results
try {
$prep_statement = $this->db->prepare($sql);
if (is_array($parameters)) {
@@ -904,15 +926,15 @@ class database {
} else {
$prep_statement->execute();
}
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["sql"] = $sql;
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['sql'] = $sql;
if (is_array($parameters)) {
- $message["parameters"] = $parameters;
+ $message['parameters'] = $parameters;
}
$this->message = $message;
- //return the results
+ // return the results
switch ($return_type) {
case 'all':
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
@@ -946,7 +968,7 @@ class database {
return $this->config;
}
- /**
+ /**
* Returns the table names from the database.
*
* @return array tables
@@ -954,39 +976,39 @@ class database {
*/
public function tables() {
$result = [];
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- if ($this->type == "sqlite") {
- $sql = "SELECT name FROM sqlite_master ";
+ if ($this->type == 'sqlite') {
+ $sql = 'SELECT name FROM sqlite_master ';
$sql .= "WHERE type='table' ";
- $sql .= "order by name;";
+ $sql .= 'order by name;';
}
- if ($this->type == "pgsql") {
- $sql = "select table_name as name ";
- $sql .= "from information_schema.tables ";
+ if ($this->type == 'pgsql') {
+ $sql = 'select table_name as name ';
+ $sql .= 'from information_schema.tables ';
$sql .= "where table_schema='public' ";
$sql .= "and table_type='BASE TABLE' ";
- $sql .= "order by table_name ";
+ $sql .= 'order by table_name ';
}
- if ($this->type == "mysql") {
- $sql = "show tables";
+ if ($this->type == 'mysql') {
+ $sql = 'show tables';
}
- if ($this->type == "mssql") {
- $sql = "SELECT * FROM sys.Tables order by name asc";
+ if ($this->type == 'mssql') {
+ $sql = 'SELECT * FROM sys.Tables order by name asc';
}
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute();
$tmp = $prep_statement->fetchAll(PDO::FETCH_NAMED);
- if ($this->type == "pgsql" || $this->type == "sqlite" || $this->type == "mssql") {
+ if ($this->type == 'pgsql' || $this->type == 'sqlite' || $this->type == 'mssql') {
if (is_array($tmp)) {
foreach ($tmp as $row) {
$result[]['name'] = $row['name'];
}
}
}
- if ($this->type == "mysql") {
+ if ($this->type == 'mysql') {
if (is_array($tmp)) {
foreach ($tmp as $row) {
$table_array = array_values($row);
@@ -995,9 +1017,9 @@ class database {
}
}
return $result;
- } //delete
+ } // delete
- /**
+ /**
* Checks if the table exists in the database.
* Note:
* Table name must be sanitized. Otherwise, a warning will be
@@ -1014,12 +1036,12 @@ class database {
return false;
}
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //if unable to connect to the database
+ // if unable to connect to the database
if (!$this->db) {
$message['message'] = 'Unable to connect to database';
$message['code'] = '500';
@@ -1031,28 +1053,28 @@ class database {
return false;
}
- //query table store to see if the table exists
- $sql = "";
- if ($this->type == "sqlite") {
+ // query table store to see if the table exists
+ $sql = '';
+ if ($this->type == 'sqlite') {
$sql .= "SELECT * FROM sqlite_master WHERE type='table' and name='$table_name' ";
}
- if ($this->type == "pgsql") {
+ if ($this->type == 'pgsql') {
$sql .= "select * from pg_tables where schemaname='public' and tablename = '$table_name' ";
}
- if ($this->type == "mysql") {
+ if ($this->type == 'mysql') {
$sql .= "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = '" . $this->db_name . "' and TABLE_NAME = '$table_name' ";
}
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute();
$result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
if (count($result) > 0) {
- return true; //table exists
+ return true; // table exists
} else {
- return false; //table doesn't exist
+ return false; // table doesn't exist
}
- } //count
+ } // count
- /**
+ /**
* Checks if the column exists in the database.
*
Note:
* Tables and Column names must be sanitized. Otherwise, a warning will be
@@ -1065,36 +1087,36 @@ class database {
* @depends connect()
*/
public function column_exists(string $table_name, string $column_name) {
- //sanitize the table name
+ // sanitize the table name
if (self::sanitize($table_name) != $table_name) {
trigger_error('Table Name must be sanitized', E_USER_WARNING);
return false;
}
- //sanitize the column name
+ // sanitize the column name
if (self::sanitize($column_name) != $column_name) {
trigger_error('Column Name must be sanitized', E_USER_WARNING);
return false;
}
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //if unable to connect to the database
+ // if unable to connect to the database
if (!$this->db) {
$backtrace = debug_backtrace();
echo "Connection Failed
\n";
- echo "line number " . __line__ . "
\n";
- echo "
";
+ echo 'line number ' . __line__ . "
\n";
+ echo '';
print_r($backtrace);
- echo "
";
+ echo '
';
return false;
}
- //check the sqlite database to see if the column exists
- //if ($this->db_type == "sqlite") {
+ // check the sqlite database to see if the column exists
+ // if ($this->db_type == "sqlite") {
// $table_info = $this->table_info($table_name);
// if ($this->sqlite_column_exists($table_info, $column_name)) {
// return true;
@@ -1102,20 +1124,20 @@ class database {
// else {
// return false;
// }
- //}
+ // }
- //check the postgresql database to see if the column exists
- if ($this->type == "pgsql") {
+ // check the postgresql database to see if the column exists
+ if ($this->type == 'pgsql') {
$sql = "SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '$table_name' limit 1) AND attname = '$column_name'; ";
}
- //check the mysql database to see if the column exists
- if ($this->type == "mysql") {
- //$sql .= "SELECT * FROM information_schema.COLUMNS where TABLE_SCHEMA = '$db_name' and TABLE_NAME = '$table_name' and COLUMN_NAME = '$column_name' ";
+ // check the mysql database to see if the column exists
+ if ($this->type == 'mysql') {
+ // $sql .= "SELECT * FROM information_schema.COLUMNS where TABLE_SCHEMA = '$db_name' and TABLE_NAME = '$table_name' and COLUMN_NAME = '$column_name' ";
$sql = "show columns from $table_name where field = '$column_name' ";
}
- //return the results from the sql query
+ // return the results from the sql query
if (empty($sql)) {
return false;
} else {
@@ -1130,10 +1152,9 @@ class database {
} else {
return false;
}
- unset ($prep_statement);
+ unset($prep_statement);
}
-
- } //select
+ } // select
/**
* Queries {@link database::table_info()} to return the fields.
@@ -1143,40 +1164,40 @@ class database {
* @depends table_info()
*/
public function fields() {
- //public $db;
- //public $type;
- //public $table;
- //public $name;
+ // public $db;
+ // public $type;
+ // public $table;
+ // public $name;
- //initialize the array
+ // initialize the array
$result = [];
- //get the table info
+ // get the table info
$table_info = $this->table_info();
- //set the list of fields
- if ($this->type == "sqlite") {
+ // set the list of fields
+ if ($this->type == 'sqlite') {
if (is_array($table_info)) {
foreach ($table_info as $row) {
$result[]['name'] = $row['name'];
}
}
}
- if ($this->type == "pgsql") {
+ if ($this->type == 'pgsql') {
if (is_array($table_info)) {
foreach ($table_info as $row) {
$result[]['name'] = $row['column_name'];
}
}
}
- if ($this->type == "mysql") {
+ if ($this->type == 'mysql') {
if (is_array($table_info)) {
foreach ($table_info as $row) {
$result[]['name'] = $row['Field'];
}
}
}
- if ($this->type == "mssql") {
+ if ($this->type == 'mssql') {
if (is_array($table_info)) {
foreach ($table_info as $row) {
$result[]['name'] = $row['COLUMN_NAME'];
@@ -1184,7 +1205,7 @@ class database {
}
}
- //return the result array
+ // return the result array
return $result;
}
@@ -1195,50 +1216,50 @@ class database {
* @depends connect()
*/
public function table_info() {
- //public $db;
- //public $type;
- //public $table;
- //public $name;
+ // public $db;
+ // public $type;
+ // public $table;
+ // public $name;
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //get the table info
+ // get the table info
if (empty($this->table)) {
return false;
}
- if ($this->type == "sqlite") {
- $sql = "PRAGMA table_info(" . $this->table . ");";
+ if ($this->type == 'sqlite') {
+ $sql = 'PRAGMA table_info(' . $this->table . ');';
}
- if ($this->type == "pgsql") {
- $sql = "SELECT ordinal_position, ";
- $sql .= "column_name, ";
- $sql .= "data_type, ";
- $sql .= "column_default, ";
- $sql .= "is_nullable, ";
- $sql .= "character_maximum_length, ";
- $sql .= "numeric_precision ";
- $sql .= "FROM information_schema.columns ";
+ if ($this->type == 'pgsql') {
+ $sql = 'SELECT ordinal_position, ';
+ $sql .= 'column_name, ';
+ $sql .= 'data_type, ';
+ $sql .= 'column_default, ';
+ $sql .= 'is_nullable, ';
+ $sql .= 'character_maximum_length, ';
+ $sql .= 'numeric_precision ';
+ $sql .= 'FROM information_schema.columns ';
$sql .= "WHERE table_name = '" . $this->table . "' ";
$sql .= "and table_catalog = '" . $this->db_name . "' ";
- $sql .= "ORDER BY ordinal_position; ";
+ $sql .= 'ORDER BY ordinal_position; ';
}
- if ($this->type == "mysql") {
- $sql = "DESCRIBE " . $this->table . ";";
+ if ($this->type == 'mysql') {
+ $sql = 'DESCRIBE ' . $this->table . ';';
}
- if ($this->type == "mssql") {
+ if ($this->type == 'mssql') {
$sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" . $this->table . "'";
}
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute();
- //set the result array
+ // set the result array
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
}
- /**
+ /**
* Searches database using the following object properties:
*
* - table - sanitized name of the table {@see database::table}
@@ -1252,103 +1273,103 @@ class database {
* @depends connect()
*/
public function find() {
- //connect;
- //table;
- //where;
- //order_by;
- //limit;
- //offset;
+ // connect;
+ // table;
+ // where;
+ // order_by;
+ // limit;
+ // offset;
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //get data from the database
- $sql = "select * from " . $this->table . " ";
+ // get data from the database
+ $sql = 'select * from ' . $this->table . ' ';
if ($this->where) {
$i = 0;
if (is_array($this->where)) {
foreach ($this->where as $row) {
- //sanitize the name
+ // sanitize the name
$row['name'] = self::sanitize($row['name']);
- //validate the operator
+ // validate the operator
switch ($row['operator']) {
- case "<":
+ case '<':
break;
- case ">":
+ case '>':
break;
- case "<=":
+ case '<=':
break;
- case ">=":
+ case '>=':
break;
- case "=":
+ case '=':
break;
- case "<>":
+ case '<>':
break;
- case "!=":
+ case '!=':
break;
default:
- //invalid operator
+ // invalid operator
return false;
}
- //build the sql
+ // build the sql
if ($i == 0) {
- //$sql .= 'where '.$row['name']." ".$row['operator']." '".$row['value']."' ";
- $sql .= 'where ' . $row['name'] . " " . $row['operator'] . " :" . $row['name'] . " ";
+ // $sql .= 'where '.$row['name']." ".$row['operator']." '".$row['value']."' ";
+ $sql .= 'where ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['name'] . ' ';
} else {
- //$sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' ";
- $sql .= "and " . $row['name'] . " " . $row['operator'] . " :" . $row['name'] . " ";
+ // $sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' ";
+ $sql .= 'and ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['name'] . ' ';
}
- //add the name and value to the params array
+ // add the name and value to the params array
$params[$row['name']] = $row['value'];
- //increment $i
+ // increment $i
$i++;
}
}
}
if (is_array($this->order_by)) {
- $sql .= "order by ";
+ $sql .= 'order by ';
$i = 1;
if (is_array($this->order_by)) {
foreach ($this->order_by as $row) {
- //sanitize the name
+ // sanitize the name
$row['name'] = self::sanitize($row['name']);
- //sanitize the order
+ // sanitize the order
switch ($row['order']) {
- case "asc":
+ case 'asc':
break;
- case "desc":
+ case 'desc':
break;
default:
$row['order'] = '';
}
- //build the sql
+ // build the sql
if (count($this->order_by) == $i) {
- $sql .= $row['name'] . " " . $row['order'] . " ";
+ $sql .= $row['name'] . ' ' . $row['order'] . ' ';
} else {
- $sql .= $row['name'] . " " . $row['order'] . ", ";
+ $sql .= $row['name'] . ' ' . $row['order'] . ', ';
}
- //increment $i
+ // increment $i
$i++;
}
}
}
- //limit
+ // limit
if (isset($this->limit) && is_numeric($this->limit)) {
- $sql .= "limit " . $this->limit . " ";
+ $sql .= 'limit ' . $this->limit . ' ';
}
- //offset
+ // offset
if (isset($this->offset) && is_numeric($this->offset)) {
- $sql .= "offset " . $this->offset . " ";
+ $sql .= 'offset ' . $this->offset . ' ';
}
$prep_statement = $this->db->prepare($sql);
@@ -1360,110 +1381,105 @@ class database {
} else {
return false;
}
- } //end function copy
+ } // end function copy
public function delete(array $array) {
- //set the default value
+ // set the default value
$retval = true;
- //return the array
+ // return the array
if (!is_array($array)) {
return false;
}
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //set the message id
+ // set the message id
$m = 0;
- //debug sql
- //$this->debug["sql"] = true;
+ // debug sql
+ // $this->debug["sql"] = true;
- //set the message id
+ // set the message id
$m = 0;
- //loop through the array
+ // loop through the array
$checked = false;
$x = 0;
foreach ($array as $parent_name => $tables) {
if (is_array($tables)) {
-
- //get the application name and uuid
+ // get the application name and uuid
if (class_exists($parent_name) && defined("$parent_name::app_name")) {
$this->app_name = $parent_name::app_name;
$this->app_uuid = $parent_name::app_uuid;
}
- //process the array
+ // process the array
foreach ($tables as $id => $row) {
-
- //prepare the variables
+ // prepare the variables
$parent_name = self::sanitize($parent_name);
- $parent_key_name = self::singular($parent_name) . "_uuid";
+ $parent_key_name = self::singular($parent_name) . '_uuid';
- //build the delete array
+ // build the delete array
if (!empty($row['checked']) && $row['checked'] == 'true') {
- //set checked to true
+ // set checked to true
$checked = true;
- //delete the child data
+ // delete the child data
if (isset($row[$parent_key_name])) {
$new_array[$parent_name][$x][$parent_key_name] = $row[$parent_key_name];
}
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x]);
}
- //loop through the fields
+ // loop through the fields
foreach ($row as $field_name => $field_value) {
-
- //find the child tables
+ // find the child tables
$y = 0;
if (is_array($field_value)) {
- //prepare the variables
+ // prepare the variables
$child_name = self::sanitize($field_name);
- $child_key_name = self::singular($child_name) . "_uuid";
+ $child_key_name = self::singular($child_name) . '_uuid';
- //loop through the child rows
+ // loop through the child rows
foreach ($field_value as $sub_row) {
-
- //build the delete array
+ // build the delete array
if ($row['checked'] == 'true') {
- //set checked to true
+ // set checked to true
$checked = true;
- //delete the child data
+ // delete the child data
$new_array[$child_name][][$child_key_name] = $sub_row[$child_key_name];
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x][$child_name][$y]);
}
- //increment the value
+ // increment the value
$y++;
}
}
}
- //increment the value
+ // increment the value
$x++;
-
}
}
}
- //if not checked, then copy the array to the delete array
+ // if not checked, then copy the array to the delete array
if (!$checked) {
$new_array = $array;
}
- //get the current data
+ // get the current data
if (count($new_array) > 0) {
- //build an array of tables, fields, and values
+ // build an array of tables, fields, and values
foreach ($new_array as $table_name => $rows) {
foreach ($rows as $row) {
foreach ($row as $field_name => $field_value) {
@@ -1472,29 +1488,29 @@ class database {
}
}
- //use the array to get a copy of the parent data before deleting it
+ // use the array to get a copy of the parent data before deleting it
foreach ($new_array as $table_name => $rows) {
foreach ($rows as $row) {
$table_name = self::sanitize($table_name);
- $sql = "select * from " . self::TABLE_PREFIX . $table_name . " ";
+ $sql = 'select * from ' . self::TABLE_PREFIX . $table_name . ' ';
$i = 0;
foreach ($row as $field_name => $field_value) {
if ($i == 0) {
- $sql .= "where ";
+ $sql .= 'where ';
} else {
- $sql .= "and ";
+ $sql .= 'and ';
}
- $sql .= $field_name . " in ( ";
+ $sql .= $field_name . ' in ( ';
$i = 0;
foreach ($keys[$table_name][$field_name] as $field_value) {
$field_name = self::sanitize($field_name);
if ($i > 0) {
- $sql .= " ,";
+ $sql .= ' ,';
}
- $sql .= " :" . $field_name . "_" . $i . " ";
+ $sql .= ' :' . $field_name . '_' . $i . ' ';
$i++;
}
- $sql .= ") ";
+ $sql .= ') ';
$i = 0;
foreach ($keys[$table_name][$field_name] as $field_value) {
$parameters[$field_name . '_' . $i] = $field_value;
@@ -1511,31 +1527,31 @@ class database {
}
}
- //get relations array
+ // get relations array
$relations = self::get_relations($parent_name);
- //add child data to the old array
+ // add child data to the old array
foreach ($old_array as $parent_name => $rows) {
- //get relations array
+ // get relations array
$relations = self::get_relations($parent_name);
- //loop through the rows
+ // loop through the rows
$x = 0;
foreach ($rows as $row) {
if (is_array($relations)) {
foreach ($relations as $relation) {
if ($relation['key']['action']['delete'] == 'cascade') {
- //set the child table
+ // set the child table
$child_table = $relation['table'];
- //remove the v_ prefix
+ // remove the v_ prefix
if (substr($child_table, 0, strlen(self::TABLE_PREFIX)) == self::TABLE_PREFIX) {
$child_table = substr($child_table, strlen(self::TABLE_PREFIX));
}
- //get the child data
- $sql = "select * from " . self::TABLE_PREFIX . $child_table . " ";
- $sql .= "where " . $relation['field'] . " = :" . $relation['field'];
+ // get the child data
+ $sql = 'select * from ' . self::TABLE_PREFIX . $child_table . ' ';
+ $sql .= 'where ' . $relation['field'] . ' = :' . $relation['field'];
$parameters[$relation['field']] = $row[$relation['field']];
$results = $this->execute($sql, $parameters, 'all');
unset($parameters);
@@ -1543,12 +1559,12 @@ class database {
$old_array[$parent_name][$x][$child_table] = $results;
}
- //delete the child data
+ // delete the child data
if (isset($row[$relation['field']]) && !empty($row[$relation['field']])) {
- $sql = "delete from " . self::TABLE_PREFIX . $child_table . " ";
- $sql .= "where " . $relation['field'] . " = :" . $relation['field'];
+ $sql = 'delete from ' . self::TABLE_PREFIX . $child_table . ' ';
+ $sql .= 'where ' . $relation['field'] . ' = :' . $relation['field'];
$parameters[$relation['field']] = $row[$relation['field']];
-// $this->execute($sql, $parameters);
+ // $this->execute($sql, $parameters);
}
unset($parameters);
}
@@ -1559,15 +1575,14 @@ class database {
}
}
- //use a try catch around the transaction
+ // use a try catch around the transaction
try {
-
- //start the atomic transaction
+ // start the atomic transaction
$this->db->beginTransaction();
- //delete the current data
+ // delete the current data
foreach ($new_array as $table_name => $rows) {
- //get the application name and uuid
+ // get the application name and uuid
if (class_exists($table_name) && defined("$table_name::app_name")) {
$this->app_name = $table_name::app_name;
$this->app_uuid = $table_name::app_uuid;
@@ -1580,63 +1595,62 @@ class database {
}
}
- //build and run the delete SQL statements
+ // build and run the delete SQL statements
foreach ($rows as $row) {
if (permission_exists(self::singular($table_name) . '_delete')) {
- $sql = "delete from " . self::TABLE_PREFIX . $table_name . " ";
+ $sql = 'delete from ' . self::TABLE_PREFIX . $table_name . ' ';
$i = 0;
foreach ($row as $field_name => $field_value) {
- //echo "field: ".$field_name." = ".$field_value."\n";
+ // echo "field: ".$field_name." = ".$field_value."\n";
if ($i == 0) {
- $sql .= "where ";
+ $sql .= 'where ';
} else {
- $sql .= "and ";
+ $sql .= 'and ';
}
- $sql .= $field_name . " = :" . $field_name . " ";
+ $sql .= $field_name . ' = :' . $field_name . ' ';
$parameters[$field_name] = $field_value;
$i++;
}
try {
$this->execute($sql, $parameters);
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["uuid"] = $id;
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- //$message["details"][$m]["uuid"] = $parent_key_value;
- $message["details"][$m]["sql"] = $sql;
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['uuid'] = $id;
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ // $message["details"][$m]["uuid"] = $parent_key_value;
+ $message['details'][$m]['sql'] = $sql;
$this->message = $message;
$m++;
unset($sql, $statement);
} catch (PDOException $e) {
$retval = false;
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["sql"] = $sql;
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['sql'] = $sql;
$this->message = $message;
$m++;
}
unset($parameters);
- } //if permission
- } //foreach rows
- } //foreach $array
+ } // if permission
+ } // foreach rows
+ } // foreach $array
- //commit the atomic transaction
+ // commit the atomic transaction
$this->db->commit();
-
} catch (PDOException $e) {
- //rollback the transaction on error
+ // rollback the transaction on error
if ($this->db->inTransaction()) {
$this->db->rollback();
}
- //prepare the message array
+ // prepare the message array
$message['message'] = $e->getMessage();
$message['code'] = $e->getCode();
$message['line'] = $e->getLine();
@@ -1647,65 +1661,65 @@ class database {
return false;
}
- //set the action if not set
+ // set the action if not set
$transaction_type = 'delete';
- //log the transaction results
- if (file_exists(dirname(__DIR__, 2) . "/app/database_transactions/app_config.php")) {
- $sql = "insert into " . self::TABLE_PREFIX . "database_transactions ";
- $sql .= "(";
- $sql .= "database_transaction_uuid, ";
+ // log the transaction results
+ if (file_exists(dirname(__DIR__, 2) . '/app/database_transactions/app_config.php')) {
+ $sql = 'insert into ' . self::TABLE_PREFIX . 'database_transactions ';
+ $sql .= '(';
+ $sql .= 'database_transaction_uuid, ';
if (isset($this->domain_uuid) && is_uuid($this->domain_uuid)) {
- $sql .= "domain_uuid, ";
+ $sql .= 'domain_uuid, ';
}
if (isset($this->user_uuid) && is_uuid($this->user_uuid)) {
- $sql .= "user_uuid, ";
+ $sql .= 'user_uuid, ';
}
if (isset($this->app_uuid) && is_uuid($this->app_uuid)) {
- $sql .= "app_uuid, ";
+ $sql .= 'app_uuid, ';
}
if (isset($this->app_name) && !empty($this->app_name)) {
- $sql .= "app_name, ";
+ $sql .= 'app_name, ';
}
- $sql .= "transaction_code, ";
- $sql .= "transaction_address, ";
- $sql .= "transaction_type, ";
- $sql .= "transaction_date, ";
- $sql .= "transaction_old, ";
- $sql .= "transaction_new, ";
- $sql .= "transaction_result ";
- $sql .= ")";
- $sql .= "values ";
- $sql .= "(";
+ $sql .= 'transaction_code, ';
+ $sql .= 'transaction_address, ';
+ $sql .= 'transaction_type, ';
+ $sql .= 'transaction_date, ';
+ $sql .= 'transaction_old, ';
+ $sql .= 'transaction_new, ';
+ $sql .= 'transaction_result ';
+ $sql .= ')';
+ $sql .= 'values ';
+ $sql .= '(';
$sql .= "'" . uuid() . "', ";
if (isset($this->domain_uuid) && is_uuid($this->domain_uuid)) {
$sql .= "'" . $this->domain_uuid . "', ";
}
if (isset($this->user_uuid) && is_uuid($this->user_uuid)) {
- $sql .= ":user_uuid, ";
+ $sql .= ':user_uuid, ';
}
if (isset($this->app_uuid) && is_uuid($this->app_uuid)) {
- $sql .= ":app_uuid, ";
+ $sql .= ':app_uuid, ';
}
if (isset($this->app_name) && !empty($this->app_name)) {
- $sql .= ":app_name, ";
+ $sql .= ':app_name, ';
}
- $sql .= "'" . $message["code"] . "', ";
- $sql .= ":remote_address, ";
+ $sql .= "'" . $message['code'] . "', ";
+ $sql .= ':remote_address, ';
$sql .= "'" . $transaction_type . "', ";
- $sql .= "now(), ";
+ $sql .= 'now(), ';
if (is_array($old_array)) {
- $sql .= ":transaction_old, ";
+ $sql .= ':transaction_old, ';
} else {
- $sql .= "null, ";
+ $sql .= 'null, ';
}
if (is_array($new_array)) {
- $sql .= ":transaction_new, ";
+ $sql .= ':transaction_new, ';
} else {
- $sql .= "null, ";
+ $sql .= 'null, ';
}
- $sql .= ":transaction_result ";
- $sql .= ")";
+ $sql .= ':transaction_result ';
+ $sql .= ')';
$statement = $this->db->prepare($sql);
if (isset($this->user_uuid) && is_uuid($this->user_uuid)) {
$statement->bindParam(':user_uuid', $this->user_uuid);
@@ -1731,9 +1745,9 @@ class database {
unset($sql);
}
return $retval;
- } //end function toggle
+ } // end function toggle
- /**
+ /**
* Converts a plural English word to singular.
*
* @param string $word English word
@@ -1742,31 +1756,31 @@ class database {
* @internal Moved to class to conserve resources.
*/
public static function singular(string $word) {
- //"-es" is used for words that end in "-x", "-s", "-z", "-sh", "-ch" in which case you add
- if (substr($word, -2) == "es") {
- if (substr($word, -4) == "sses") { // eg. 'addresses' to 'address'
+ // "-es" is used for words that end in "-x", "-s", "-z", "-sh", "-ch" in which case you add
+ if (substr($word, -2) == 'es') {
+ if (substr($word, -4) == 'sses') { // eg. 'addresses' to 'address'
return substr($word, 0, -2);
- } elseif (substr($word, -3) == "ses") { // eg. 'databases' to 'database' (necessary!)
+ } elseif (substr($word, -3) == 'ses') { // eg. 'databases' to 'database' (necessary!)
return substr($word, 0, -1);
- } elseif (substr($word, -3) == "ies") { // eg. 'countries' to 'country'
- return substr($word, 0, -3) . "y";
- } elseif (substr($word, -3, 1) == "x") {
+ } elseif (substr($word, -3) == 'ies') { // eg. 'countries' to 'country'
+ return substr($word, 0, -3) . 'y';
+ } elseif (substr($word, -3, 1) == 'x') {
return substr($word, 0, -2);
- } elseif (substr($word, -3, 1) == "s") {
+ } elseif (substr($word, -3, 1) == 's') {
return substr($word, 0, -2);
- } elseif (substr($word, -3, 1) == "z") {
+ } elseif (substr($word, -3, 1) == 'z') {
return substr($word, 0, -2);
- } elseif (substr($word, -4, 2) == "sh") {
+ } elseif (substr($word, -4, 2) == 'sh') {
return substr($word, 0, -2);
- } elseif (substr($word, -4, 2) == "ch") {
+ } elseif (substr($word, -4, 2) == 'ch') {
return substr($word, 0, -2);
} else {
- return rtrim($word, "s");
+ return rtrim($word, 's');
}
} else {
- return rtrim($word, "s");
+ return rtrim($word, 's');
}
- } //save method
+ } // save method
/**
* Get Relations searches through all fields to find relations
@@ -1777,18 +1791,17 @@ class database {
* @internal Moved to class to conserve resources.
*/
public static function get_relations($schema) {
-
- //remove the v_ prefix
+ // remove the v_ prefix
if (substr($schema, 0, strlen(self::TABLE_PREFIX)) == self::TABLE_PREFIX) {
$schema = substr($schema, strlen(self::TABLE_PREFIX));
}
- //sanitize the values
+ // sanitize the values
$schema = self::sanitize($schema);
- //get the apps array
+ // get the apps array
$config_list = [];
- $directories = ["core", "app"];
+ $directories = ['core', 'app'];
$applications = [$schema, self::singular($schema)];
foreach ($directories as $directory) {
foreach ($applications as $application) {
@@ -1801,25 +1814,25 @@ class database {
}
$x = 0;
foreach ($config_list as $config_path) {
- include($config_path);
+ include ($config_path);
$x++;
}
- //search through all fields to find relations
+ // search through all fields to find relations
if (!empty($apps) && is_array($apps)) {
foreach ($apps as $x => $app) {
foreach ($app['db'] as $y => $row) {
foreach ($row['fields'] as $z => $field) {
- if (!empty($field['deprecated']) && $field['deprecated'] != "true") {
- if (!empty($field['key']['type']) && $field['key']['type'] == "foreign") {
+ if (!empty($field['deprecated']) && $field['deprecated'] != 'true') {
+ if (!empty($field['key']['type']) && $field['key']['type'] == 'foreign') {
if ($row['table']['name'] == self::TABLE_PREFIX . $schema || $field['key']['reference']['table'] == self::TABLE_PREFIX . $schema) {
- //get the field name
+ // get the field name
if (!empty($field['name']) && is_array($field['name'])) {
$field_name = trim($field['name']['text']);
} else {
$field_name = trim($field['name']);
}
- //build the array
+ // build the array
$relations[$i]['table'] = $row['table']['name'];
$relations[$i]['field'] = $field_name;
$relations[$i]['key']['type'] = $field['key']['type'];
@@ -1828,7 +1841,7 @@ class database {
if (isset($field['key']['reference']['action'])) {
$relations[$i]['key']['action'] = $field['key']['reference']['action'];
}
- //increment the value
+ // increment the value
$i++;
}
}
@@ -1839,7 +1852,7 @@ class database {
}
}
- //return the array
+ // return the array
if (!empty($relations) && is_array($relations)) {
return $relations;
} else {
@@ -1847,7 +1860,7 @@ class database {
}
}
-/**
+ /**
* Performs a select query on database using the $sql statement supplied.
*
* @param string $sql Valid SQL statement.
@@ -1858,32 +1871,31 @@ class database {
* $return_type.
*/
public function select(string $sql, ?array $parameters = [], string $return_type = 'all') {
-
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //unable to connect to the database
+ // unable to connect to the database
if (!$this->db) {
$error_message = "Connection Failed
\n";
- $error_message .= "line number " . __line__ . "
\n";
+ $error_message .= 'line number ' . __line__ . "
\n";
$message['message'] = $error_message;
$this->message = $message;
return false;
}
- //set the error mode
+ // set the error mode
if ($this->db) {
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
- //reduce prepared statement latency
+ // reduce prepared statement latency
if ($this->db && defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
$this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
}
- //execute the query and return the results
+ // execute the query and return the results
try {
$prep_statement = $this->db->prepare($sql);
if (is_array($parameters)) {
@@ -1891,15 +1903,15 @@ class database {
} else {
$prep_statement->execute();
}
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["sql"] = $sql;
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['sql'] = $sql;
if (is_array($parameters)) {
- $message["parameters"] = $parameters;
+ $message['parameters'] = $parameters;
}
$this->message = $message;
- //return the results
+ // return the results
switch ($return_type) {
case 'all':
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
@@ -1930,107 +1942,106 @@ class database {
* @return database Returns the database object or null.
*/
public function find_new(array $array) {
-
- //define the message ordinal id
+ // define the message ordinal id
$m = 0;
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //set the name
+ // set the name
if (isset($array['name'])) {
$this->name = $array['name'];
}
- //set the uuid
+ // set the uuid
if (isset($array['uuid'])) {
$this->uuid = $array['uuid'];
}
- //build the query
- $sql = "SELECT * FROM " . self::TABLE_PREFIX . $this->name . " ";
+ // build the query
+ $sql = 'SELECT * FROM ' . self::TABLE_PREFIX . $this->name . ' ';
if (isset($this->uuid)) {
- //get the specific uuid
- $sql .= "WHERE " . self::singular($this->name) . "_uuid = '" . $this->uuid . "' ";
+ // get the specific uuid
+ $sql .= 'WHERE ' . self::singular($this->name) . "_uuid = '" . $this->uuid . "' ";
} else {
- //where
+ // where
$i = 0;
if (isset($array['where'])) {
foreach ($array['where'] as $row) {
if (isset($row['operator'])) {
- //validate the operator
+ // validate the operator
switch ($row['operator']) {
- case "<":
+ case '<':
break;
- case ">":
+ case '>':
break;
- case "<=":
+ case '<=':
break;
- case ">=":
+ case '>=':
break;
- case "=":
+ case '=':
break;
- case "<>":
+ case '<>':
break;
- case "!=":
+ case '!=':
break;
default:
- //invalid operator
+ // invalid operator
return null;
}
- //build the sql
+ // build the sql
if ($i == 0) {
- $sql .= "WHERE " . $row['name'] . " " . $row['operator'] . " :" . $row['value'] . " ";
+ $sql .= 'WHERE ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['value'] . ' ';
} else {
- $sql .= "AND " . $row['name'] . " " . $row['operator'] . " :" . $row['value'] . " ";
+ $sql .= 'AND ' . $row['name'] . ' ' . $row['operator'] . ' :' . $row['value'] . ' ';
}
}
- //add the name and value to the params array
+ // add the name and value to the params array
$params[$row['name']] = $row['value'];
- //increment $i
+ // increment $i
$i++;
}
}
- //order by
+ // order by
if (isset($array['order_by'])) {
$array['order_by'] = self::sanitize($array['order_by']);
- $sql .= "ORDER BY " . $array['order_by'] . " ";
+ $sql .= 'ORDER BY ' . $array['order_by'] . ' ';
}
- //limit
+ // limit
if (isset($array['limit']) && is_numeric($array['limit'])) {
- $sql .= "LIMIT " . $array['limit'] . " ";
+ $sql .= 'LIMIT ' . $array['limit'] . ' ';
}
- //offset
+ // offset
if (isset($array['offset']) && is_numeric($array['offset'])) {
- $sql .= "OFFSET " . $array['offset'] . " ";
+ $sql .= 'OFFSET ' . $array['offset'] . ' ';
}
}
- //execute the query, and return the results
+ // execute the query, and return the results
try {
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute($params);
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["details"][$m]["name"] = $this->name;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- $message["details"][$m]["sql"] = $sql;
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['details'][$m]['name'] = $this->name;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ $message['details'][$m]['sql'] = $sql;
$this->message = $message;
$this->result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
unset($prep_statement);
$m++;
} catch (PDOException $e) {
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- $message["details"][$m]["name"] = $this->name;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["sql"] = $sql;
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ $message['details'][$m]['name'] = $this->name;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['sql'] = $sql;
$this->message = $message;
$this->result = '';
@@ -2051,7 +2062,7 @@ class database {
return $this;
}
-/**
+ /**
* Copies records and appends suffix to the column description data
*
* @param array $array Three dimensional Array. The first dimension is the table name without the prefix 'v_'.
@@ -2060,80 +2071,75 @@ class database {
* @return bool Returns true on success and false on failure.
*/
public function copy(array $array, $suffix = '(Copy)') {
- //set default return value
+ // set default return value
$retval = false;
- //return the array
+ // return the array
if (!is_array($array)) {
return $retval;
}
- //initialize array
+ // initialize array
$copy_array = [];
- //set the message id
+ // set the message id
$m = 0;
- //loop through the array
+ // loop through the array
$x = 0;
foreach ($array as $parent_name => $tables) {
if (is_array($tables)) {
foreach ($tables as $id => $row) {
-
- //prepare the variables
+ // prepare the variables
$parent_name = self::sanitize($parent_name);
- $parent_key_name = self::singular($parent_name) . "_uuid";
+ $parent_key_name = self::singular($parent_name) . '_uuid';
- //build the copy array
+ // build the copy array
if (!empty($row['checked']) && $row['checked'] == 'true') {
- //set checked to true
+ // set checked to true
$checked = true;
- //copy the child data
+ // copy the child data
if (!empty($row[$parent_key_name]) && is_uuid($row[$parent_key_name])) {
$copy_array[$parent_name][$x][$parent_key_name] = $row[$parent_key_name];
}
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x]);
- //loop through the fields
+ // loop through the fields
foreach ($row as $field_name => $field_value) {
- //find the child tables
+ // find the child tables
if (is_array($field_value)) {
-
- //prepare the variables
+ // prepare the variables
$child_name = self::sanitize($field_name);
- $child_key_name = self::singular($child_name) . "_uuid";
+ $child_key_name = self::singular($child_name) . '_uuid';
- //loop through the child rows
+ // loop through the child rows
$y = 0;
foreach ($field_value as $sub_row) {
-
- //delete the child data
+ // delete the child data
$copy_array[$child_name][][$child_key_name] = $sub_row[$child_key_name];
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x][$child_name][$y]);
- //increment the value
+ // increment the value
$y++;
}
}
}
}
- //increment the value
+ // increment the value
$x++;
-
}
}
}
- //get the current data
+ // get the current data
if (count($copy_array) > 0) {
-
- //build an array of tables, fields, and values
+ // build an array of tables, fields, and values
foreach ($copy_array as $table_name => $rows) {
foreach ($rows as $row) {
foreach ($row as $field_name => $field_value) {
@@ -2142,32 +2148,32 @@ class database {
}
}
- //unset the array
+ // unset the array
unset($array);
- //use the array to get a copy of the parent data before deleting it
+ // use the array to get a copy of the parent data before deleting it
foreach ($copy_array as $table_name => $rows) {
foreach ($rows as $row) {
$table_name = self::sanitize($table_name);
- $sql = "select * from " . self::TABLE_PREFIX . $table_name . " ";
+ $sql = 'select * from ' . self::TABLE_PREFIX . $table_name . ' ';
$i = 0;
foreach ($row as $field_name => $field_value) {
if ($i == 0) {
- $sql .= "where ";
+ $sql .= 'where ';
} else {
- $sql .= "and ";
+ $sql .= 'and ';
}
- $sql .= $field_name . " in ( ";
+ $sql .= $field_name . ' in ( ';
$i = 0;
foreach ($keys[$table_name][$field_name] as $field_value) {
$field_name = self::sanitize($field_name);
if ($i > 0) {
- $sql .= " ,";
+ $sql .= ' ,';
}
- $sql .= " :" . $field_name . "_" . $i . " ";
+ $sql .= ' :' . $field_name . '_' . $i . ' ';
$i++;
}
- $sql .= ") ";
+ $sql .= ') ';
$i = 0;
foreach ($keys[$table_name][$field_name] as $field_value) {
$parameters[$field_name . '_' . $i] = $field_value;
@@ -2183,27 +2189,27 @@ class database {
}
}
- //add child data to the old array
+ // add child data to the old array
foreach ($copy_array as $parent_name => $rows) {
- //get relations array
+ // get relations array
$relations = self::get_relations($parent_name);
- //loop through the rows
+ // loop through the rows
$x = 0;
foreach ($rows as $row) {
if (is_array($relations)) {
foreach ($relations as $relation) {
- //set the child table
+ // set the child table
$child_table = $relation['table'];
- //remove the v_ prefix
+ // remove the v_ prefix
if (substr($child_table, 0, strlen(self::TABLE_PREFIX)) == self::TABLE_PREFIX) {
$child_table = substr($child_table, strlen(self::TABLE_PREFIX));
}
- //get the child data
- $sql = "select * from " . self::TABLE_PREFIX . $child_table . " ";
- $sql .= "where " . $relation['field'] . " = :" . $relation['field'];
+ // get the child data
+ $sql = 'select * from ' . self::TABLE_PREFIX . $child_table . ' ';
+ $sql .= 'where ' . $relation['field'] . ' = :' . $relation['field'];
$parameters[$relation['field']] = $row[$relation['field']];
$results = $this->execute($sql, $parameters, 'all');
unset($parameters);
@@ -2217,67 +2223,64 @@ class database {
}
}
- //update the parent and child keys
+ // update the parent and child keys
$checked = false;
$x = 0;
foreach ($array as $parent_name => $tables) {
if (is_array($tables)) {
foreach ($tables as $id => $row) {
-
- //prepare the variables
+ // prepare the variables
$parent_name = self::sanitize($parent_name);
- $parent_key_name = self::singular($parent_name) . "_uuid";
+ $parent_key_name = self::singular($parent_name) . '_uuid';
$parent_key_value = uuid();
- //update the parent key id
+ // update the parent key id
$array[$parent_name][$x][$parent_key_name] = $parent_key_value;
- //set enabled
+ // set enabled
if (array_key_exists(self::singular($parent_name) . '_enabled', $array[$parent_name][$x])) {
$array[$parent_name][$x][self::singular($parent_name) . '_enabled'] = $row[self::singular($parent_name) . '_enabled'] === true || $row[self::singular($parent_name) . '_enabled'] == 'true' ? 'true' : 'false';
} elseif (array_key_exists('enabled', $array[$parent_name][$x])) {
$array[$parent_name][$x]['enabled'] = $row['enabled'] === true || $row['enabled'] == 'true' ? 'true' : 'false';
}
- //add copy to the description
+ // add copy to the description
if (array_key_exists(self::singular($parent_name) . '_description', $array[$parent_name][$x])) {
$array[$parent_name][$x][self::singular($parent_name) . '_description'] = trim($array[$parent_name][$x][self::singular($parent_name) . '_description'] . ' ' . $suffix);
} elseif (array_key_exists('description', $array[$parent_name][$x])) {
$array[$parent_name][$x]['description'] = trim($array[$parent_name][$x]['description'] . ' ' . $suffix);
}
- //loop through the fields
+ // loop through the fields
foreach ($row as $field_name => $field_value) {
-
- //find the child tables
+ // find the child tables
$y = 0;
if (is_array($field_value)) {
- //prepare the variables
+ // prepare the variables
$child_name = self::sanitize($field_name);
- $child_key_name = self::singular($child_name) . "_uuid";
+ $child_key_name = self::singular($child_name) . '_uuid';
- //loop through the child rows
+ // loop through the child rows
foreach ($field_value as $sub_row) {
- //update the parent key id
+ // update the parent key id
$array[$parent_name][$x][$child_name][$y][$parent_key_name] = $parent_key_value;
- //udpate the child key id
+ // udpate the child key id
$array[$parent_name][$x][$child_name][$y][$child_key_name] = uuid();
- //increment the value
+ // increment the value
$y++;
}
}
}
- //increment the value
+ // increment the value
$x++;
-
}
}
}
- //save the copy of the data
+ // save the copy of the data
if (is_array($array) && count($array) > 0) {
$retval = $this->save($array);
unset($array);
@@ -2285,12 +2288,12 @@ class database {
return $retval;
}
-/**
+ /**
* Save an array to the database.
* Usage Example:
$row = 0;
$array['mytable'][$row]['mycolumn'] = "myvalue";
if
* ($database->save($array)) {
echo "Saved Successfully.";
} else {
echo "Save
- * Failed.";
}
- *
+ * Failed.";
}
+ *
*
* @param array $array Three dimensional Array. The first dimension is the table name without the prefix 'v_'.
* Second dimension in the row value as int. Third dimension is the column name.
@@ -2299,8 +2302,7 @@ class database {
* @return returns an array with result details
*/
public function save(array &$array, bool $transaction_save = true) {
-
- //prepare the values
+ // prepare the values
$parent_field_names = [];
$child_field_names = [];
$this->message = [];
@@ -2313,918 +2315,909 @@ class database {
$table_name = null;
$child_table_name = null;
- //set default return value
+ // set default return value
$retval = true;
- //return the array
+ // return the array
if (!is_array($array)) {
return false;
}
- //set the message id
+ // set the message id
$m = 0;
- //debug sql
- //$this->debug["sql"] = true;
+ // debug sql
+ // $this->debug["sql"] = true;
- //connect to the database if needed
+ // connect to the database if needed
if (!$this->db) {
$this->connect();
}
- //use a try catch around the transaction
+ // use a try catch around the transaction
try {
- //start the atomic transaction
+ // start the atomic transaction
$this->db->beginTransaction();
- //loop through the array
- if (is_array($array)) foreach ($array as $parent_name => $parent_array) {
-
- //get the application name and uuid
- if (class_exists($parent_name) && defined("$parent_name::app_name")) {
- $this->app_name = $parent_name::app_name;
- $this->app_uuid = $parent_name::app_uuid;
- }
-
- //process the parent array, use it to create insert and update SQL statements
- if (is_array($parent_array)) foreach ($parent_array as $row_id => $parent_field_array) {
-
- //set the variables
- $parent_name = self::sanitize($parent_name);
- $table_name = self::TABLE_PREFIX . $parent_name;
- $parent_key_name = self::singular($parent_name) . "_uuid";
- $parent_key_name = self::sanitize($parent_key_name);
-
- //if the UUID is set, then set parent key exists and value
- //determine if the parent_key_exists
- $parent_key_exists = false;
- if (isset($parent_field_array[$parent_key_name])) {
- $parent_key_value = $parent_field_array[$parent_key_name];
- $parent_key_exists = true;
- } else {
- if (isset($this->uuid)) {
- $parent_key_exists = true;
- $parent_key_value = $this->uuid;
- } else {
- $parent_key_value = uuid();
- }
+ // loop through the array
+ if (is_array($array))
+ foreach ($array as $parent_name => $parent_array) {
+ // get the application name and uuid
+ if (class_exists($parent_name) && defined("$parent_name::app_name")) {
+ $this->app_name = $parent_name::app_name;
+ $this->app_uuid = $parent_name::app_uuid;
}
- //allow characters found in the UUID only.
- $parent_key_value = self::sanitize($parent_key_value);
+ // process the parent array, use it to create insert and update SQL statements
+ if (is_array($parent_array))
+ foreach ($parent_array as $row_id => $parent_field_array) {
+ // set the variables
+ $parent_name = self::sanitize($parent_name);
+ $table_name = self::TABLE_PREFIX . $parent_name;
+ $parent_key_name = self::singular($parent_name) . '_uuid';
+ $parent_key_name = self::sanitize($parent_key_name);
- //get the parent field names
- $parent_field_names = [];
- if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $key => $value) {
- if (!is_array($value)) {
- $parent_field_names[] = self::sanitize($key);
- }
- }
- }
-
- //determine action update or delete, and get the original data
- if ($parent_key_exists) {
- $sql = "SELECT " . implode(", ", $parent_field_names) . " FROM " . $table_name . " ";
- $sql .= "WHERE " . $parent_key_name . " = '" . $parent_key_value . "'; ";
- $prep_statement = $this->db->prepare($sql);
- if ($prep_statement) {
- //get the data
- try {
- $prep_statement->execute();
- $parent_results = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
- } catch (PDOException $e) {
- $message["type"] = 'error';
- $message["code"] = $e->getCode();
- $message["message"] = $e->getMessage();
- $message["sql"] = $sql;
- $this->message = $message;
- return false;
- }
-
- //set the action
- if (count($parent_results) > 0) {
- $action = "update";
+ // if the UUID is set, then set parent key exists and value
+ // determine if the parent_key_exists
+ $parent_key_exists = false;
+ if (isset($parent_field_array[$parent_key_name])) {
+ $parent_key_value = $parent_field_array[$parent_key_name];
+ $parent_key_exists = true;
} else {
- $action = "add";
+ if (isset($this->uuid)) {
+ $parent_key_exists = true;
+ $parent_key_value = $this->uuid;
+ } else {
+ $parent_key_value = uuid();
+ }
}
- }
- unset($prep_statement);
- } else {
- $action = "add";
- }
- //add a record
- if ($action == "add") {
+ // allow characters found in the UUID only.
+ $parent_key_value = self::sanitize($parent_key_value);
- if (permission_exists(self::singular($parent_name) . '_add')) {
- //add to the old and new arrays
- $old_array = null;
- $new_array[$parent_name][] = $parent_field_array;
-
- //prepare the insert statement
- $params = [];
- $sql = "INSERT INTO " . $table_name . " ";
- $sql .= "(";
- if (!$parent_key_exists) {
- $sql .= $parent_key_name . ", ";
- }
+ // get the parent field names
+ $parent_field_names = [];
if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $array_key => $array_value) {
- if (!is_array($array_value)) {
- $array_key = self::sanitize($array_key);
- if ($array_key != 'insert_user' &&
- $array_key != 'insert_date' &&
- $array_key != 'update_user' &&
- $array_key != 'update_date') {
- $sql .= $array_key . ", ";
- }
+ foreach ($parent_field_array as $key => $value) {
+ if (!is_array($value)) {
+ $parent_field_names[] = self::sanitize($key);
}
}
}
- $sql .= "insert_date, ";
- $sql .= "insert_user ";
- $sql .= ") ";
- $sql .= "VALUES ";
- $sql .= "(";
- if (!$parent_key_exists) {
- $sql .= ":parent_key_value, ";
- $params['parent_key_value'] = $parent_key_value;
- }
- if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $array_key => $array_value) {
- if (!is_array($array_value)) {
- if ($array_key != 'insert_user' &&
- $array_key != 'insert_date' &&
- $array_key != 'update_user' &&
- $array_key != 'update_date') {
- if (!isset($array_value) || $array_value == '') {
- $sql .= "null, ";
- } elseif ($array_value === "now()") {
- $sql .= "now(), ";
- } elseif ($array_value === "user_uuid()") {
- $sql .= ':' . $array_key . ", ";
- $params[$array_key] = $this->user_uuid ?? null;
- } elseif ($array_value === "remote_address()") {
- $sql .= ':' . $array_key . ", ";
- $params[$array_key] = $_SERVER['REMOTE_ADDR'];
- } elseif (gettype($array_value) === 'boolean') {
- $sql .= ':' . $array_key . ", ";
- $params[$array_key] = $array_value;
- } else {
- $sql .= ':' . $array_key . ", ";
- if (gettype($array_value) === 'string') {
- $array_value = trim($array_value);
- }
- $params[$array_key] = $array_value;
- }
- }
- }
- }
- }
- $sql .= "now(), ";
- $sql .= ":insert_user ";
- $sql .= ");";
- //add insert user parameter
- $params['insert_user'] = $this->user_uuid ?? null;
-
- //set the error mode
- $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
- //reduce prepared statement latency
- if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
- $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
- }
-
- //run the query and return the results
- try {
+ // determine action update or delete, and get the original data
+ if ($parent_key_exists) {
+ $sql = 'SELECT ' . implode(', ', $parent_field_names) . ' FROM ' . $table_name . ' ';
+ $sql .= 'WHERE ' . $parent_key_name . " = '" . $parent_key_value . "'; ";
$prep_statement = $this->db->prepare($sql);
- $prep_statement->execute($params);
+ if ($prep_statement) {
+ // get the data
+ try {
+ $prep_statement->execute();
+ $parent_results = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
+ } catch (PDOException $e) {
+ $message['type'] = 'error';
+ $message['code'] = $e->getCode();
+ $message['message'] = $e->getMessage();
+ $message['sql'] = $sql;
+ $this->message = $message;
+ return false;
+ }
+
+ // set the action
+ if (count($parent_results) > 0) {
+ $action = 'update';
+ } else {
+ $action = 'add';
+ }
+ }
unset($prep_statement);
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["uuid"] = $parent_key_value;
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- $message["details"][$m]["uuid"] = $parent_key_value;
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- } catch (PDOException $e) {
- $retval = false;
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["array"] = $parent_field_array;
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- }
- unset($sql);
- } else {
- $retval = false;
- $message["name"] = $this->app_name;
- $message["message"] = "Forbidden, does not have '" . self::singular($parent_name) . "_add'";
- $message["code"] = "403";
- $message["line"] = __line__;
- $this->message[] = $message;
- $m++;
- }
- }
-
- //edit a specific uuid
- if ($action == "update") {
- if (permission_exists(self::singular($parent_name) . '_edit')) {
-
- //validate changes
- $data_modified = false;
- if (is_array($parent_field_array)) {
- $i = 0;
- foreach ($parent_field_array as $array_key => $array_value) {
- //skip child array
- if (is_array($array_value)) {
- continue;
- }
-
- //get the variable type of the value
- $database_field_type = gettype($parent_results[$i][$array_key]);
- $user_field_type = gettype($array_value);
-
- //trim the string and update the value
- if ($user_field_type === 'string') {
- //trim the string
- $array_value = trim($array_value);
-
- //update the user value
- $parent_field_array[$array_key] = $array_value;
- }
-
- //normalize the data to match the database
- if ($database_field_type !== $user_field_type) {
- //normalize null
- if ($array_value === '') {
- $array_value = null;
- }
-
- //normalize string
- if ($database_field_type === 'string') {
- $array_value = (string)$array_value;
- }
-
- //normalize numeric
- if ($database_field_type === 'numeric') {
- $array_value = intval($array_value);
- }
-
- //normalize boolean
- if ($database_field_type === 'boolean') {
- if ($array_value === 'true') {
- $array_value = true;
- } else {
- $array_value = false;
- }
- }
- }
-
- //verify if the data in the database has been modified
- if ($parent_results[$i][$array_key] !== $array_value) {
- //not matched
- //echo "$parent_name.$array_key ".($parent_results[$i][$array_key])." != ".$array_value."\n\n";
- $data_modified = true;
- break;
- }
-
- //increment the id
- $i;
- }
- }
-
- //parent data - process the modified data
- if ($data_modified) {
-
- //remove the child array and update the special values
- if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $array_key => $array_value) {
- if (is_array($array_value)) {
- continue;
- }
- $array_key = self::sanitize($array_key);
- if (!isset($array_value) || (isset($array_value) && $array_value === '')) {
- $temp_array[$array_key] = null;
- } elseif ($array_value === "now()") {
- $temp_array[$array_key] = $array_value;
- } elseif ($array_value === "user_uuid()") {
- $temp_array[$array_key] = $this->user_uuid ?? null;
- } elseif ($array_value === "remote_address()") {
- $temp_array[$array_key] = $_SERVER['REMOTE_ADDR'];
- } else {
- if (gettype($array_value) === 'string') {
- $array_value = trim($array_value);
- }
- $temp_array[$array_key] = $array_value;
- }
- }
- }
-
- //add to the old and new arrays
- $old_array[$parent_name] = $parent_results;
- $new_array[$parent_name][] = $temp_array;
-
- //empty the temp array
- unset($temp_array);
-
- //prepare the update statement
- $params = [];
- $sql = "UPDATE " . $table_name . " SET ";
- if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $array_key => $array_value) {
- if (is_array($array_value)) {
- continue;
- }
- if ($array_key != $parent_key_name) {
- $array_key = self::sanitize($array_key);
- if (!isset($array_value) || (isset($array_value) && $array_value === '')) {
- $sql .= $array_key . " = null, ";
- } elseif ($array_value === "now()") {
- $sql .= $array_key . " = now(), ";
- } elseif ($array_value === "user_uuid()") {
- $sql .= $array_key . " = :" . $array_key . ", ";
- $params[$array_key] = $this->user_uuid ?? null;
- } elseif ($array_value === "remote_address()") {
- $sql .= $array_key . " = :" . $array_key . ", ";
- $params[$array_key] = $_SERVER['REMOTE_ADDR'];
- } elseif (gettype($array_value) === 'boolean') {
- $sql .= $array_key . " = :" . $array_key . ", ";
- $params[$array_key] = $array_value;
- } else {
- $sql .= $array_key . " = :" . $array_key . ", ";
- if (gettype($array_value) === 'string') {
- $array_value = trim($array_value);
- }
- $params[$array_key] = $array_value;
- }
- }
- }
- }
-
- //add the modified date and user
- $sql .= "update_date = now(), ";
- $sql .= "update_user = :update_user ";
- $params['update_user'] = $this->user_uuid ?? null;
-
- //add the where with the parent name and value
- $sql .= "WHERE " . $parent_key_name . " = :parent_key_value; ";
- $params['parent_key_value'] = $parent_key_value;
- $sql = str_replace(", WHERE", " WHERE", $sql);
-
- //add update user parameter
- $params['update_user'] = $this->user_uuid ?? null;
-
- //set the error mode
- $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
- //reduce prepared statement latency
- if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
- $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
- }
-
- //run the query and return the results
- try {
- $prep_statement = $this->db->prepare($sql);
- $prep_statement->execute($params);
- $message["message"] = "OK";
- $message["code"] = "200";
- $message["uuid"] = $parent_key_value;
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- $message["details"][$m]["uuid"] = $parent_key_value;
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- unset($sql);
- } catch (PDOException $e) {
- $retval = false;
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- $message["details"][$m]["name"] = $this->app_name;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- }
} else {
- $message["details"][$m]["name"] = $parent_name;
- $message["details"][$m]["message"] = 'No Changes';
- $message["details"][$m]["code"] = "000";
- $message["details"][$m]["uuid"] = $parent_key_value;
- $this->message = $message;
- $m++;
+ $action = 'add';
}
- } else {
- $retval = false;
- $message["message"] = "Forbidden, does not have '" . self::singular($parent_name) . "_edit'";
- $message["code"] = "403";
- $message["line"] = __line__;
- $this->message = $message;
- $m++;
- }
- }
- //unset the variables
- unset($sql, $action);
+ // add a record
+ if ($action == 'add') {
+ if (permission_exists(self::singular($parent_name) . '_add')) {
+ // add to the old and new arrays
+ $old_array = null;
+ $new_array[$parent_name][] = $parent_field_array;
- //child data
- if (is_array($parent_field_array)) {
- foreach ($parent_field_array as $key => $value) {
- if (is_array($value)) {
- $child_table_name = self::TABLE_PREFIX . $key;
- $child_table_name = self::sanitize($child_table_name);
- foreach ($value as $id => $row) {
- //prepare the variables
- $child_name = self::singular($key);
- $child_name = self::sanitize($child_name);
- $child_key_name = $child_name . "_uuid";
+ // prepare the insert statement
+ $params = [];
+ $sql = 'INSERT INTO ' . $table_name . ' ';
+ $sql .= '(';
+ if (!$parent_key_exists) {
+ $sql .= $parent_key_name . ', ';
+ }
+ if (is_array($parent_field_array)) {
+ foreach ($parent_field_array as $array_key => $array_value) {
+ if (!is_array($array_value)) {
+ $array_key = self::sanitize($array_key);
+ if ($array_key != 'insert_user' &&
+ $array_key != 'insert_date' &&
+ $array_key != 'update_user' &&
+ $array_key != 'update_date') {
+ $sql .= $array_key . ', ';
+ }
+ }
+ }
+ }
+ $sql .= 'insert_date, ';
+ $sql .= 'insert_user ';
+ $sql .= ') ';
+ $sql .= 'VALUES ';
+ $sql .= '(';
+ if (!$parent_key_exists) {
+ $sql .= ':parent_key_value, ';
+ $params['parent_key_value'] = $parent_key_value;
+ }
+ if (is_array($parent_field_array)) {
+ foreach ($parent_field_array as $array_key => $array_value) {
+ if (!is_array($array_value)) {
+ if ($array_key != 'insert_user' &&
+ $array_key != 'insert_date' &&
+ $array_key != 'update_user' &&
+ $array_key != 'update_date') {
+ if (!isset($array_value) || $array_value == '') {
+ $sql .= 'null, ';
+ } elseif ($array_value === 'now()') {
+ $sql .= 'now(), ';
+ } elseif ($array_value === 'user_uuid()') {
+ $sql .= ':' . $array_key . ', ';
+ $params[$array_key] = $this->user_uuid ?? null;
+ } elseif ($array_value === 'remote_address()') {
+ $sql .= ':' . $array_key . ', ';
+ $params[$array_key] = $_SERVER['REMOTE_ADDR'];
+ } elseif (gettype($array_value) === 'boolean') {
+ $sql .= ':' . $array_key . ', ';
+ $params[$array_key] = $array_value;
+ } else {
+ $sql .= ':' . $array_key . ', ';
+ if (gettype($array_value) === 'string') {
+ $array_value = trim($array_value);
+ }
+ $params[$array_key] = $array_value;
+ }
+ }
+ }
+ }
+ }
+ $sql .= 'now(), ';
+ $sql .= ':insert_user ';
+ $sql .= ');';
- //determine if the parent key exists in the child array
- $parent_key_exists = false;
- if (!isset($parent_field_array[$parent_key_name])) {
- $parent_key_exists = true;
+ // add insert user parameter
+ $params['insert_user'] = $this->user_uuid ?? null;
+
+ // set the error mode
+ $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // reduce prepared statement latency
+ if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
+ $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
}
- //determine if the uuid exists
- $uuid_exists = false;
- if (is_array($row)) foreach ($row as $k => $v) {
- if ($child_key_name == $k) {
- if (strlen($v) > 0) {
- if (gettype($v) === 'string') {
- $v = trim($v);
+ // run the query and return the results
+ try {
+ $prep_statement = $this->db->prepare($sql);
+ $prep_statement->execute($params);
+ unset($prep_statement);
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['uuid'] = $parent_key_value;
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ $message['details'][$m]['uuid'] = $parent_key_value;
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ } catch (PDOException $e) {
+ $retval = false;
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['array'] = $parent_field_array;
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ }
+ unset($sql);
+ } else {
+ $retval = false;
+ $message['name'] = $this->app_name;
+ $message['message'] = "Forbidden, does not have '" . self::singular($parent_name) . "_add'";
+ $message['code'] = '403';
+ $message['line'] = __line__;
+ $this->message[] = $message;
+ $m++;
+ }
+ }
+
+ // edit a specific uuid
+ if ($action == 'update') {
+ if (permission_exists(self::singular($parent_name) . '_edit')) {
+ // validate changes
+ $data_modified = false;
+ if (is_array($parent_field_array)) {
+ $i = 0;
+ foreach ($parent_field_array as $array_key => $array_value) {
+ // skip child array
+ if (is_array($array_value)) {
+ continue;
+ }
+
+ // get the variable type of the value
+ $database_field_type = gettype($parent_results[$i][$array_key]);
+ $user_field_type = gettype($array_value);
+
+ // trim the string and update the value
+ if ($user_field_type === 'string') {
+ // trim the string
+ $array_value = trim($array_value);
+
+ // update the user value
+ $parent_field_array[$array_key] = $array_value;
+ }
+
+ // normalize the data to match the database
+ if ($database_field_type !== $user_field_type) {
+ // normalize null
+ if ($array_value === '') {
+ $array_value = null;
}
- $child_key_value = $v;
- $uuid_exists = true;
+
+ // normalize string
+ if ($database_field_type === 'string') {
+ $array_value = (string) $array_value;
+ }
+
+ // normalize numeric
+ if ($database_field_type === 'numeric') {
+ $array_value = intval($array_value);
+ }
+
+ // normalize boolean
+ if ($database_field_type === 'boolean') {
+ if ($array_value === 'true') {
+ $array_value = true;
+ } else {
+ $array_value = false;
+ }
+ }
+ }
+
+ // verify if the data in the database has been modified
+ if ($parent_results[$i][$array_key] !== $array_value) {
+ // not matched
+ // echo "$parent_name.$array_key ".($parent_results[$i][$array_key])." != ".$array_value."\n\n";
+ $data_modified = true;
break;
}
- } else {
- $uuid_exists = false;
+
+ // increment the id
+ $i;
}
}
- //allow characters found in the uuid only
- if (isset($child_key_value)) {
- $child_key_value = self::sanitize($child_key_value);
- }
-
- //get the child field names
- $child_field_names = [];
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- if (!is_array($v) && $k !== 'checked') {
- $child_field_names[] = self::sanitize($k);
+ // parent data - process the modified data
+ if ($data_modified) {
+ // remove the child array and update the special values
+ if (is_array($parent_field_array)) {
+ foreach ($parent_field_array as $array_key => $array_value) {
+ if (is_array($array_value)) {
+ continue;
+ }
+ $array_key = self::sanitize($array_key);
+ if (!isset($array_value) || (isset($array_value) && $array_value === '')) {
+ $temp_array[$array_key] = null;
+ } elseif ($array_value === 'now()') {
+ $temp_array[$array_key] = $array_value;
+ } elseif ($array_value === 'user_uuid()') {
+ $temp_array[$array_key] = $this->user_uuid ?? null;
+ } elseif ($array_value === 'remote_address()') {
+ $temp_array[$array_key] = $_SERVER['REMOTE_ADDR'];
+ } else {
+ if (gettype($array_value) === 'string') {
+ $array_value = trim($array_value);
+ }
+ $temp_array[$array_key] = $array_value;
+ }
}
}
- }
- //determine sql update or delete and get the original data
- if ($uuid_exists) {
- $sql = "SELECT " . implode(", ", $child_field_names) . " FROM " . $child_table_name . " ";
- $sql .= "WHERE " . $child_key_name . " = '" . $child_key_value . "'; ";
+ // add to the old and new arrays
+ $old_array[$parent_name] = $parent_results;
+ $new_array[$parent_name][] = $temp_array;
+
+ // empty the temp array
+ unset($temp_array);
+
+ // prepare the update statement
+ $params = [];
+ $sql = 'UPDATE ' . $table_name . ' SET ';
+ if (is_array($parent_field_array)) {
+ foreach ($parent_field_array as $array_key => $array_value) {
+ if (is_array($array_value)) {
+ continue;
+ }
+ if ($array_key != $parent_key_name) {
+ $array_key = self::sanitize($array_key);
+ if (!isset($array_value) || (isset($array_value) && $array_value === '')) {
+ $sql .= $array_key . ' = null, ';
+ } elseif ($array_value === 'now()') {
+ $sql .= $array_key . ' = now(), ';
+ } elseif ($array_value === 'user_uuid()') {
+ $sql .= $array_key . ' = :' . $array_key . ', ';
+ $params[$array_key] = $this->user_uuid ?? null;
+ } elseif ($array_value === 'remote_address()') {
+ $sql .= $array_key . ' = :' . $array_key . ', ';
+ $params[$array_key] = $_SERVER['REMOTE_ADDR'];
+ } elseif (gettype($array_value) === 'boolean') {
+ $sql .= $array_key . ' = :' . $array_key . ', ';
+ $params[$array_key] = $array_value;
+ } else {
+ $sql .= $array_key . ' = :' . $array_key . ', ';
+ if (gettype($array_value) === 'string') {
+ $array_value = trim($array_value);
+ }
+ $params[$array_key] = $array_value;
+ }
+ }
+ }
+ }
+
+ // add the modified date and user
+ $sql .= 'update_date = now(), ';
+ $sql .= 'update_user = :update_user ';
+ $params['update_user'] = $this->user_uuid ?? null;
+
+ // add the where with the parent name and value
+ $sql .= 'WHERE ' . $parent_key_name . ' = :parent_key_value; ';
+ $params['parent_key_value'] = $parent_key_value;
+ $sql = str_replace(', WHERE', ' WHERE', $sql);
+
+ // add update user parameter
+ $params['update_user'] = $this->user_uuid ?? null;
+
+ // set the error mode
+ $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // reduce prepared statement latency
+ if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
+ $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
+ }
+
+ // run the query and return the results
try {
$prep_statement = $this->db->prepare($sql);
- if ($prep_statement) {
- //get the data
- $prep_statement->execute();
- $child_results = $prep_statement->fetch(PDO::FETCH_ASSOC);
-
- //set the action
- if (is_array($child_results)) {
- $action = "update";
- } else {
- $action = "add";
- }
+ $prep_statement->execute($params);
+ $message['message'] = 'OK';
+ $message['code'] = '200';
+ $message['uuid'] = $parent_key_value;
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ $message['details'][$m]['uuid'] = $parent_key_value;
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
}
- unset($prep_statement);
- } catch (PDOException $e) {
- $message['message'] = $e->getMessage();
- $message['code'] = $e->getCode();
- $message['line'] = $e->getLine();
- $message['file'] = $e->getFile();
- $message['trace'] = $e->getTraceAsString();
- $message['debug'] = debug_backtrace();
+ unset($params);
$this->message = $message;
- return false;
+ $m++;
+ unset($sql);
+ } catch (PDOException $e) {
+ $retval = false;
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ $message['details'][$m]['name'] = $this->app_name;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
}
-
} else {
- $action = "add";
+ $message['details'][$m]['name'] = $parent_name;
+ $message['details'][$m]['message'] = 'No Changes';
+ $message['details'][$m]['code'] = '000';
+ $message['details'][$m]['uuid'] = $parent_key_value;
+ $this->message = $message;
+ $m++;
}
+ } else {
+ $retval = false;
+ $message['message'] = "Forbidden, does not have '" . self::singular($parent_name) . "_edit'";
+ $message['code'] = '403';
+ $message['line'] = __line__;
+ $this->message = $message;
+ $m++;
+ }
+ }
- //update the child data
- if ($action == "update") {
- if (permission_exists($child_name . '_edit')) {
+ // unset the variables
+ unset($sql, $action);
- //validate changes
- $data_modified = false;
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- //sanitize the key
- $k = self::sanitize($k);
+ // child data
+ if (is_array($parent_field_array)) {
+ foreach ($parent_field_array as $key => $value) {
+ if (is_array($value)) {
+ $child_table_name = self::TABLE_PREFIX . $key;
+ $child_table_name = self::sanitize($child_table_name);
+ foreach ($value as $id => $row) {
+ // prepare the variables
+ $child_name = self::singular($key);
+ $child_name = self::sanitize($child_name);
+ $child_key_name = $child_name . '_uuid';
- //get the variable type of the value
- $database_field_type = gettype($child_results[$k]);
- $user_field_type = gettype($v);
-
- //trim the string
- if ($user_field_type === 'string') {
- $v = trim($v);
- }
-
- //normalize the data to match the database
- if ($database_field_type !== $user_field_type) {
- //normalize null
- if ($v === '') {
- $v = null;
- }
-
- //normalize string
- if ($database_field_type === 'string') {
- $v = (string)$v;
- }
-
- //normalize numeric
- if ($database_field_type === 'numeric') {
- $v = intval($v);
- }
-
- //normalize boolean
- if ($database_field_type === 'boolean') {
- if ($v === 'true') {
- $v = true;
- } else {
- $v = false;
- }
- }
- }
-
- //verify if the data in the database has been modified
- if ($child_results[$k] !== $v) {
- //not matched
- //echo "$child_name.$k ".($child_results[$k])." != ".$v."\n\n";
- $data_modified = true;
- break;
- }
- }
+ // determine if the parent key exists in the child array
+ $parent_key_exists = false;
+ if (!isset($parent_field_array[$parent_key_name])) {
+ $parent_key_exists = true;
}
- //child data - process the modified data
- if ($data_modified) {
-
- //update the special values
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- //sanitize the key
- $k = self::sanitize($k);
-
- //save the key value pairs to the temp_array
- if (!isset($v) || (isset($v) && $v == '')) {
- $temp_array[$k] = null;
- } elseif ($v === "now()") {
- $temp_array[$k] = 'now()';
- } elseif ($v === "user_uuid()") {
- $temp_array[$k] = $this->user_uuid ?? null;
- } elseif ($v === "remote_address()") {
- $temp_array[$k] = $_SERVER['REMOTE_ADDR'];
- }
- if (gettype($v) === 'boolean') {
- if ($v) {
- $v = true;
- } else {
- $v = false;
- }
- $temp_array[$k] = $v;
- } else {
+ // determine if the uuid exists
+ $uuid_exists = false;
+ if (is_array($row))
+ foreach ($row as $k => $v) {
+ if ($child_key_name == $k) {
+ if (strlen($v) > 0) {
if (gettype($v) === 'string') {
$v = trim($v);
}
- $temp_array[$k] = $v;
+ $child_key_value = $v;
+ $uuid_exists = true;
+ break;
}
+ } else {
+ $uuid_exists = false;
}
}
- //add to the old and new arrays
- $old_array[$key][] = $child_results;
- $new_array[$key][] = $temp_array;
+ // allow characters found in the uuid only
+ if (isset($child_key_value)) {
+ $child_key_value = self::sanitize($child_key_value);
+ }
- //empty the temp array
- unset($temp_array);
+ // get the child field names
+ $child_field_names = [];
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ if (!is_array($v) && $k !== 'checked') {
+ $child_field_names[] = self::sanitize($k);
+ }
+ }
+ }
- //update the child data
- $sql = "UPDATE " . $child_table_name . " SET ";
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- if (!is_array($v) && ($k != $parent_key_name || $k != $child_key_name)) {
+ // determine sql update or delete and get the original data
+ if ($uuid_exists) {
+ $sql = 'SELECT ' . implode(', ', $child_field_names) . ' FROM ' . $child_table_name . ' ';
+ $sql .= 'WHERE ' . $child_key_name . " = '" . $child_key_value . "'; ";
+ try {
+ $prep_statement = $this->db->prepare($sql);
+ if ($prep_statement) {
+ // get the data
+ $prep_statement->execute();
+ $child_results = $prep_statement->fetch(PDO::FETCH_ASSOC);
+
+ // set the action
+ if (is_array($child_results)) {
+ $action = 'update';
+ } else {
+ $action = 'add';
+ }
+ }
+ unset($prep_statement);
+ } catch (PDOException $e) {
+ $message['message'] = $e->getMessage();
+ $message['code'] = $e->getCode();
+ $message['line'] = $e->getLine();
+ $message['file'] = $e->getFile();
+ $message['trace'] = $e->getTraceAsString();
+ $message['debug'] = debug_backtrace();
+ $this->message = $message;
+ return false;
+ }
+ } else {
+ $action = 'add';
+ }
+
+ // update the child data
+ if ($action == 'update') {
+ if (permission_exists($child_name . '_edit')) {
+ // validate changes
+ $data_modified = false;
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ // sanitize the key
$k = self::sanitize($k);
- if (!isset($v) || (isset($v) && $v == '')) {
- $sql .= $k . " = null, ";
- } elseif ($v === "now()") {
- $sql .= $k . " = now(), ";
- } elseif ($v === "user_uuid()") {
- $sql .= $k . " = :" . $k . ", ";
- $params[$k] = $this->user_uuid ?? null;
- } elseif ($v === "remote_address()") {
- $sql .= $k . " = :" . $k . ", ";
- $params[$k] = $_SERVER['REMOTE_ADDR'];
- } elseif (gettype($v) === 'boolean') {
- $sql .= $k . " = :" . $k . ", ";
- $params[$k] = $v;
- } else {
- $sql .= $k . " = :" . $k . ", ";
- if (gettype($v) === 'string') {
- $v = trim($v);
+
+ // get the variable type of the value
+ $database_field_type = gettype($child_results[$k]);
+ $user_field_type = gettype($v);
+
+ // trim the string
+ if ($user_field_type === 'string') {
+ $v = trim($v);
+ }
+
+ // normalize the data to match the database
+ if ($database_field_type !== $user_field_type) {
+ // normalize null
+ if ($v === '') {
+ $v = null;
}
- $params[$k] = $v;
+
+ // normalize string
+ if ($database_field_type === 'string') {
+ $v = (string) $v;
+ }
+
+ // normalize numeric
+ if ($database_field_type === 'numeric') {
+ $v = intval($v);
+ }
+
+ // normalize boolean
+ if ($database_field_type === 'boolean') {
+ if ($v === 'true') {
+ $v = true;
+ } else {
+ $v = false;
+ }
+ }
+ }
+
+ // verify if the data in the database has been modified
+ if ($child_results[$k] !== $v) {
+ // not matched
+ // echo "$child_name.$k ".($child_results[$k])." != ".$v."\n\n";
+ $data_modified = true;
+ break;
}
}
}
- }
- //add the modified date and user
- $sql .= "update_date = now(), ";
- $sql .= "update_user = :update_user ";
- $params['update_user'] = $this->user_uuid ?? null;
-
- //add the where with the parent name and value
- $sql .= "WHERE " . $parent_key_name . " = :parent_key_value ";
- $sql .= "AND " . $child_key_name . " = :child_key_value; ";
- $params['parent_key_value'] = $parent_key_value;
- $params['child_key_value'] = $child_key_value;
- $sql = str_replace(", WHERE", " WHERE", $sql);
-
- //set the error mode
- $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
- //reduce prepared statement latency
- if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
- $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
- }
-
- try {
- $prep_statement = $this->db->prepare($sql);
- $prep_statement->execute($params);
- unset($prep_statement);
- $message["details"][$m]["name"] = $key;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- $message["details"][$m]["uuid"] = $child_key_value;
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- } catch (PDOException $e) {
- $retval = false;
- if ($message["code"] == "200") {
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- }
- $message["details"][$m]["name"] = $key;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- }
-
- } else {
- $message["details"][$m]["name"] = $key;
- $message["details"][$m]["message"] = 'No Changes';
- $message["details"][$m]["code"] = "000";
- $message["details"][$m]["uuid"] = $child_key_value;
- $this->message = $message;
- $m++;
- }
- } else {
- $retval = false;
- $message["name"] = $child_name;
- $message["message"] = "Forbidden, does not have '" . $child_name . "_edit'";
- $message["code"] = "403";
- $message["line"] = __line__;
- $this->message = $message;
- $m++;
- }
- } //action update
-
- //add the child data
- if ($action == "add") {
- if (permission_exists($child_name . '_add')) {
- //determine if child or parent key exists
- $child_key_name = $child_name . '_uuid';
- $parent_key_exists = false;
- $child_key_exists = false;
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- if ($k == $parent_key_name) {
- $parent_key_exists = true;
- }
- if ($k == $child_key_name) {
- $child_key_exists = true;
- if (gettype($v) === 'string') {
- $v = trim($v);
- }
- $child_key_value = $v;
- }
- }
- }
- if (!isset($child_key_value) || $child_key_value == '') {
- $child_key_value = uuid();
- }
-
- //add to the old and new arrays
- $old_array = null;
- $new_array[$child_name][] = $row;
-
- //build the insert
- $sql = "INSERT INTO " . $child_table_name . " ";
- $sql .= "(";
- if (!$parent_key_exists) {
- $sql .= self::singular($parent_key_name) . ", ";
- }
- if (!$child_key_exists) {
- $sql .= self::singular($child_key_name) . ", ";
- }
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- if (!is_array($v)) {
- $k = self::sanitize($k);
- if ($k != 'insert_user' &&
- $k != 'insert_date' &&
- $k != 'update_user' &&
- $k != 'update_date') {
- $sql .= $k . ", ";
- }
- }
- }
- }
- $sql .= "insert_date, ";
- $sql .= "insert_user ";
- $sql .= ") ";
- $sql .= "VALUES ";
- $sql .= "(";
- if (!$parent_key_exists) {
- $sql .= ":parent_key_value, ";
- $params['parent_key_value'] = $parent_key_value;
- }
- if (!$child_key_exists) {
- $sql .= ":child_key_value, ";
- $params['child_key_value'] = $child_key_value;
- }
- if (is_array($row)) {
- foreach ($row as $k => $v) {
- if (!is_array($v)) {
- if ($k != 'insert_user' &&
- $k != 'insert_date' &&
- $k != 'update_user' &&
- $k != 'update_date') {
- if (!isset($v) || strlen($v) == 0) {
- $sql .= "null, ";
- } elseif ($v === "now()") {
- $sql .= "now(), ";
- } elseif ($v === "user_uuid()") {
- $sql .= ':' . $k . ", ";
- $params[$k] = $this->user_uuid ?? null;
- } elseif ($v === "remote_address()") {
- $sql .= ':' . $k . ", ";
- $params[$k] = $_SERVER['REMOTE_ADDR'];
- } elseif (gettype($v) === 'boolean') {
- $sql .= ':' . $k . ", ";
- $params[$k] = $v;
- } else {
+ // child data - process the modified data
+ if ($data_modified) {
+ // update the special values
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ // sanitize the key
$k = self::sanitize($k);
- if ($k != 'insert_user' &&
- $k != 'insert_date' &&
- $k != 'update_user' &&
- $k != 'update_date') {
- $sql .= ':' . $k . ", ";
+
+ // save the key value pairs to the temp_array
+ if (!isset($v) || (isset($v) && $v == '')) {
+ $temp_array[$k] = null;
+ } elseif ($v === 'now()') {
+ $temp_array[$k] = 'now()';
+ } elseif ($v === 'user_uuid()') {
+ $temp_array[$k] = $this->user_uuid ?? null;
+ } elseif ($v === 'remote_address()') {
+ $temp_array[$k] = $_SERVER['REMOTE_ADDR'];
+ }
+ if (gettype($v) === 'boolean') {
+ if ($v) {
+ $v = true;
+ } else {
+ $v = false;
+ }
+ $temp_array[$k] = $v;
+ } else {
if (gettype($v) === 'string') {
$v = trim($v);
}
- $params[$k] = $v;
+ $temp_array[$k] = $v;
+ }
+ }
+ }
+
+ // add to the old and new arrays
+ $old_array[$key][] = $child_results;
+ $new_array[$key][] = $temp_array;
+
+ // empty the temp array
+ unset($temp_array);
+
+ // update the child data
+ $sql = 'UPDATE ' . $child_table_name . ' SET ';
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ if (!is_array($v) && ($k != $parent_key_name || $k != $child_key_name)) {
+ $k = self::sanitize($k);
+ if (!isset($v) || (isset($v) && $v == '')) {
+ $sql .= $k . ' = null, ';
+ } elseif ($v === 'now()') {
+ $sql .= $k . ' = now(), ';
+ } elseif ($v === 'user_uuid()') {
+ $sql .= $k . ' = :' . $k . ', ';
+ $params[$k] = $this->user_uuid ?? null;
+ } elseif ($v === 'remote_address()') {
+ $sql .= $k . ' = :' . $k . ', ';
+ $params[$k] = $_SERVER['REMOTE_ADDR'];
+ } elseif (gettype($v) === 'boolean') {
+ $sql .= $k . ' = :' . $k . ', ';
+ $params[$k] = $v;
+ } else {
+ $sql .= $k . ' = :' . $k . ', ';
+ if (gettype($v) === 'string') {
+ $v = trim($v);
+ }
+ $params[$k] = $v;
+ }
+ }
+ }
+ }
+
+ // add the modified date and user
+ $sql .= 'update_date = now(), ';
+ $sql .= 'update_user = :update_user ';
+ $params['update_user'] = $this->user_uuid ?? null;
+
+ // add the where with the parent name and value
+ $sql .= 'WHERE ' . $parent_key_name . ' = :parent_key_value ';
+ $sql .= 'AND ' . $child_key_name . ' = :child_key_value; ';
+ $params['parent_key_value'] = $parent_key_value;
+ $params['child_key_value'] = $child_key_value;
+ $sql = str_replace(', WHERE', ' WHERE', $sql);
+
+ // set the error mode
+ $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // reduce prepared statement latency
+ if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
+ $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
+ }
+
+ try {
+ $prep_statement = $this->db->prepare($sql);
+ $prep_statement->execute($params);
+ unset($prep_statement);
+ $message['details'][$m]['name'] = $key;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ $message['details'][$m]['uuid'] = $child_key_value;
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ } catch (PDOException $e) {
+ $retval = false;
+ if ($message['code'] == '200') {
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ }
+ $message['details'][$m]['name'] = $key;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ }
+ } else {
+ $message['details'][$m]['name'] = $key;
+ $message['details'][$m]['message'] = 'No Changes';
+ $message['details'][$m]['code'] = '000';
+ $message['details'][$m]['uuid'] = $child_key_value;
+ $this->message = $message;
+ $m++;
+ }
+ } else {
+ $retval = false;
+ $message['name'] = $child_name;
+ $message['message'] = "Forbidden, does not have '" . $child_name . "_edit'";
+ $message['code'] = '403';
+ $message['line'] = __line__;
+ $this->message = $message;
+ $m++;
+ }
+ } // action update
+
+ // add the child data
+ if ($action == 'add') {
+ if (permission_exists($child_name . '_add')) {
+ // determine if child or parent key exists
+ $child_key_name = $child_name . '_uuid';
+ $parent_key_exists = false;
+ $child_key_exists = false;
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ if ($k == $parent_key_name) {
+ $parent_key_exists = true;
+ }
+ if ($k == $child_key_name) {
+ $child_key_exists = true;
+ if (gettype($v) === 'string') {
+ $v = trim($v);
+ }
+ $child_key_value = $v;
+ }
+ }
+ }
+ if (!isset($child_key_value) || $child_key_value == '') {
+ $child_key_value = uuid();
+ }
+
+ // add to the old and new arrays
+ $old_array = null;
+ $new_array[$child_name][] = $row;
+
+ // build the insert
+ $sql = 'INSERT INTO ' . $child_table_name . ' ';
+ $sql .= '(';
+ if (!$parent_key_exists) {
+ $sql .= self::singular($parent_key_name) . ', ';
+ }
+ if (!$child_key_exists) {
+ $sql .= self::singular($child_key_name) . ', ';
+ }
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ if (!is_array($v)) {
+ $k = self::sanitize($k);
+ if ($k != 'insert_user' &&
+ $k != 'insert_date' &&
+ $k != 'update_user' &&
+ $k != 'update_date') {
+ $sql .= $k . ', ';
}
}
}
}
+ $sql .= 'insert_date, ';
+ $sql .= 'insert_user ';
+ $sql .= ') ';
+ $sql .= 'VALUES ';
+ $sql .= '(';
+ if (!$parent_key_exists) {
+ $sql .= ':parent_key_value, ';
+ $params['parent_key_value'] = $parent_key_value;
+ }
+ if (!$child_key_exists) {
+ $sql .= ':child_key_value, ';
+ $params['child_key_value'] = $child_key_value;
+ }
+ if (is_array($row)) {
+ foreach ($row as $k => $v) {
+ if (!is_array($v)) {
+ if ($k != 'insert_user' &&
+ $k != 'insert_date' &&
+ $k != 'update_user' &&
+ $k != 'update_date') {
+ if (!isset($v) || strlen($v) == 0) {
+ $sql .= 'null, ';
+ } elseif ($v === 'now()') {
+ $sql .= 'now(), ';
+ } elseif ($v === 'user_uuid()') {
+ $sql .= ':' . $k . ', ';
+ $params[$k] = $this->user_uuid ?? null;
+ } elseif ($v === 'remote_address()') {
+ $sql .= ':' . $k . ', ';
+ $params[$k] = $_SERVER['REMOTE_ADDR'];
+ } elseif (gettype($v) === 'boolean') {
+ $sql .= ':' . $k . ', ';
+ $params[$k] = $v;
+ } else {
+ $k = self::sanitize($k);
+ if ($k != 'insert_user' &&
+ $k != 'insert_date' &&
+ $k != 'update_user' &&
+ $k != 'update_date') {
+ $sql .= ':' . $k . ', ';
+ if (gettype($v) === 'string') {
+ $v = trim($v);
+ }
+ $params[$k] = $v;
+ }
+ }
+ }
+ }
+ }
+ }
+ $sql .= 'now(), ';
+ $sql .= ':insert_user ';
+ $sql .= ');';
+
+ // add insert user parameter
+ $params['insert_user'] = $this->user_uuid ?? null;
+
+ // set the error mode
+ $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // reduce prepared statement latency
+ if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
+ $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
+ }
+
+ // run the query and return the results
+ try {
+ $prep_statement = $this->db->prepare($sql);
+ $prep_statement->execute($params);
+ unset($prep_statement);
+ $message['code'] = '200';
+ $message['details'][$m]['name'] = $key;
+ $message['details'][$m]['message'] = 'OK';
+ $message['details'][$m]['code'] = '200';
+ $message['details'][$m]['uuid'] = $child_key_value;
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ } catch (PDOException $e) {
+ $retval = false;
+ if ($message['code'] == '200') {
+ $message['message'] = 'Bad Request';
+ $message['code'] = '400';
+ }
+ $message['details'][$m]['name'] = $key;
+ $message['details'][$m]['message'] = $e->getMessage();
+ $message['details'][$m]['code'] = '400';
+ $message['details'][$m]['sql'] = $sql;
+ if (is_array($params)) {
+ $message['details'][$m]['params'] = $params;
+ }
+ unset($params);
+ $this->message = $message;
+ $m++;
+ }
+ } else {
+ $retval = false;
+ $message['name'] = $child_name;
+ $message['message'] = "Forbidden, does not have '" . $child_name . "_add'";
+ $message['code'] = '403';
+ $message['line'] = __line__;
+ $this->message = $message;
+ $m++;
}
- }
- $sql .= "now(), ";
- $sql .= ":insert_user ";
- $sql .= ");";
+ } // action add
- //add insert user parameter
- $params['insert_user'] = $this->user_uuid ?? null;
+ // unset the variables
+ unset($sql, $action, $child_key_name, $child_key_value);
+ } // foreach value
+ } // is array
+ } // foreach array
+ }
+ } // foreach schema_array
+ } // foreach main array
- //set the error mode
- $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
- //reduce prepared statement latency
- if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')) {
- $this->db->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
- }
-
- //run the query and return the results
- try {
- $prep_statement = $this->db->prepare($sql);
- $prep_statement->execute($params);
- unset($prep_statement);
- $message["code"] = "200";
- $message["details"][$m]["name"] = $key;
- $message["details"][$m]["message"] = "OK";
- $message["details"][$m]["code"] = "200";
- $message["details"][$m]["uuid"] = $child_key_value;
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- } catch (PDOException $e) {
- $retval = false;
- if ($message["code"] == "200") {
- $message["message"] = "Bad Request";
- $message["code"] = "400";
- }
- $message["details"][$m]["name"] = $key;
- $message["details"][$m]["message"] = $e->getMessage();
- $message["details"][$m]["code"] = "400";
- $message["details"][$m]["sql"] = $sql;
- if (is_array($params)) {
- $message["details"][$m]["params"] = $params;
- }
- unset($params);
- $this->message = $message;
- $m++;
- }
- } else {
- $retval = false;
- $message["name"] = $child_name;
- $message["message"] = "Forbidden, does not have '" . $child_name . "_add'";
- $message["code"] = "403";
- $message["line"] = __line__;
- $this->message = $message;
- $m++;
- }
- } //action add
-
- //unset the variables
- unset($sql, $action, $child_key_name, $child_key_value);
- } // foreach value
-
- } //is array
- } //foreach array
- }
-
- } // foreach schema_array
- } // foreach main array
-
- //save the message
+ // save the message
$this->message = $message;
- //commit the atomic transaction
+ // commit the atomic transaction
$this->db->commit();
-
} catch (PDOException $e) {
- //rollback the transaction on error
+ // rollback the transaction on error
if ($this->db->inTransaction()) {
$this->db->rollback();
}
- //prepare the message array
+ // prepare the message array
$message['message'] = $e->getMessage();
$message['code'] = $e->getCode();
$message['line'] = $e->getLine();
@@ -3235,7 +3228,7 @@ class database {
return false;
}
- //set the action if not set
+ // set the action if not set
if (empty($action)) {
if (!empty($old_array)) {
$transaction_type = 'update';
@@ -3246,14 +3239,14 @@ class database {
$transaction_type = $action;
}
- //debug message
- //echo "old\n";
- //view_array($old_array, false);
- //echo "new\n";
- //view_array($new_array, false);
- //exit;
+ // debug message
+ // echo "old\n";
+ // view_array($old_array, false);
+ // echo "new\n";
+ // view_array($new_array, false);
+ // exit;
- //check to see if the database was updated; update the message code if needed
+ // check to see if the database was updated; update the message code if needed
$database_updated = false;
if (!empty($this->message['code']) && $this->message['code'] === '200') {
$database_updated = true;
@@ -3262,16 +3255,16 @@ class database {
foreach ($this->message['details'] as $row) {
if ($row['code'] === '200') {
$database_updated = true;
- $message["code"] = '200';
+ $message['code'] = '200';
break;
}
}
}
- //log the transaction results
- if ($transaction_save && $database_updated && file_exists(dirname(__DIR__, 2) . "/app/database_transactions/app_config.php")) {
+ // log the transaction results
+ if ($transaction_save && $database_updated && file_exists(dirname(__DIR__, 2) . '/app/database_transactions/app_config.php')) {
try {
- //build the json string from the array
+ // build the json string from the array
if (!empty($old_array)) {
$old_json = json_encode($old_array, JSON_PRETTY_PRINT);
}
@@ -3279,61 +3272,61 @@ class database {
$new_json = json_encode($new_array, JSON_PRETTY_PRINT);
}
- //insert the transaction into the database
- $sql = "insert into " . self::TABLE_PREFIX . "database_transactions ";
- $sql .= "(";
- $sql .= "database_transaction_uuid, ";
+ // insert the transaction into the database
+ $sql = 'insert into ' . self::TABLE_PREFIX . 'database_transactions ';
+ $sql .= '(';
+ $sql .= 'database_transaction_uuid, ';
if (isset($this->domain_uuid) && is_uuid($this->domain_uuid)) {
- $sql .= "domain_uuid, ";
+ $sql .= 'domain_uuid, ';
}
if (isset($this->user_uuid) && is_uuid($this->user_uuid)) {
- $sql .= "user_uuid, ";
+ $sql .= 'user_uuid, ';
}
if (isset($this->app_uuid) && is_uuid($this->app_uuid)) {
- $sql .= "app_uuid, ";
+ $sql .= 'app_uuid, ';
}
if (isset($this->app_name) && !empty($this->app_name)) {
- $sql .= "app_name, ";
+ $sql .= 'app_name, ';
}
- $sql .= "transaction_code, ";
- $sql .= "transaction_address, ";
- $sql .= "transaction_type, ";
- $sql .= "transaction_date, ";
- $sql .= "transaction_old, ";
- $sql .= "transaction_new, ";
- $sql .= "transaction_result ";
- $sql .= ")";
- $sql .= "values ";
- $sql .= "(";
+ $sql .= 'transaction_code, ';
+ $sql .= 'transaction_address, ';
+ $sql .= 'transaction_type, ';
+ $sql .= 'transaction_date, ';
+ $sql .= 'transaction_old, ';
+ $sql .= 'transaction_new, ';
+ $sql .= 'transaction_result ';
+ $sql .= ')';
+ $sql .= 'values ';
+ $sql .= '(';
$sql .= "'" . uuid() . "', ";
if (isset($this->domain_uuid) && is_uuid($this->domain_uuid)) {
- $sql .= ":domain_uuid, ";
+ $sql .= ':domain_uuid, ';
}
if (isset($this->user_uuid) && is_uuid($this->user_uuid)) {
- $sql .= ":user_uuid, ";
+ $sql .= ':user_uuid, ';
}
if (isset($this->app_uuid) && is_uuid($this->app_uuid)) {
- $sql .= ":app_uuid, ";
+ $sql .= ':app_uuid, ';
}
if (isset($this->app_name) && !empty($this->app_name)) {
- $sql .= ":app_name, ";
+ $sql .= ':app_name, ';
}
- $sql .= "'" . $message["code"] . "', ";
- $sql .= ":remote_address, ";
+ $sql .= "'" . $message['code'] . "', ";
+ $sql .= ':remote_address, ';
$sql .= "'" . $transaction_type . "', ";
- $sql .= "now(), ";
+ $sql .= 'now(), ';
if (!empty($old_json)) {
- $sql .= ":transaction_old, ";
+ $sql .= ':transaction_old, ';
} else {
- $sql .= "null, ";
+ $sql .= 'null, ';
}
if (!empty($new_json)) {
- $sql .= ":transaction_new, ";
+ $sql .= ':transaction_new, ';
} else {
- $sql .= "null, ";
+ $sql .= 'null, ';
}
- $sql .= ":transaction_result ";
- $sql .= ")";
+ $sql .= ':transaction_result ';
+ $sql .= ')';
$statement = $this->db->prepare($sql);
if (isset($this->domain_uuid) && is_uuid($this->domain_uuid)) {
$statement->bindParam(':domain_uuid', $this->domain_uuid);
@@ -3373,7 +3366,7 @@ class database {
return $this->message;
}
-/**
+ /**
* Toggles fields on a table using the toggle_field array values within the app object.
*
* @param array $array Three dimensional array. The first dimension is the table name without the prefix 'v_'.
@@ -3384,81 +3377,76 @@ class database {
* @depends database::get_apps()
*/
public function toggle(array $array) {
-
- //return the array
+ // return the array
if (!is_array($array)) {
return false;
}
- //set the message id
+ // set the message id
$m = 0;
- //loop through the array
+ // loop through the array
if (!empty($array) && is_array($array)) {
$x = 0;
foreach ($array as $parent_name => $tables) {
if (!empty($tables) && is_array($tables)) {
foreach ($tables as $id => $row) {
-
- //prepare the variables
+ // prepare the variables
$parent_name = self::sanitize($parent_name);
- $parent_key_name = self::singular($parent_name) . "_uuid";
+ $parent_key_name = self::singular($parent_name) . '_uuid';
- //build the toggle array
+ // build the toggle array
if (!empty($row['checked']) && $row['checked'] == 'true') {
- //toggle the field value
- //$toggle_array[$parent_name][$x][$parent_key_name] = $row[$parent_key_name];
+ // toggle the field value
+ // $toggle_array[$parent_name][$x][$parent_key_name] = $row[$parent_key_name];
$toggle_array[$parent_name][$x] = $row;
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x]);
}
- //loop through the fields
+ // loop through the fields
foreach ($row as $field_name => $field_value) {
-
- //find the child tables
+ // find the child tables
$y = 0;
if (!empty($field_value) && is_array($field_value)) {
- //prepare the variables
+ // prepare the variables
$child_name = self::sanitize($field_name);
- $child_key_name = self::singular($child_name) . "_uuid";
+ $child_key_name = self::singular($child_name) . '_uuid';
- //loop through the child rows
+ // loop through the child rows
foreach ($field_value as $sub_row) {
-
- //build the delete array
+ // build the delete array
if ($sub_row['checked'] == 'true') {
- //delete the child data
+ // delete the child data
$delete_array[$child_name][$y][$child_key_name] = $sub_row[$child_key_name];
- //remove the row from the main array
+ // remove the row from the main array
unset($array[$parent_name][$x][$child_name][$y]);
}
- //increment the value
+ // increment the value
$y++;
}
}
}
- //increment the value
+ // increment the value
$x++;
-
}
}
}
}
- //unset the original array
+ // unset the original array
unset($array);
- //get the $apps array from the installed apps from the core and mod directories
+ // get the $apps array from the installed apps from the core and mod directories
if (count(self::$apps) == 0) {
self::get_apps();
}
- //search through all fields to see if toggle field exists
+ // search through all fields to see if toggle field exists
foreach (self::$apps as $x => $app) {
if (!empty($app['db']) && is_array($app['db'])) {
foreach ($app['db'] as $y => $row) {
@@ -3481,21 +3469,21 @@ class database {
}
}
- //if the toggle field and values are empty then set defaults
+ // if the toggle field and values are empty then set defaults
if (empty($toggle_field)) {
- $toggle_field = self::singular($parent_name) . "_enabled";
+ $toggle_field = self::singular($parent_name) . '_enabled';
}
if (empty($toggle_values)) {
$toggle_values[] = 'true';
$toggle_values[] = 'false';
}
- //get the current values from the database
+ // get the current values from the database
foreach ($toggle_array as $table_name => $table) {
$x = 0;
foreach ($table as $row) {
$child_name = self::sanitize($table_name);
- $child_key_name = self::singular($child_name) . "_uuid";
+ $child_key_name = self::singular($child_name) . '_uuid';
$array[$table_name][$x][$child_key_name] = $row[$child_key_name];
$array[$table_name][$x][$toggle_field] = ($row[$toggle_field] === $toggle_values[0]) ? $toggle_values[1] : $toggle_values[0];
@@ -3504,9 +3492,8 @@ class database {
}
unset($toggle_array);
- //save the array
+ // save the array
return $this->save($array);
-
}
/**
@@ -3519,12 +3506,12 @@ class database {
* @internal Moved to class to conserve resources.
*/
public static function get_apps() {
- //get the $apps array from the installed apps from the core and mod directories
- $config_list = glob(dirname(__DIR__, 2) . "/*/*/app_config.php");
+ // get the $apps array from the installed apps from the core and mod directories
+ $config_list = glob(dirname(__DIR__, 2) . '/*/*/app_config.php');
$x = 0;
if (is_array($config_list)) {
foreach ($config_list as $config_path) {
- include($config_path);
+ include ($config_path);
$x++;
}
}
@@ -3539,8 +3526,7 @@ class database {
* @return array shows list of views, list of views that were updated
*/
public function views(string $action) {
-
- $files = glob(dirname(__DIR__, 2) . "/*/*/resources/database/views/*.php");
+ $files = glob(dirname(__DIR__, 2) . '/*/*/resources/database/views/*.php');
foreach ($files as $id => $file) {
$view = [];
try {
@@ -3553,87 +3539,88 @@ class database {
}
}
- //view list
+ // view list
if ($action === 'list') {
return $views;
}
- //update views
+ // update views
if ($action === 'create') {
$array = [];
foreach ($views as $id => $row) {
if (!empty($row['name']) && !empty($row['sql'])) {
- //set the variables
+ // set the variables
$view_name = $row['name'];
$view_sql = $row['sql'];
$view_sql = str_replace(';', '', $view_sql);
- //$view_version = $row['version'];
- //$view_description = $row['description'];
+ // $view_version = $row['version'];
+ // $view_description = $row['description'];
- $sql = "DROP VIEW " . $view_name . "\n";
+ $sql = 'DROP VIEW ' . $view_name . "\n";
$this->execute($sql);
- //create and run the view sql
- $sql = "CREATE VIEW " . $view_name . " AS (\n";
+ // create and run the view sql
+ $sql = 'CREATE VIEW ' . $view_name . " AS (\n";
$sql .= $view_sql . "\n";
$sql .= ")\n";
$this->execute($sql);
- //build the return array
+ // build the return array
$views[$id]['result'] = $this->message;
} else {
- //build the return array
+ // build the return array
$views[$id]['result'] = 'Name or SQL empty';
}
}
- //return views array
+ // return views array
return $views;
}
- //drop views
+ // drop views
if ($action === 'drop') {
$array = [];
foreach ($views as $id => $row) {
if (!empty($row['name'])) {
- //set the variables
+ // set the variables
$view_name = $row['name'];
- //create and run the view sql
- $sql = "DROP VIEW " . $view_name . ";";
+ // create and run the view sql
+ $sql = 'DROP VIEW ' . $view_name . ';';
$this->execute($sql);
- //build the return array
+ // build the return array
$views[$id]['result'] = 'Dropped';
} else {
- //build the return array
+ // build the return array
$views[$id]['result'] = 'Name or SQL empty';
}
}
- //return views array
+ // return views array
return $views;
}
}
+} // class database
-} //class database
-
-//addtitional functions for sqlite
+// addtitional functions for sqlite
if (!function_exists('php_md5')) {
- function php_md5($string) {
+ function php_md5($string)
+ {
return md5($string);
}
}
if (!function_exists('php_unix_time_stamp')) {
- function php_unix_time_stamp($string) {
+ function php_unix_time_stamp($string)
+ {
return strtotime($string);
}
}
if (!function_exists('php_now')) {
function php_now() {
- return date("Y-m-d H:i:s");
+ return date('Y-m-d H:i:s');
}
}
@@ -3650,26 +3637,26 @@ if (!function_exists('php_right')) {
}
/*
-//example usage
- //find
- $database->domain_uuid = $_SESSION["domain_uuid"];
- $database->type = $db_type;
- $database->table = "v_extensions";
- $where[0]['name'] = 'domain_uuid';
- $where[0]['value'] = $_SESSION["domain_uuid"];
- $where[0]['operator'] = '=';
- $database->where = $where;
- $order_by[0]['name'] = 'extension';
- $database->order_by = $order_by;
- $database->order_type = 'desc';
- $database->limit = '2';
- $database->offset = '0';
- $database->find();
- print_r($database->result);
- //insert
- $database->domain_uuid = $_SESSION["domain_uuid"];
- $database->table = "v_ivr_menus";
- $fields[0]['name'] = 'domain_uuid';
- $fields[0]['value'] = $_SESSION["domain_uuid"];
- echo $database->count();
-*/
+ * //example usage
+ * //find
+ * $database->domain_uuid = $_SESSION["domain_uuid"];
+ * $database->type = $db_type;
+ * $database->table = "v_extensions";
+ * $where[0]['name'] = 'domain_uuid';
+ * $where[0]['value'] = $_SESSION["domain_uuid"];
+ * $where[0]['operator'] = '=';
+ * $database->where = $where;
+ * $order_by[0]['name'] = 'extension';
+ * $database->order_by = $order_by;
+ * $database->order_type = 'desc';
+ * $database->limit = '2';
+ * $database->offset = '0';
+ * $database->find();
+ * print_r($database->result);
+ * //insert
+ * $database->domain_uuid = $_SESSION["domain_uuid"];
+ * $database->table = "v_ivr_menus";
+ * $fields[0]['name'] = 'domain_uuid';
+ * $fields[0]['value'] = $_SESSION["domain_uuid"];
+ * echo $database->count();
+ */