Update orm.php

Updated code to be more robust and handle more situations such as primary key and child key in the array but doesn't exist in the database.
This commit is contained in:
FusionPBX 2016-09-18 15:27:40 -06:00 committed by GitHub
parent 185417c45a
commit d190f6a30d
1 changed files with 258 additions and 343 deletions

View File

@ -260,53 +260,46 @@
//debug sql //debug sql
$this->debug["sql"] = true; $this->debug["sql"] = true;
//start the atomic transaction
$this->db->beginTransaction();
//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";
//set the uuid //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
$parent_key_exists = false;
if (isset($array[$parent_key_name])) { if (isset($array[$parent_key_name])) {
$this->uuid = $array[$parent_key_name]; $this->uuid = $array[$parent_key_name];
$parent_key_value = $this->uuid;
$parent_key_exists = true;
}
else {
$parent_key_value = uuid();
}
} }
//determine action update or delete //determine action update or delete and get the original data
if (isset($this->uuid)) { if ($parent_key_exists) {
$sql = "SELECT count(*) AS num_rows FROM ".$table_name." "; $sql = "SELECT * 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
$prep_statement->execute(); $prep_statement->execute();
$row = $prep_statement->fetch(PDO::FETCH_ASSOC); $parent_array = $prep_statement->fetch(PDO::FETCH_ASSOC);
if ($row['num_rows'] > 0) { //set the action
if (is_array($parent_array)) {
$action = "update"; $action = "update";
} }
else { else {
//set the action
$action = "add"; $action = "add";
//unset the primary key if it doesn't exist
unset($array[$parent_key_name]);
unset($this->uuid);
//remove parent and child keys from the data if the parent key doesn't exist
foreach ($array as $key => $value) {
if (is_array($value)) {
$child_key_name = $this->singular($key)."_uuid";
$i = 0;
foreach ($value as $row) {
foreach ($row as $k => $v) {
if ($k == $parent_key_name) {
unset($array[$key][$i][$parent_key_name]);
}
if ($k == $child_key_name) {
unset($array[$key][$i][$child_key_name]);
}
}
$i++;
}
}
}
} }
} }
unset($prep_statement); unset($prep_statement);
@ -314,28 +307,13 @@
else { else {
$action = "add"; $action = "add";
} }
//echo "action: ".$action."\n";
//add a record //add a record
//set the message index
$m = 0; $m = 0;
if ($action == "add") { if ($action == "add") {
if (permission_exists($this->singular($this->name).'_add')) { if (permission_exists($this->singular($this->name).'_add')) {
//start the atomic transaction
$this->db->beginTransaction();
//determine if child or parent key exists
$parent_key_exists = false;
foreach ($array as $k => $v) {
if ($k == $parent_key_name) { $parent_key_exists = true; }
}
//parent data
if (isset($this->uuid)) {
$parent_key_value = $this->uuid;
}
else {
$parent_key_value = uuid();
}
$sql = "INSERT INTO v_".$this->name." "; $sql = "INSERT INTO v_".$this->name." ";
$sql .= "("; $sql .= "(";
if (!$parent_key_exists) { if (!$parent_key_exists) {
@ -367,7 +345,6 @@
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try { try {
$this->db->query(check_sql($sql)); $this->db->query(check_sql($sql));
$message["message"] = "OK"; $message["message"] = "OK";
$message["code"] = "200"; $message["code"] = "200";
$message["uuid"] = $parent_key_value; $message["uuid"] = $parent_key_value;
@ -394,112 +371,6 @@
$m++; $m++;
} }
unset($sql); unset($sql);
//child data
foreach ($array as $key => $value) {
if (is_array($value)) {
if (permission_exists($this->singular($key).'_add')) {
$table_name = "v_".$key;
foreach ($value as $row) {
//prepare the variables
$child_key_name = $this->singular($key)."_uuid";
//uuid_exists true / false
$uuid_exists = false;
$child_key_value = uuid();
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;
}
}
//determine if child or parent key exists
$parent_key_exists = false;
$child_key_exists = false;
foreach ($row as $k => $v) {
if ($k == $parent_key_name) { $parent_key_exists = true; }
if ($k == $child_key_name) { $child_key_exists = true; }
}
//add the data
$sql = "INSERT INTO ".$table_name." ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= $parent_key_name.", ";
}
if (!$child_key_exists) {
$sql .= $child_key_name.", ";
}
foreach ($row as $k => $v) {
if (!is_array($v)) {
//if ($k != $child_key_name) {
$sql .= check_str($k).", ";
//}
}
}
$sql .= ") ";
$sql .= "VALUES ";
$sql .= "(";
if (!$parent_key_exists) {
$sql .= "'".$parent_key_value."', ";
}
if (!$child_key_exists) {
$sql .= "'".$child_key_value."', ";
}
foreach ($row as $k => $v) {
if (!is_array($v)) {
//if ($k != $child_key_name) {
if (strlen($v) == 0) {
$sql .= "null, ";
}
else {
$sql .= "'".check_str($v)."', ";
}
//}
}
}
$sql .= ");";
$sql = str_replace(", )", ")", $sql);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$this->db->query(check_sql($sql));
$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;
}
$this->message = $message;
$m++;
unset($sql);
}
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;
}
$this->message = $message;
}
}
}
}
}
//commit the atomic transaction
if ($message["code"] == "200") {
$this->db->commit();
}
} }
else { else {
$message["name"] = $this->name; $message["name"] = $this->name;
@ -514,11 +385,7 @@
if ($action == "update") { if ($action == "update") {
if (permission_exists($this->singular($this->name).'_edit')) { if (permission_exists($this->singular($this->name).'_edit')) {
//start the atomic transaction
$this->db->beginTransaction();
//parent data //parent data
$parent_key_value = $this->uuid;
$sql = "UPDATE v_".$this->name." SET "; $sql = "UPDATE v_".$this->name." SET ";
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
if (!is_array($value) && $key != $parent_key_name) { if (!is_array($value) && $key != $parent_key_name) {
@ -561,6 +428,18 @@
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
}
else {
$message["name"] = $this->name;
$message["message"] = "Forbidden";
$message["code"] = "403";
$this->message = $message;
$m++;
}
}
//unset the variables
unset($sql, $action);
//child data //child data
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
@ -571,7 +450,7 @@
$child_name = $this->singular($key); $child_name = $this->singular($key);
$child_key_name = $child_name."_uuid"; $child_key_name = $child_name."_uuid";
//determine if the parent key exists //determine if the parent key exists in the child array
$parent_key_exists = false; $parent_key_exists = false;
if (!isset($array[$parent_key_name])) { if (!isset($array[$parent_key_name])) {
$parent_key_exists = true; $parent_key_exists = true;
@ -579,7 +458,6 @@
//determine if the uuid exists //determine if the uuid exists
$uuid_exists = false; $uuid_exists = false;
$child_key_value = uuid();
foreach ($row as $k => $v) { foreach ($row as $k => $v) {
if ($child_key_name == $k) { if ($child_key_name == $k) {
if (strlen($v) > 0) { if (strlen($v) > 0) {
@ -593,9 +471,36 @@
} }
} }
//update the data //determine sql update or delete and get the original data
if ($uuid_exists) { if ($uuid_exists) {
$sql = "SELECT * 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)) {
$parent_array[][$child_name] = $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 "; $sql = "UPDATE ".$table_name." SET ";
foreach ($row as $k => $v) { foreach ($row as $k => $v) {
//if (!is_array($v) && $k != $child_key_name) { //original //if (!is_array($v) && $k != $child_key_name) { //original
@ -639,9 +544,17 @@
$m++; $m++;
} }
} }
else {
$message["name"] = $child_name;
$message["message"] = "Forbidden";
$message["code"] = "403";
$this->message = $message;
$m++;
}
} //action update
//add the data //add the data
if (!$uuid_exists) { if ($action == "add") {
if (permission_exists($child_name.'_add')) { if (permission_exists($child_name.'_add')) {
//determine if child or parent key exists //determine if child or parent key exists
$child_key_name = $this->singular($child_name).'_uuid'; $child_key_name = $this->singular($child_name).'_uuid';
@ -650,17 +563,13 @@
foreach ($row as $k => $v) { foreach ($row as $k => $v) {
if ($k == $parent_key_name) { if ($k == $parent_key_name) {
$parent_key_exists = true; $parent_key_exists = true;
$parent_key_value = $v;
} }
if ($k == $child_key_name) { if ($k == $child_key_name) {
$child_key_exists = true; $child_key_exists = true;
$child_key_value = $v; $child_key_value = $v;
} }
} }
if (!$parent_key_name) { if (!$child_key_value) {
$parent_key_value = uuid();
}
if (!$child_key_name) {
$child_key_value = uuid(); $child_key_value = uuid();
} }
//build the insert //build the insert
@ -726,28 +635,34 @@
$m++; $m++;
} }
} }
}
//unset the sql variable
unset($sql);
}
}
}
//commit the atomic transaction
if ($message["code"] == "200") {
$this->db->commit();
}
}
else { else {
$message["name"] = $this->name; $message["name"] = $child_name;
$message["message"] = "Forbidden"; $message["message"] = "Forbidden";
$message["code"] = "403"; $message["code"] = "403";
$this->message = $message; $this->message = $message;
$m++; $m++;
} }
}
} } //action add
//unset the variables
unset($sql, $action, $child_key_name, $child_key_value);
} // foreach value
} //is array
} //foreach array
//return the before and after data
//log this in the future
//if (is_array($parent_array)) {
// $message["old"] = $parent_array;
//}
//$message["new"] = $array;
//$this->message = $message;
//commit the atomic transaction
$this->db->commit();
} //save method
//define singular function to convert a word in english to singular //define singular function to convert a word in english to singular
private function singular($word) { private function singular($word) {