fusionpbx/resources/classes/database.php

1947 lines
59 KiB
PHP
Raw Normal View History

<?php
/*
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 <markjcrane@fusionpbx.com>
2019-03-24 00:27:58 +01:00
Copyright (C) 2010 - 2019
All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
2014-06-21 06:59:25 +02:00
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
include "root.php";
//define the database class
if (!class_exists('database')) {
class database {
public $db;
public $driver;
public $type;
public $host;
public $port;
public $db_name;
public $username;
public $password;
public $path;
public $table;
public $where; //array
public $order_by; //array
public $order_type;
public $limit;
public $offset;
public $fields;
public $count;
public $sql;
public $result;
public $app_name;
public $app_uuid;
2017-09-11 08:21:36 +02:00
public $domain_uuid;
/**
* Called when the object is created
*/
public function __construct() {
if (!isset($this->domain_uuid)) {
$this->domain_uuid = $_SESSION['domain_uuid'];
}
}
/**
* Called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* Connect to the database
*/
public function connect() {
2017-07-16 01:09:01 +02:00
if (strlen($this->db_name) == 0) {
//include config.php
include "root.php";
if (file_exists($_SERVER["PROJECT_ROOT"]."/resources/config.php")) {
include $_SERVER["PROJECT_ROOT"]."/resources/config.php";
} elseif (file_exists($_SERVER["PROJECT_ROOT"]."/resources/config.php")) {
include $_SERVER["PROJECT_ROOT"]."/resources/config.php";
} elseif (file_exists("/etc/fusionpbx/config.php")){
//linux
include "/etc/fusionpbx/config.php";
2017-07-16 01:09:01 +02:00
} elseif (file_exists("/usr/local/etc/fusionpbx/config.php")) {
//bsd
include "/usr/local/etc/fusionpbx/config.php";
}
//backwards compatibility
if (isset($dbtype)) { $db_type = $dbtype; }
if (isset($dbhost)) { $db_host = $dbhost; }
if (isset($dbport)) { $db_port = $dbport; }
if (isset($dbname)) { $db_name = $dbname; }
if (isset($dbusername)) { $db_username = $dbusername; }
if (isset($dbpassword)) { $db_password = $dbpassword; }
if (isset($dbfilepath)) { $db_path = $db_file_path; }
if (isset($dbfilename)) { $db_name = $dbfilename; }
//set defaults
if (!isset($this->driver) && isset($db_type)) { $this->driver = $db_type; }
if (!isset($this->type) && isset($db_type)) { $this->type = $db_type; }
if (!isset($this->host) && isset($db_host)) { $this->host = $db_host; }
if (!isset($this->port) && isset($db_port)) { $this->port = $db_port; }
if (!isset($this->db_name) && isset($db_name)) { $this->db_name = $db_name; }
if (!isset($this->username) && isset($db_username)) { $this->username = $db_username; }
if (!isset($this->password) && isset($db_password)) { $this->password = $db_password; }
if (!isset($this->path) && isset($db_path)) { $this->path = $db_path; }
}
if (strlen($this->driver) == 0) {
$this->driver = $this->type;
}
2017-07-16 01:09:01 +02:00
//sanitize the database name
2018-05-19 02:56:06 +02:00
$this->db_name = preg_replace('#[^a-zA-Z0-9_\-\.]#', '', $this->db_name);
2017-07-16 01:09:01 +02:00
if ($this->driver == "sqlite") {
if (strlen($this->db_name) == 0) {
$server_name = $_SERVER["SERVER_NAME"];
$server_name = str_replace ("www.", "", $server_name);
$db_name_short = $server_name;
$this->db_name = $server_name.'.db';
}
else {
$db_name_short = $this->db_name;
}
$this->path = realpath($this->path);
if (file_exists($this->path.'/'.$this->db_name)) {
2016-10-20 23:03:52 +02:00
//connect to the database
$this->db = new PDO('sqlite:'.$this->path.'/'.$this->db_name); //sqlite 3
2018-05-19 23:48:02 +02:00
//PRAGMA commands
2016-10-20 23:03:52 +02:00
$this->db->query('PRAGMA foreign_keys = ON;');
2018-05-19 23:48:02 +02:00
$this->db->query('PRAGMA journal_mode = wal;');
2016-10-20 23:03:52 +02:00
//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);
$this->db->sqliteCreateFunction('sqlitedatatype', 'php_sqlite_data_type', 2);
$this->db->sqliteCreateFunction('strleft', 'php_left', 2);
$this->db->sqliteCreateFunction('strright', 'php_right', 2);
}
else {
echo "not found";
}
}
if ($this->driver == "mysql") {
try {
//mysql pdo connection
if (strlen($this->host) == 0 && strlen($this->port) == 0) {
//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 (strlen($this->port) == 0) {
//leave out port if it is empty
$this->db = new PDO("mysql:host=$this->host;dbname=$this->db_name;", $this->username, $this->password, array(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
));
}
else {
$this->db = new PDO("mysql:host=$this->host;port=$this->port;dbname=$this->db_name;", $this->username, $this->password, array(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
));
}
}
}
catch (PDOException $error) {
print "error: " . $error->getMessage() . "<br/>";
die();
}
}
if ($this->driver == "pgsql") {
//database connection
try {
if (strlen($this->host) > 0) {
if (strlen($this->port) == 0) { $this->port = "5432"; }
$this->db = new PDO("pgsql:host=$this->host port=$this->port dbname=$this->db_name user=$this->username password=$this->password");
}
else {
$this->db = new PDO("pgsql:dbname=$this->db_name user=$this->username password=$this->password");
}
}
catch (PDOException $error) {
print "error: " . $error->getMessage() . "<br/>";
die();
}
}
if ($this->driver == "odbc") {
//database connection
try {
$this->db = new PDO("odbc:".$this->db_name, $this->username, $this->password);
}
catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
}
public function tables() {
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
if ($this->type == "sqlite") {
$sql = "SELECT name FROM sqlite_master ";
$sql .= "WHERE type='table' ";
$sql .= "order by name;";
}
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 ";
}
if ($this->type == "mysql") {
$sql = "show tables";
}
if ($this->type == "mssql") {
$sql = "SELECT * FROM sys.Tables order by name asc";
}
$prep_statement = $this->db->prepare(check_sql($sql));
$prep_statement->execute();
$tmp = $prep_statement->fetchAll(PDO::FETCH_NAMED);
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 (is_array($tmp)) {
foreach ($tmp as &$row) {
$table_array = array_values($row);
$result[]['name'] = $table_array[0];
}
}
}
return $result;
}
public function table_info() {
//public $db;
//public $type;
//public $table;
//public $name;
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2017-07-16 01:09:01 +02:00
//sanitize the names
$this->table = preg_replace('#[^a-zA-Z0-9_\-]#', '', $this->table);
$this->db_name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $this->db_name);
//get the table info
if (strlen($this->table) == 0) { return false; }
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 ";
$sql .= "WHERE table_name = '".$this->table."' ";
$sql .= "and table_catalog = '".$this->db_name."' ";
$sql .= "ORDER BY ordinal_position; ";
}
if ($this->type == "mysql") {
$sql = "DESCRIBE ".$this->table.";";
}
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
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
}
public function fields() {
//public $db;
//public $type;
//public $table;
//public $name;
//get the table info
$table_info = $this->table_info();
//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 (is_array($table_info)) {
foreach($table_info as $row) {
$result[]['name'] = $row['column_name'];
}
}
}
if ($this->type == "mysql") {
if (is_array($table_info)) {
foreach($table_info as $row) {
$result[]['name'] = $row['Field'];
}
}
}
if ($this->type == "mssql") {
if (is_array($table_info)) {
foreach($table_info as $row) {
$result[]['name'] = $row['COLUMN_NAME'];
}
}
}
//return the result array
return $result;
}
//public function disconnect() {
// return null;
//}
public function find() {
//connect;
//table;
//where;
//order_by;
//limit;
//offset;
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2017-07-16 01:09:01 +02:00
//sanitize the name
$this->table = preg_replace('#[^a-zA-Z0-9_\-]#', '', $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) {
2017-07-16 01:09:01 +02:00
//sanitize the name
$array['name'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array['name']);
//validate the operator
switch ($row['operator']) {
case "<": break;
case ">": break;
case "<=": break;
case ">=": break;
case "=": break;
case ">=": break;
case "<>": break;
case "!=": break;
default:
//invalid operator
return false;
}
//build the sql
if ($i == 0) {
2017-07-16 01:09:01 +02:00
//$sql .= 'where '.$row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= 'where '.$row['name']." ".$row['operator']." :".$row['name']." ";
}
else {
2017-07-16 01:09:01 +02:00
//$sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "and ".$row['name']." ".$row['operator']." :".$row['name']." ";
}
2017-07-16 01:09:01 +02:00
//add the name and value to the params array
$params[$row['name']] = $row['value'];
//increment $i
$i++;
}
}
}
2017-07-16 01:09:01 +02:00
if (is_array($this->order_by)) {
$sql .= "order by ";
$i = 1;
if (is_array($this->order_by)) {
foreach($this->order_by as $row) {
2017-07-16 01:09:01 +02:00
//sanitize the name
$row['name'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $row['name']);
//sanitize the order
switch ($row['order']) {
case "asc":
break;
case "desc":
break;
default:
$row['order'] = '';
}
//build the sql
if (count($this->order_by) == $i) {
$sql .= $row['name']." ".$row['order']." ";
}
else {
$sql .= $row['name']." ".$row['order'].", ";
}
2017-07-16 01:09:01 +02:00
//increment $i
$i++;
}
}
}
2017-07-16 01:09:01 +02:00
//limit
if (isset($this->limit) && is_numeric($this->limit)) {
$sql .= "limit ".$this->limit." ";
}
//offset
if (isset($this->offset) && is_numeric($this->offset)) {
$sql .= "offset ".$this->offset." ";
}
2017-07-16 01:09:01 +02:00
$prep_statement = $this->db->prepare($sql);
if ($prep_statement) {
2017-07-16 01:09:01 +02:00
$prep_statement->execute($params);
$array = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
unset($prep_statement);
return $array;
}
else {
return false;
}
}
2014-06-21 06:59:25 +02:00
// Use this function to execute complex queries
2019-05-28 03:56:32 +02:00
public function execute($sql, $parameters = null, $return_type = 'all') {
2016-11-19 19:57:36 +01:00
2014-06-21 07:22:45 +02:00
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2016-11-19 19:57:36 +01:00
2019-04-23 17:28:49 +02:00
//set the error mode
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//execute the query, and return the results
try {
$prep_statement = $this->db->prepare($sql);
if (is_array($parameters)) {
$prep_statement->execute($parameters);
}
else {
$prep_statement->execute();
}
$message["message"] = "OK";
$message["code"] = "200";
$message["sql"] = $sql;
if (is_array($parameters)) {
$message["parameters"] = $parameters;
}
$this->message = $message;
2019-05-28 03:56:32 +02:00
//return the results
switch($return_type) {
case 'all':
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
case 'row':
return $prep_statement->fetch(PDO::FETCH_ASSOC);
case 'column';
return $prep_statement->fetchColumn();
default:
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
}
2014-06-21 06:59:25 +02:00
}
2019-04-23 17:28:49 +02:00
catch(PDOException $e) {
$message["message"] = "Bad Request";
$message["code"] = "400";
$message["error"]["message"] = $e->getMessage();
if ($this->debug["sql"]) {
$message["sql"] = $sql;
}
if (is_array($parameters)) {
$message["parameters"] = $parameters;
}
$this->message = $message;
2014-06-21 06:59:25 +02:00
return false;
}
}
2017-07-16 04:20:51 +02:00
public function add() {
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2017-07-16 07:06:22 +02:00
//sanitize the table name
$this->table = preg_replace('#[^a-zA-Z0-9_\-]#', '', $this->table);
2017-07-16 04:38:56 +02:00
//count the fields
$field_count = count($this->fields);
2017-07-16 04:20:51 +02:00
//add data to the database
$sql = "insert into ".$this->table;
$sql .= " (";
$i = 1;
if (is_array($this->fields)) {
foreach($this->fields as $name => $value) {
2017-07-16 07:06:22 +02:00
$name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $name);
2017-07-16 04:20:51 +02:00
if (count($this->fields) == $i) {
2017-07-16 04:38:56 +02:00
$sql .= $name." \n";
2017-07-16 04:20:51 +02:00
}
else {
2017-07-16 04:38:56 +02:00
$sql .= $name.", \n";
2017-07-16 04:20:51 +02:00
}
$i++;
}
}
2017-07-16 04:38:56 +02:00
$sql .= ") \n";
$sql .= "values \n";
$sql .= "(\n";
2017-07-16 04:20:51 +02:00
$i = 1;
if (is_array($this->fields)) {
foreach($this->fields as $name => $value) {
2017-07-16 07:06:22 +02:00
$name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $name);
2017-07-16 04:38:56 +02:00
if ($field_count == $i) {
2017-07-16 04:20:51 +02:00
if (strlen($value) > 0) {
//$sql .= "'".$value."' ";
2017-07-16 04:38:56 +02:00
$sql .= ":".$name." \n";
2017-07-16 04:20:51 +02:00
$params[$name] = $value;
}
else {
2017-07-16 04:38:56 +02:00
$sql .= "null \n";
2017-07-16 04:20:51 +02:00
}
}
else {
if (strlen($value) > 0) {
//$sql .= "'".$value."', ";
2017-07-16 04:38:56 +02:00
$sql .= ":".$name.", \n";
2017-07-16 04:20:51 +02:00
$params[$name] = $value;
}
else {
2017-07-16 04:38:56 +02:00
$sql .= "null, \n";
2017-07-16 04:20:51 +02:00
}
}
$i++;
}
}
2017-07-16 04:38:56 +02:00
$sql .= ")\n";
2017-07-16 04:20:51 +02:00
//execute the query, show exceptions
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
//$this->sql = $sql;
//$this->db->exec($sql);
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute($params);
}
catch(PDOException $e) {
echo "<b>Error:</b><br />\n";
echo "<table>\n";
echo "<tr>\n";
echo "<td>\n";
echo $e->getMessage();
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
}
unset($sql, $prep_statement, $this->fields);
}
2017-07-16 06:26:01 +02:00
public function update() {
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2017-07-16 07:06:22 +02:00
//sanitize the table name
$this->table = preg_replace('#[^a-zA-Z0-9_\-]#', '', $this->table);
2017-07-16 06:26:01 +02:00
//udate the database
$sql = "update ".$this->table." set ";
$i = 1;
if (is_array($this->fields)) {
foreach($this->fields as $name => $value) {
2017-07-16 07:06:22 +02:00
$name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $name);
2017-07-16 06:26:01 +02:00
if (count($this->fields) == $i) {
if (strlen($name) > 0 && $value == null) {
$sql .= $name." = null ";
}
else {
2017-07-16 07:06:22 +02:00
//$sql .= $name." = '".$value."' ";
$sql .= $name." = :".$name." ";
$params[$name] = $value;
2017-07-16 06:26:01 +02:00
}
}
else {
if (strlen($name) > 0 && $value == null) {
$sql .= $name." = null, ";
}
else {
2017-07-16 07:06:22 +02:00
//$sql .= $name." = '".$value."', ";
$sql .= $name." = :".$name.", ";
$params[$name] = $value;
2017-07-16 06:26:01 +02:00
}
}
$i++;
}
}
$i = 0;
if (is_array($this->where)) {
foreach($this->where as $row) {
2017-07-16 07:06:22 +02:00
//sanitize the name
$row['name'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $row['name']);
//validate the operator
switch ($row['operator']) {
case "<": break;
case ">": break;
case "<=": break;
case ">=": break;
case "=": break;
case ">=": break;
case "<>": break;
case "!=": break;
default:
//invalid operator
return false;
}
//build the sql
2017-07-16 06:26:01 +02:00
if ($i == 0) {
2017-07-16 07:06:22 +02:00
//$sql .= $row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "where ".$row['name']." ".$row['operator']." :".$row['name']." ";
2017-07-16 06:26:01 +02:00
}
else {
2017-07-16 07:06:22 +02:00
//$sql .= $row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "and ".$row['name']." ".$row['operator']." :".$row['name']." ";
2017-07-16 06:26:01 +02:00
}
2017-07-16 07:06:22 +02:00
//add the name and value to the params array
$params[$row['name']] = $row['value'];
//increment $i
2017-07-16 06:26:01 +02:00
$i++;
}
}
2017-07-16 07:06:22 +02:00
//$this->db->exec(check_sql($sql));
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute($params);
unset($prep_statement);
2017-07-16 06:26:01 +02:00
unset($this->fields);
unset($this->where);
unset($sql);
}
public function delete($array) {
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
//set the message id
$m = 0;
//set the app name
if (!isset($this->app_name)) {
$this->app_name = $this->name;
}
2019-05-06 03:30:05 +02:00
//set the table prefix
$table_prefix = 'v_';
//debug sql
$this->debug["sql"] = true;
//start the atomic transaction
2017-03-17 05:20:11 +01:00
//$this->db->beginTransaction();
//debug info
//echo "<pre>\n";
2019-05-06 03:30:05 +02:00
//print_r($array);
//echo "</pre>\n";
//exit;
2019-05-06 03:30:05 +02:00
//get the current data
foreach($array as $table_name => $rows) {
foreach($rows as $row) {
$i = 0;
$sql = "select * from ".$table_prefix.$table_name." ";
foreach($row as $field_name => $field_value) {
if ($i == 0) { $sql .= "where "; } else { $sql .= "and "; }
$sql .= $field_name." = :".$field_name." ";
$parameters[$field_name] = $field_value;
$i++;
}
2019-05-06 03:30:05 +02:00
$old_array[$table_name] = $this->execute($sql, $parameters);
unset($parameters);
}
}
2019-05-06 03:30:05 +02:00
//start the atomic transaction
$this->db->beginTransaction();
//delete the current data
foreach($array as $table_name => $rows) {
//echo "table: ".$table_name."\n";
foreach($rows as $row) {
if (permission_exists($this->singular($table_name).'_delete')) {
$sql = "delete from ".$table_prefix.$table_name." ";
$i = 0;
foreach($row as $field_name => $field_value) {
//echo "field: ".$field_name." = ".$field_value."\n";
if ($i == 0) { $sql .= "where "; } else { $sql .= "and "; }
$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->name;
$message["details"][$m]["message"] = "OK";
$message["details"][$m]["code"] = "200";
//$message["details"][$m]["uuid"] = $parent_key_value;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
}
$this->message = $message;
$m++;
unset($sql);
unset($statement);
}
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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
}
$this->message = $message;
$m++;
}
unset($parameters);
} //if permission
} //foreach rows
} //foreach $array
//commit the atomic transaction
2019-05-06 03:30:05 +02:00
$this->db->commit();
2018-02-12 16:40:23 +01:00
//set the action if not set
2019-03-24 00:27:58 +01:00
$transaction_type = 'delete';
2018-02-12 16:40:23 +01:00
//get the UUIDs
$user_uuid = $_SESSION['user_uuid'];
//log the transaction results
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/database_transactions/app_config.php")) {
$sql = "insert into v_database_transactions ";
$sql .= "(";
$sql .= "database_transaction_uuid, ";
$sql .= "domain_uuid, ";
if (strlen($user_uuid) > 0) {
$sql .= "user_uuid, ";
}
if (strlen($this->app_uuid) > 0) {
$sql .= "app_uuid, ";
}
2019-03-24 00:27:58 +01:00
if (strlen($this->app_name) > 0) {
$sql .= "app_name, ";
}
$sql .= "transaction_code, ";
$sql .= "transaction_address, ";
2018-02-12 16:40:23 +01:00
$sql .= "transaction_type, ";
$sql .= "transaction_date, ";
$sql .= "transaction_old, ";
$sql .= "transaction_new, ";
$sql .= "transaction_result ";
$sql .= ")";
$sql .= "values ";
$sql .= "(";
$sql .= "'".uuid()."', ";
2017-09-11 08:21:36 +02:00
$sql .= "'".$this->domain_uuid."', ";
if (strlen($user_uuid) > 0) {
2019-03-24 00:27:58 +01:00
$sql .= ":user_uuid, ";
}
if (strlen($this->app_uuid) > 0) {
2019-03-24 00:27:58 +01:00
$sql .= ":app_uuid, ";
}
if (strlen($this->app_name) > 0) {
2019-05-06 03:30:05 +02:00
$sql .= ":app_name, ";
}
$sql .= "'".$message["code"]."', ";
2019-03-24 00:27:58 +01:00
$sql .= ":remote_address, ";
2018-02-12 16:40:23 +01:00
$sql .= "'".$transaction_type."', ";
$sql .= "now(), ";
2018-02-12 16:40:23 +01:00
if (is_array($old_array)) {
2019-03-24 00:27:58 +01:00
$sql .= ":transaction_old, ";
2018-02-12 16:40:23 +01:00
}
else {
$sql .= "null, ";
}
if (is_array($new_array)) {
2019-03-24 00:27:58 +01:00
$sql .= ":transaction_new, ";
2018-02-12 16:40:23 +01:00
}
else {
$sql .= "null, ";
}
2019-03-24 00:27:58 +01:00
$sql .= ":transaction_result ";
$sql .= ")";
2019-03-24 00:27:58 +01:00
$statement = $this->db->prepare($sql);
if (strlen($user_uuid) > 0) {
$statement->bindParam(':user_uuid', $user_uuid);
}
if (strlen($this->app_uuid) > 0) {
$statement->bindParam(':app_uuid', $this->app_uuid);
}
if (strlen($this->app_name) > 0) {
$statement->bindParam(':app_name', $this->app_name);
}
$statement->bindParam(':remote_address', $_SERVER['REMOTE_ADDR']);
2019-03-25 16:32:00 +01:00
if (is_array($old_array)) {
$statement->bindParam(':transaction_old', json_encode($old_array, JSON_PRETTY_PRINT));
}
if (is_array($new_array)) {
$statement->bindParam(':transaction_new', json_encode($new_array, JSON_PRETTY_PRINT));
}
2019-03-24 00:27:58 +01:00
$statement->bindParam(':transaction_result', json_encode($this->message, JSON_PRETTY_PRINT));
$statement->execute();
unset($sql);
}
} //delete
public function count() {
2017-07-16 01:09:01 +02:00
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2017-07-16 01:09:01 +02:00
//sanitize the table name
$this->table = preg_replace('#[^a-zA-Z0-9_\-]#', '', $this->table);
//get the number of rows
$sql = "select count(*) as num_rows from ".$this->table." ";
if ($this->where) {
$i = 0;
if (is_array($this->where)) {
foreach($this->where as $row) {
2017-07-16 01:09:01 +02:00
//sanitize the name
$row['name'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $row['name']);
//validate the operator
switch ($row['operator']) {
case "<": break;
case ">": break;
case "<=": break;
case ">=": break;
case "=": break;
case ">=": break;
case "<>": break;
case "!=": break;
default:
//invalid operator
return false;
}
//build the sql
if ($i == 0) {
2017-07-16 01:09:01 +02:00
//$sql .= $row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "where ".$row['name']." ".$row['operator']." :".$row['name']." ";
}
else {
2017-07-16 01:09:01 +02:00
//$sql .= $row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "and ".$row['name']." ".$row['operator']." :".$row['name']." ";
}
2017-07-16 01:09:01 +02:00
//add the name and value to the params array
$params[$row['name']] = $row['value'];
//increment $i
$i++;
}
}
}
unset($this->where);
2017-07-16 01:09:01 +02:00
$prep_statement = $this->db->prepare($sql);
if ($prep_statement) {
2017-07-16 01:09:01 +02:00
$prep_statement->execute($params);
$row = $prep_statement->fetch(PDO::FETCH_ASSOC);
if ($row['num_rows'] > 0) {
2015-03-22 08:54:35 +01:00
return $row['num_rows'];
}
else {
2015-03-22 08:54:35 +01:00
return 0;
}
}
unset($prep_statement);
2017-07-16 01:09:01 +02:00
} //count
2019-05-28 03:56:32 +02:00
public function select($sql, $parameters = '', $return_type = 'all') {
2019-04-23 17:28:49 +02:00
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
2019-04-23 17:28:49 +02:00
//set the error mode
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//execute the query, and return the results
try {
2019-04-23 17:28:49 +02:00
$prep_statement = $this->db->prepare($sql);
if (is_array($parameters)) {
$prep_statement->execute($parameters);
}
else {
$prep_statement->execute();
}
$message["message"] = "OK";
$message["code"] = "200";
2019-04-23 17:28:49 +02:00
$message["sql"] = $sql;
if (is_array($parameters)) {
$message["parameters"] = $parameters;
}
$this->message = $message;
2019-05-28 03:56:32 +02:00
//return the results
switch($return_type) {
case 'all':
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
case 'row':
return $prep_statement->fetch(PDO::FETCH_ASSOC);
case 'column';
return $prep_statement->fetchColumn();
default:
return $prep_statement->fetchAll(PDO::FETCH_ASSOC);
}
}
catch(PDOException $e) {
$message["message"] = "Bad Request";
$message["code"] = "400";
2019-04-23 17:28:49 +02:00
$message["error"]["message"] = $e->getMessage();
if ($this->debug["sql"]) {
2019-04-23 17:28:49 +02:00
$message["sql"] = $sql;
}
if (is_array($parameters)) {
$message["parameters"] = $parameters;
}
$this->message = $message;
2019-04-23 17:28:49 +02:00
return false;
}
} //select
public function find_new() {
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
//set the name
if (isset($array['name'])) {
2017-07-14 18:52:30 +02:00
$this->name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array['name']);
}
//set the uuid
2017-07-16 01:09:01 +02:00
if (isset($array['uuid']) and $this->is_uuid($array['uuid'])) {
$this->uuid = $array['uuid'];
}
//build the query
$sql = "SELECT * FROM v_".$this->name." ";
if (isset($this->uuid)) {
//get the specific uuid
$sql .= "WHERE ".$this->singular($this->name)."_uuid = '".$this->uuid."' ";
}
else {
//where
$i = 0;
if (is_array($array)) {
foreach($array['where'] as $row) {
2017-07-16 01:09:01 +02:00
//sanitize the name
$array['name'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array['name']);
//validate the operator
switch ($row['operator']) {
case "<": break;
case ">": break;
case "<=": break;
case ">=": break;
case "=": break;
case ">=": break;
case "<>": break;
case "!=": break;
default:
//invalid operator
return false;
}
//build the sql
if ($i == 0) {
2017-07-16 01:09:01 +02:00
//$sql .= "WHERE ".$row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "WHERE ".$row['name']." ".$row['operator']." :".$row['value']." ";
}
else {
2017-07-16 01:09:01 +02:00
//$sql .= "AND ".$row['name']." ".$row['operator']." '".$row['value']."' ";
$sql .= "AND ".$row['name']." ".$row['operator']." :".$row['value']." ";
}
2017-07-16 01:09:01 +02:00
//add the name and value to the params array
$params[$row['name']] = $row['value'];
//increment $i
$i++;
}
}
//order by
2017-07-16 01:09:01 +02:00
if (isset($array['order_by'])) {
$array['order_by'] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array['order_by']);
$sql .= "ORDER BY ".$array['order_by']." ";
}
//limit
2017-07-16 01:09:01 +02:00
if (isset($array['limit']) && is_numeric($array['limit'])) {
$sql .= "LIMIT ".$array['limit']." ";
}
//offset
2017-07-16 01:09:01 +02:00
if (isset($array['offset']) && is_numeric($array['offset'])) {
$sql .= "OFFSET ".$array['offset']." ";
}
}
//execute the query, and return the results
try {
2017-07-16 01:09:01 +02:00
$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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
}
$this->message = $message;
$this->result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
unset($prep_statement);
$m++;
return $this;
}
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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
}
$this->message = $message;
$this->result = '';
$m++;
return $this;
}
}
private function normalize_array($array, $name) {
//get the depth of the array
$depth = $this->array_depth($array);
//before normalizing the array
//echo "before: ".$depth."<br />\n";
//echo "<pre>\n";
//print_r($array);
//echo "</pre>\n";
//normalize the array
if ($depth == 1) {
$return_array[$name][] = $array;
} else if ($depth == 2) {
$return_array[$name] = $array;
//} else if ($depth == 3) {
// $return_array[$name][] = $array;
} else {
$return_array = $array;
}
unset($array);
//after normalizing the array
$depth = $this->array_depth($new_array);
//echo "after: ".$depth."<br />\n";
//echo "<pre>\n";
//print_r($new_array);
//echo "</pre>\n";
//return the array
return $return_array;
}
public function uuid($uuid) {
$this->uuid = $uuid;
return $this;
}
public function save($array) {
//return the array
if (!is_array($array)) { echo "not an array"; return false; }
//set the message id
$m = 0;
//set the app name
if (!isset($this->app_name)) {
$this->app_name = $this->name;
}
//normalize the array structure
//$new_array = $this->normalize_array($array, $this->name);
//unset($array);
$new_array = $array;
//connect to the database if needed
if (!$this->db) {
$this->connect();
}
//debug sql
$this->debug["sql"] = true;
//start the atomic transaction
2017-07-15 04:44:45 +02:00
$this->db->beginTransaction();
//debug info
//echo "<pre>\n";
//print_r($new_array);
//echo "</pre>\n";
//exit;
2017-03-17 05:20:11 +01:00
//loop through the array
if (is_array($new_array)) foreach ($new_array as $schema_name => $schema_array) {
2017-07-14 18:52:30 +02:00
$this->name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $schema_name);
if (is_array($schema_array)) foreach ($schema_array as $schema_id => $array) {
//set the variables
$table_name = "v_".$this->name;
$parent_key_name = $this->singular($this->name)."_uuid";
2017-07-14 18:52:30 +02:00
$parent_key_name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $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($array[$parent_key_name])) {
$parent_key_value = $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();
}
}
2017-07-11 08:13:54 +02:00
//allow characters found in the uuid only.
2017-07-14 18:52:30 +02:00
$parent_key_value = preg_replace('#[^a-zA-Z0-9_\-]#', '', $parent_key_value);
2017-07-11 08:13:54 +02:00
//get the parent field names
$parent_field_names = array();
if (is_array($array)) foreach ($array as $key => $value) {
if (!is_array($value)) {
2017-07-14 18:52:30 +02:00
$parent_field_names[] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $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();
$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo 'Caught exception: ', $e->getMessage(), "<br/><br/>\n";
echo $sql;
exit;
}
//set the action
if (count($result) > 0) {
$action = "update";
$old_array[$schema_name] = $result;
}
else {
$action = "add";
}
}
unset($prep_statement);
unset($result);
}
else {
$action = "add";
}
//add a record
if ($action == "add") {
if (permission_exists($this->singular($this->name).'_add')) {
2017-07-15 04:41:23 +02:00
$params = array();
$sql = "INSERT INTO v_".$this->name." ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= $parent_key_name.", ";
}
//foreach ($parent_field_names as $field_name) {
// $sql .= check_str($field_name).", ";
//}
if (is_array($array)) foreach ($array as $array_key => $array_value) {
if (!is_array($array_value)) {
2017-07-14 18:52:30 +02:00
$array_key = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array_key);
2017-07-11 19:30:22 +02:00
$sql .= $array_key.", ";
}
}
$sql .= ") ";
$sql .= "VALUES ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= "'".$parent_key_value."', ";
}
if (is_array($array)) foreach ($array as $array_key => $array_value) {
if (!is_array($array_value)) {
if (strlen($array_value) == 0) {
$sql .= "null, ";
}
2017-07-08 09:10:28 +02:00
elseif ($array_value === "now()") {
2017-07-04 17:48:52 +02:00
$sql .= "now(), ";
}
else {
2017-07-14 18:52:30 +02:00
//$sql .= "'".check_str($array_value)."', ";
$sql .= ':'.$array_key.", ";
$params[$array_key] = $array_value;
}
}
}
$sql .= ");";
$sql = str_replace(", )", ")", $sql);
2017-07-11 20:48:20 +02:00
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
2017-07-11 20:48:20 +02:00
try {
2017-07-14 18:52:30 +02:00
//$this->db->query(check_sql($sql));
$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->name;
$message["details"][$m]["message"] = "OK";
$message["details"][$m]["code"] = "200";
$message["details"][$m]["uuid"] = $parent_key_value;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
}
}
2017-07-15 04:41:23 +02:00
unset($params);
$this->message = $message;
$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";
2017-07-14 18:52:30 +02:00
$message["details"][$m]["array"] = $array;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
}
}
2017-07-15 04:41:23 +02:00
unset($params);
$this->message = $message;
$m++;
}
unset($sql);
}
else {
$message["name"] = $this->name;
$message["message"] = "Forbidden, does not have '".$this->singular($this->name)."_add'";
$message["code"] = "403";
$message["line"] = __line__;
$this->message[] = $message;
$m++;
}
}
//edit a specific uuid
if ($action == "update") {
if (permission_exists($this->singular($this->name).'_edit')) {
//parent data
2017-07-15 04:41:23 +02:00
$params = array();
$sql = "UPDATE v_".$this->name." SET ";
if (is_array($array)) {
foreach ($array as $array_key => $array_value) {
if (!is_array($array_value) && $array_key != $parent_key_name) {
2017-07-14 18:52:30 +02:00
$array_key = preg_replace('#[^a-zA-Z0-9_\-]#', '', $array_key);
if (strlen($array_value) == 0) {
2017-07-11 19:30:22 +02:00
$sql .= $array_key." = null, ";
}
2017-07-08 09:10:28 +02:00
elseif ($array_value === "now()") {
2017-07-11 19:30:22 +02:00
$sql .= $array_key." = now(), ";
2017-07-04 17:48:52 +02:00
}
else {
2017-07-14 18:52:30 +02:00
//$sql .= $array_key." = '".check_str($array_value)."', ";
$sql .= $array_key." = :".$array_key.", ";
$params[$array_key] = $array_value;
}
}
}
}
$sql .= "WHERE ".$parent_key_name." = '".$parent_key_value."' ";
$sql = str_replace(", WHERE", " WHERE", $sql);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
2017-07-14 18:52:30 +02:00
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute($params);
//$this->db->query(check_sql($sql));
$message["message"] = "OK";
$message["code"] = "200";
$message["uuid"] = $parent_key_value;
$message["details"][$m]["name"] = $this->name;
$message["details"][$m]["message"] = "OK";
$message["details"][$m]["code"] = "200";
$message["details"][$m]["uuid"] = $parent_key_value;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
}
}
2017-07-15 04:41:23 +02:00
unset($params);
$this->message = $message;
$m++;
unset($sql);
}
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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
}
}
2017-07-15 04:41:23 +02:00
unset($params);
$this->message = $message;
$m++;
}
}
else {
$message["name"] = $this->name;
$message["message"] = "Forbidden, does not have '".$this->singular($this->name)."_edit'";
$message["code"] = "403";
$message["line"] = __line__;
$this->message = $message;
$m++;
}
}
//unset the variables
unset($sql, $action);
//child data
if (is_array($array)) foreach ($array as $key => $value) {
if (is_array($value)) {
$table_name = "v_".$key;
2017-07-14 18:52:30 +02:00
$table_name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $table_name);
foreach ($value as $id => $row) {
//prepare the variables
$child_name = $this->singular($key);
2017-07-14 18:52:30 +02:00
$child_name = preg_replace('#[^a-zA-Z0-9_\-]#', '', $child_name);
$child_key_name = $child_name."_uuid";
2017-03-17 05:20:11 +01:00
//determine if the parent key exists in the child array
$parent_key_exists = false;
if (!isset($array[$parent_key_name])) {
$parent_key_exists = 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) {
$child_key_value = $v;
$uuid_exists = true;
break;
}
}
else {
$uuid_exists = false;
}
}
2017-07-11 08:13:54 +02:00
//allow characters found in the uuid only.
2017-07-14 18:52:30 +02:00
$child_key_value = preg_replace('#[^a-zA-Z0-9_\-]#', '', $child_key_value);
2017-07-11 08:13:54 +02:00
//get the child field names
$child_field_names = array();
if (is_array($row)) foreach ($row as $k => $v) {
if (!is_array($v)) {
2017-07-14 18:52:30 +02:00
$child_field_names[] = preg_replace('#[^a-zA-Z0-9_\-]#', '', $k);
}
}
//determine sql update or delete and get the original data
if ($uuid_exists) {
$sql = "SELECT ". implode(", ", $child_field_names)." FROM ".$table_name." ";
$sql .= "WHERE ".$child_key_name." = '".$child_key_value."' ";
$prep_statement = $this->db->prepare($sql);
if ($prep_statement) {
//get the data
$prep_statement->execute();
$child_array = $prep_statement->fetch(PDO::FETCH_ASSOC);
//set the action
if (is_array($child_array)) {
$action = "update";
}
else {
$action = "add";
}
//add to the parent array
if (is_array($child_array)) {
$old_array[$schema_name][$schema_id][$key][] = $child_array;
}
}
unset($prep_statement);
}
else {
$action = "add";
}
//update the data
if ($action == "update") {
if (permission_exists($child_name.'_edit')) {
$sql = "UPDATE ".$table_name." SET ";
if (is_array($row)) {
foreach ($row as $k => $v) {
if (!is_array($v) && ($k != $parent_key_name || $k != $child_key_name)) {
2017-07-14 18:52:30 +02:00
$k = preg_replace('#[^a-zA-Z0-9_\-]#', '', $k);
if (strlen($v) == 0) {
2017-07-11 19:30:22 +02:00
$sql .= $k." = null, ";
}
2017-07-08 09:10:28 +02:00
elseif ($v === "now()") {
2017-07-11 19:30:22 +02:00
$sql .= $k." = now(), ";
2017-07-04 17:48:52 +02:00
}
else {
2017-07-14 18:52:30 +02:00
//$sql .= "$k = '".check_str($v)."', ";
2017-07-15 04:41:23 +02:00
$sql .= $k." = :".$k.", ";
$params[$k] = $v;
}
}
}
}
$sql .= "WHERE ".$parent_key_name." = '".$parent_key_value."' ";
$sql .= "AND ".$child_key_name." = '".$child_key_value."' ";
$sql = str_replace(", WHERE", " WHERE", $sql);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
2017-07-11 19:30:22 +02:00
2017-09-11 08:21:36 +02:00
//$prep_statement->bindParam(':domain_uuid', $this->domain_uuid );
2017-07-11 19:30:22 +02:00
try {
2017-07-14 18:52:30 +02:00
//$this->db->query(check_sql($sql));
$prep_statement = $this->db->prepare($sql);
$prep_statement->execute($params);
2017-07-15 04:41:23 +02:00
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;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
unset($params);
}
}
$this->message = $message;
$m++;
}
catch(PDOException $e) {
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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
unset($params);
}
}
$this->message = $message;
$m++;
}
}
else {
$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 data
if ($action == "add") {
if (permission_exists($child_name.'_add')) {
//determine if child or parent key exists
2017-03-17 05:20:11 +01:00
$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;
$child_key_value = $v;
}
}
}
if (!$child_key_value) {
$child_key_value = uuid();
}
//build the insert
$sql = "INSERT INTO ".$table_name." ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= $this->singular($parent_key_name).", ";
}
if (!$child_key_exists) {
$sql .= $this->singular($child_key_name).", ";
}
if (is_array($row)) {
foreach ($row as $k => $v) {
if (!is_array($v)) {
2017-07-14 18:52:30 +02:00
$k = preg_replace('#[^a-zA-Z0-9_\-]#', '', $k);
2017-07-11 19:30:22 +02:00
$sql .= $k.", ";
}
}
}
$sql .= ") ";
$sql .= "VALUES ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= "'".$parent_key_value."', ";
}
if (!$child_key_exists) {
$sql .= "'".$child_key_value."', ";
}
if (is_array($row)) {
foreach ($row as $k => $v) {
if (!is_array($v)) {
if (strlen($v) == 0) {
$sql .= "null, ";
}
2017-07-08 09:10:28 +02:00
elseif ($v === "now()") {
2017-07-04 17:48:52 +02:00
$sql .= "now(), ";
}
else {
2017-07-14 18:52:30 +02:00
$k = preg_replace('#[^a-zA-Z0-9_\-]#', '', $k);
//$sql .= "'".check_str($v)."', ";
$sql .= ':'.$k.", ";
$params[$k] = $v;
}
}
}
}
$sql .= ");";
$sql = str_replace(", )", ")", $sql);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
2017-07-14 18:52:30 +02:00
//$this->db->query(check_sql($sql));
$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;
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
unset($params);
}
}
$this->message = $message;
$m++;
}
catch(PDOException $e) {
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";
if ($this->debug["sql"]) {
$message["details"][$m]["sql"] = $sql;
2017-07-14 18:52:30 +02:00
if (is_array($params)) {
$message["details"][$m]["params"] = $params;
unset($params);
}
}
$this->message = $message;
$m++;
}
}
else {
$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
//return the before and after data
//log this in the future
//if (is_array($old_array)) {
//normalize the array structure
//$old_array = $this->normalize_array($old_array, $this->name);
//debug info
//echo "<pre>\n";
//print_r($old_array);
//echo "</pre>\n";
//exit;
//}
//$message["new"] = $new_array;
//$message["new"]["md5"] = md5(json_encode($new_array));
$this->message = $message;
//commit the atomic transaction
2017-07-15 04:44:45 +02:00
$this->db->commit();
2018-02-12 16:40:23 +01:00
//set the action if not set
if (strlen($action) == 0) {
if (is_array($old_array)) {
$transaction_type = 'update';
}
else {
$transaction_type = 'add';
}
}
else {
$transaction_type = $action;
}
//get the UUIDs
$user_uuid = $_SESSION['user_uuid'];
//log the transaction results
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/database_transactions/app_config.php")) {
2019-03-24 00:27:58 +01:00
try {
$sql = "insert into v_database_transactions ";
$sql .= "(";
$sql .= "database_transaction_uuid, ";
$sql .= "domain_uuid, ";
if (strlen($user_uuid) > 0) {
$sql .= "user_uuid, ";
}
if (strlen($this->app_uuid) > 0) {
$sql .= "app_uuid, ";
}
if (strlen($this->app_name) > 0) {
$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 .= "'".uuid()."', ";
if (is_null($this->domain_uuid)) {
$sql .= "null, ";
}
else {
$sql .= "'".$this->domain_uuid."', ";
}
if (strlen($user_uuid) > 0) {
$sql .= ":user_uuid, ";
}
if (strlen($this->app_uuid) > 0) {
$sql .= ":app_uuid, ";
}
if (strlen($this->app_name) > 0) {
$sql .= ":app_name, ";
}
$sql .= "'".$message["code"]."', ";
$sql .= ":remote_address, ";
$sql .= "'".$transaction_type."', ";
$sql .= "now(), ";
if (is_array($old_array)) {
$sql .= ":transaction_old, ";
}
else {
$sql .= "null, ";
}
if (is_array($new_array)) {
$sql .= ":transaction_new, ";
}
else {
$sql .= "null, ";
}
$sql .= ":transaction_result ";
$sql .= ")";
$statement = $this->db->prepare($sql);
if (strlen($user_uuid) > 0) {
$statement->bindParam(':user_uuid', $user_uuid);
}
if (strlen($this->app_uuid) > 0) {
$statement->bindParam(':app_uuid', $this->app_uuid);
}
if (strlen($this->app_name) > 0) {
$statement->bindParam(':app_name', $this->app_name);
}
$statement->bindParam(':remote_address', $_SERVER['REMOTE_ADDR']);
2019-03-25 16:32:00 +01:00
if (is_array($old_array)) {
2019-04-09 18:49:51 +02:00
$old_json = json_encode($old_array, JSON_PRETTY_PRINT);
$statement->bindParam(':transaction_old', $old_json);
2019-03-25 16:32:00 +01:00
}
if (is_array($new_array)) {
2019-04-09 18:49:51 +02:00
$new_json = json_encode($new_array, JSON_PRETTY_PRINT);
$statement->bindParam(':transaction_new', $new_json);
2019-03-25 16:32:00 +01:00
}
2019-04-09 18:49:51 +02:00
$message = json_encode($this->message, JSON_PRETTY_PRINT);
$statement->bindParam(':transaction_result', $message);
2019-03-24 00:27:58 +01:00
$statement->execute();
unset($sql);
2018-02-12 16:40:23 +01:00
}
2019-03-24 00:27:58 +01:00
catch(PDOException $e) {
echo $e->getMessage();
exit;
2018-02-12 16:40:23 +01:00
}
}
2019-03-24 00:27:58 +01:00
} //save method
//define singular function to convert a word in english to singular
private function singular($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, -3, 1) == "x") {
return substr($word,0,-2);
}
if (substr($word, -3, 1) == "s") {
return substr($word,0,-2);
}
elseif (substr($word, -3, 1) == "z") {
return substr($word,0,-2);
}
elseif (substr($word, -4, 2) == "sh") {
return substr($word,0,-2);
}
elseif (substr($word, -4, 2) == "ch") {
return substr($word,0,-2);
}
else {
return rtrim($word, "s");
}
}
else {
return rtrim($word, "s");
}
}
public function get_apps() {
//get the $apps array from the installed apps from the core and mod directories
$config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php");
$x = 0;
if (is_array($config_list)) {
foreach ($config_list as &$config_path) {
include($config_path);
$x++;
}
}
$_SESSION['apps'] = $apps;
}
public function array_depth($array) {
if (is_array($array)) {
foreach ($array as $value) {
if (!isset($depth)) { $depth = 1; }
if (is_array($value)) {
$depth = $this->array_depth($value) + 1;
}
}
}
else {
$depth = 0;
}
return $depth;
}
public function domain_uuid_exists($name) {
//get the $apps array from the installed apps from the core and mod directories
if (!is_array($_SESSION['apps'])) {
$this->get_apps();
}
//search through all fields to see if domain_uuid exists
$apps = $_SESSION['apps'];
if (is_array($apps)) {
foreach ($apps as $x => &$app) {
if (is_array($app['db'])) {
foreach ($app['db'] as $y => &$row) {
if ($row['table'] == $name) {
if (is_array($row['fields'])) {
foreach ($row['fields'] as $z => $field) {
if ($field['name'] == "domain_uuid") {
return true;
}
} //foreach
} //is array
}
} //foreach
} //is array
} //foreach
} //is array
//not found
return false;
}
} //class database
} //!class_exists
2016-10-20 23:03:52 +02:00
//addtitional functions for sqlite
if (!function_exists('php_md5')) {
function php_md5($string) {
return md5($string);
}
}
2016-10-20 23:03:52 +02:00
if (!function_exists('php_unix_time_stamp')) {
function php_unix_time_stamp($string) {
return strtotime($string);
}
}
2016-10-20 23:03:52 +02:00
if (!function_exists('php_now')) {
function php_now() {
return date("Y-m-d H:i:s");
}
}
2016-10-20 23:03:52 +02:00
if (!function_exists('php_left')) {
function php_left($string, $num) {
return substr($string, 0, $num);
}
}
2016-10-20 23:03:52 +02:00
if (!function_exists('php_right')) {
function php_right($string, $num) {
return substr($string, (strlen($string)-$num), strlen($string));
}
}
/*
2016-10-20 23:03:52 +02:00
//example usage
//find
require_once "resources/classes/database.php";
$database = new database;
$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
require_once "resources/classes/database.php";
$database = new database;
$database->domain_uuid = $_SESSION["domain_uuid"];
$database->table = "v_ivr_menus";
$fields[0]['name'] = 'domain_uuid';
$fields[0]['value'] = $_SESSION["domain_uuid"];
2017-07-16 01:09:01 +02:00
echo $database->count();
2017-07-16 01:20:21 +02:00
*/
2018-02-12 16:40:23 +01:00
?>