Update orm.php

This commit is contained in:
FusionPBX 2016-09-28 16:42:42 -06:00 committed by GitHub
parent 472c7efb3b
commit 37f4099632
1 changed files with 520 additions and 366 deletions

View File

@ -48,6 +48,9 @@
//public $name; //public $name;
//public $where; //public $where;
//public $message; //public $message;
//application
public $app_name;
public $app_uuid;
public function factory($name) { public function factory($name) {
$this->name = $name; $this->name = $name;
@ -246,12 +249,54 @@
$message["name"] = $this->name; $message["name"] = $this->name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$message["line"] = __line__;
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
} }
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";
//print_r($array);
//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($main_array);
//echo "after: ".$depth."<br />\n";
//print_r($main_array);
//return the array
return $return_array;
}
public function save($array) { 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
$main_array = $this->normalize_array($array, $this->name);
unset($array);
//connect to the database if needed //connect to the database if needed
if (!$this->db) { if (!$this->db) {
$this->connect(); $this->connect();
@ -261,18 +306,25 @@
$this->debug["sql"] = true; $this->debug["sql"] = true;
//start the atomic transaction //start the atomic transaction
$this->db->beginTransaction(); // $this->db->beginTransaction();
//debug info
//echo "<pre>\n";
//print_r($main_array);
//echo "</pre>\n";
//exit;
//loop through the array
foreach ($main_array as $schema_name => $schema_array) {
$this->name = $schema_name;
foreach ($schema_array as $schema_key => $array) {
//set the variables //set the variables
$table_name = "v_".$this->name; $table_name = "v_".$this->name;
$parent_key_name = $this->singular($this->name)."_uuid"; $parent_key_name = $this->singular($this->name)."_uuid";
//if the uuid is set then set parent key exists and value //if the uuid is set then set parent key exists and value
if (isset($this->uuid)) {
$parent_key_exists = true;
$parent_key_value = $this->uuid;
}
else {
//determine if the parent_key_exists //determine if the parent_key_exists
$parent_key_exists = false; $parent_key_exists = false;
if (isset($array[$parent_key_name])) { if (isset($array[$parent_key_name])) {
@ -280,20 +332,40 @@
$parent_key_value = $this->uuid; $parent_key_value = $this->uuid;
$parent_key_exists = true; $parent_key_exists = true;
} }
else {
if (isset($this->uuid)) {
$parent_key_exists = true;
$parent_key_value = $this->uuid;
}
else { else {
$parent_key_value = uuid(); $parent_key_value = uuid();
} }
} }
//get the parent field names
$parent_field_names = array();
foreach ($array as $key => $value) {
if (!is_array($value)) {
$parent_field_names[] = $key;
}
}
//determine action update or delete and get the original data //determine action update or delete and get the original data
if ($parent_key_exists) { if ($parent_key_exists) {
$sql = "SELECT * FROM ".$table_name." "; $sql = "SELECT ".implode(", ", $parent_field_names)." FROM ".$table_name." ";
$sql .= "WHERE ".$parent_key_name." = '".$this->uuid."' "; $sql .= "WHERE ".$parent_key_name." = '".$this->uuid."' ";
$prep_statement = $this->db->prepare($sql); $prep_statement = $this->db->prepare($sql);
if ($prep_statement) { if ($prep_statement) {
//get the data //get the data
try {
$prep_statement->execute(); $prep_statement->execute();
$parent_array = $prep_statement->fetch(PDO::FETCH_ASSOC); $parent_array = $prep_statement->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo 'Caught exception: ', $e->getMessage(), "<br/><br/>\n";
echo $sql;
exit;
}
//set the action //set the action
if (is_array($parent_array)) { if (is_array($parent_array)) {
$action = "update"; $action = "update";
@ -310,8 +382,8 @@
//echo "action: ".$action."\n"; //echo "action: ".$action."\n";
//add a record //add a record
$m = 0;
if ($action == "add") { if ($action == "add") {
if (permission_exists($this->singular($this->name).'_add')) { if (permission_exists($this->singular($this->name).'_add')) {
$sql = "INSERT INTO v_".$this->name." "; $sql = "INSERT INTO v_".$this->name." ";
@ -319,6 +391,9 @@
if (!$parent_key_exists) { if (!$parent_key_exists) {
$sql .= $parent_key_name.", "; $sql .= $parent_key_name.", ";
} }
//foreach ($parent_field_names as $field_name) {
// $sql .= check_str($field_name).", ";
//}
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
if (!is_array($value)) { if (!is_array($value)) {
$sql .= check_str($key).", "; $sql .= check_str($key).", ";
@ -376,7 +451,8 @@
$message["name"] = $this->name; $message["name"] = $this->name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$this->message = $message; $message["line"] = __line__;
$this->message[] = $message;
$m++; $m++;
} }
} }
@ -433,6 +509,7 @@
$message["name"] = $this->name; $message["name"] = $this->name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$message["line"] = __line__;
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
@ -443,6 +520,7 @@
//child data //child data
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
if (is_array($value)) { if (is_array($value)) {
$table_name = "v_".$key; $table_name = "v_".$key;
foreach ($value as $row) { foreach ($value as $row) {
@ -471,9 +549,17 @@
} }
} }
//get the child field names
$child_field_names = array();
foreach ($row as $k => $v) {
if (!is_array($v)) {
$child_field_names[] = $k;
}
}
//determine sql update or delete and get the original data //determine sql update or delete and get the original data
if ($uuid_exists) { if ($uuid_exists) {
$sql = "SELECT * FROM ".$table_name." "; $sql = "SELECT ". implode(", ", $child_field_names)." FROM ".$table_name." ";
$sql .= "WHERE ".$child_key_name." = '".$child_key_value."' "; $sql .= "WHERE ".$child_key_name." = '".$child_key_value."' ";
$prep_statement = $this->db->prepare($sql); $prep_statement = $this->db->prepare($sql);
if ($prep_statement) { if ($prep_statement) {
@ -489,7 +575,7 @@
} }
//add to the parent array //add to the parent array
if (is_array($child_array)) { if (is_array($child_array)) {
$parent_array[][$child_name] = $child_array; $parent_array[$key][] = $child_array;
} }
} }
unset($prep_statement); unset($prep_statement);
@ -548,6 +634,7 @@
$message["name"] = $child_name; $message["name"] = $child_name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$message["line"] = __line__;
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
@ -639,29 +726,81 @@
$message["name"] = $child_name; $message["name"] = $child_name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$message["line"] = __line__;
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
} //action add } //action add
//unset the variables //unset the variables
unset($sql, $action, $child_key_name, $child_key_value); unset($sql, $action, $child_key_name, $child_key_value);
} // foreach value } // foreach value
} //is array } //is array
} //foreach array } //foreach array
} // foreach schema_array
} // foreach main array
//return the before and after data //return the before and after data
//log this in the future //log this in the future
//if (is_array($parent_array)) { if (is_array($parent_array)) {
// $message["old"] = $parent_array; //normalize the array structure
//} $parent_array = $this->normalize_array($parent_array, $this->name);
//$message["new"] = $array; //$message["old"] = $parent_array;
//$this->message = $message; //$message["old"]["array"] = $parent_array;
//$message["old"]["md5"] = md5(json_encode($parent_array));
}
//$message["new"] = $main_array;
//$message["new"]["md5"] = md5(json_encode($main_array));
$this->message = $message;
//commit the atomic transaction //commit the atomic transaction
$this->db->commit(); // $this->db->commit();
//get the domain uuid
$domain_uuid = $_SESSION['domain_uuid'];
//log the transaction results
/*
$sql = "insert into v_database_transactions ";
$sql .= "(";
$sql .= "database_transaction_uuid, ";
$sql .= "domain_uuid, ";
$sql .= "user_uuid, ";
if (isset($this->app_uuid)) {
$sql .= "app_uuid, ";
}
$sql .= "app_name, ";
$sql .= "transaction_code, ";
$sql .= "transaction_address, ";
//$sql .= "transaction_type, ";
$sql .= "transaction_date, ";
$sql .= "transaction_before, ";
$sql .= "transaction_after, ";
$sql .= "transaction_result ";
$sql .= ")";
$sql .= "values ";
$sql .= "(";
$sql .= "'".uuid()."', ";
$sql .= "'".$domain_uuid."', ";
$sql .= "'".$_SESSION['user_uuid']."', ";
if (isset($this->app_uuid)) {
$sql .= "'".$this->app_uuid."', ";
}
$sql .= "'".$this->app_name."', ";
$sql .= "'".$message["code"]."', ";
$sql .= "'".$_SERVER['REMOTE_ADDR']."', ";
//$sql .= "'$transaction_type', ";
$sql .= "now(), ";
$sql .= "'".json_encode($parent_array, JSON_PRETTY_PRINT)."', ";
$sql .= "'".json_encode($main_array, JSON_PRETTY_PRINT)."', ";
$sql .= "'".check_str(json_encode($this->message, JSON_PRETTY_PRINT))."' ";
$sql .= ")";
$this->db->exec(check_sql($sql));
unset($sql);
*/
} //save method } //save method
//define singular function to convert a word in english to singular //define singular function to convert a word in english to singular
@ -703,6 +842,21 @@
$_SESSION['apps'] = $apps; $_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) { public 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 (!is_array($_SESSION['apps'])) { if (!is_array($_SESSION['apps'])) {
@ -724,7 +878,7 @@
return false; return false;
} }
} }
} }ƒ
//examples //examples
/* /*