From 5c53621f96d7e5a526ff98b0025e9dee89d8beb5 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Mon, 3 Apr 2017 17:38:33 +0900 Subject: [PATCH] Update DB IO to skip returning on prepare statements Same as normal exec if pk name is set to NULL --- www/libs/Class.DB.IO.inc | 56 +++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/www/libs/Class.DB.IO.inc b/www/libs/Class.DB.IO.inc index 15c91432..b7592cb1 100644 --- a/www/libs/Class.DB.IO.inc +++ b/www/libs/Class.DB.IO.inc @@ -1391,34 +1391,37 @@ // if this is an insert query, check if we can add a return if ($this->_check_query_for_insert($query, true)) { - // set primary key name - // current: only via parameter - if (!$pk_name) + if ($pk_name != 'NULL') { - // read the primary key from the table, if we do not have one, we get nothing in return - list($schema, $table) = $this->_db_return_table($query); - if (!$this->pk_name_table[$table]) + // set primary key name + // current: only via parameter + if (!$pk_name) { - $this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema); + // read the primary key from the table, if we do not have one, we get nothing in return + list($schema, $table) = $this->_db_return_table($query); + if (!$this->pk_name_table[$table]) + { + $this->pk_name_table[$table] = $this->db_functions->_db_primary_key($table, $schema); + } + $pk_name = $this->pk_name_table[$table]; } - $pk_name = $this->pk_name_table[$table]; - } - if ($pk_name) - $this->prepare_cursor[$stm_name]['pk_name'] = $pk_name; - // if no returning, then add it - if (!preg_match("/ returning /i", $query) && $this->prepare_cursor[$stm_name]['pk_name']) - { - $query .= " RETURNING ".$this->prepare_cursor[$stm_name]['pk_name']; - $this->prepare_cursor[$stm_name]['returning_id'] = true; - } - // if returning exists but not pk_name, add it - else if (preg_match("/ returning (.*)/i", $query, $matches) && $this->prepare_cursor[$stm_name]['pk_name']) - { - if (!preg_match("/{$this->prepare_cursor[$stm_name]['pk_name']}/", $matches[1])) + if ($pk_name) + $this->prepare_cursor[$stm_name]['pk_name'] = $pk_name; + // if no returning, then add it + if (!preg_match("/ returning /i", $query) && $this->prepare_cursor[$stm_name]['pk_name']) { - $query .= " , ".$this->prepare_cursor[$stm_name]['pk_name']; + $query .= " RETURNING ".$this->prepare_cursor[$stm_name]['pk_name']; + $this->prepare_cursor[$stm_name]['returning_id'] = true; + } + // if returning exists but not pk_name, add it + else if (preg_match("/ returning (.*)/i", $query, $matches) && $this->prepare_cursor[$stm_name]['pk_name']) + { + if (!preg_match("/{$this->prepare_cursor[$stm_name]['pk_name']}/", $matches[1])) + { + $query .= " , ".$this->prepare_cursor[$stm_name]['pk_name']; + } + $this->prepare_cursor[$stm_name]['returning_id'] = true; } - $this->prepare_cursor[$stm_name]['returning_id'] = true; } } // search for $1, $2, in the query and push it into the control array @@ -1484,7 +1487,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[ $this->_db_error($this->prepare_cursor[$stm_name]['result']); $this->_db_debug('db', 'DB-Error '.$stm_name.': Execution failed', 'DB_ERROR'); } - if ($this->_check_query_for_insert($this->prepare_cursor[$stm_name]['query'], true)) + if ($this->_check_query_for_insert($this->prepare_cursor[$stm_name]['query'], true) && $this->prepare_cursor[$stm_name]['pk_name'] != 'NULL') { if (!$this->prepare_cursor[$stm_name]['returning_id']) { @@ -1493,6 +1496,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[ elseif ($code) { $this->insert_id = array (); + $this->insert_id_ext = array (); // we have returning, now we need to check if we get one or many returned // we'll need to loop this, if we have multiple insert_id returns while ($_insert_id = $this->db_functions->_db_fetch_array($code, PGSQL_ASSOC)) @@ -1518,12 +1522,12 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[ } } else - { + { // failed to get insert id $this->insert_id = ''; $this->warning_id = 33; $this->_db_error('db', 'DB-Warning '.$stm_name.': insert id returned no data', 'DB_WARNING'); - } + } } // this error handling is only for pgsql if (is_array($this->insert_id))