From 58aee2faa7ab32edcedaf68d346593de9ddb3cb6 Mon Sep 17 00:00:00 2001 From: artem Date: Wed, 19 Mar 2008 17:56:41 +0000 Subject: - [DEV-139] added transaction functionality to frontend (Artem) - many small fixes (Artem) git-svn-id: svn://svn.zabbix.com/trunk@5505 97f52cf1-0a1b-0410-bd0e-c28be96e8082 --- frontends/php/include/db.inc.php | 301 ++++++++++++++++++++++++--------------- 1 file changed, 186 insertions(+), 115 deletions(-) (limited to 'frontends/php/include/db.inc.php') diff --git a/frontends/php/include/db.inc.php b/frontends/php/include/db.inc.php index a0bbaf4d..fda0e808 100644 --- a/frontends/php/include/db.inc.php +++ b/frontends/php/include/db.inc.php @@ -19,13 +19,13 @@ **/ ?> 1){ + info("POSSIBLE ERROR: Used incorect logic in database processing started subtransaction!"); + } + $result = true; +// TODO OCI_DEFAULT + break; + case "SQLITE3": + $DB_TRANSACTIONS++; + + if(1 == $DB_TRANSACTIONS){ + lock_db_access(); + $result = DBexecute('begin;'); + } + else{ + error("POSSIBLE ERROR: Used incorect logic in database processing started subtransaction!"); + } + break; + } + return $result; } - function DBend($result) - { - /* end transaction *//* TODO */ - - if($result) - { // OK - /* commit TODO */ + + function DBend($result=true){ + if($result){ // OK + $result = DBcommit(); } - else - { // FAIL - /* rollback TODO */ + + if(!$result){ // FAIL + DBrollback(); + } +//SDI('TRANSACTION ENDED: '.$result); + return $result; + } + + function DBcommit(){ + global $DB,$DB_TYPE,$DB_TRANSACTIONS; +//SDI('COMMITED!'); + $result = false; + if( isset($DB) && !empty($DB) ) + switch($DB_TYPE){ + case "MYSQL": + $result = DBexecute('commit;'); + break; + case "POSTGRESQL": + $result = DBexecute('commit;'); + break; + case "ORACLE": + $result = ocicommit(); + $DB_TRANSACTIONS = 0; + break; + case "SQLITE3": + if($DB_TRANSACTIONS>1) + $DB_TRANSACTIONS--; + + if(1 == $DB_TRANSACTIONS){ + $result = DBexecute('commit;'); + $DB_TRANSACTIONS = 0; + + unlock_db_access(); + } + break; + } + return $result; + } + + function DBrollback(){ + global $DB,$DB_TYPE,$DB_TRANSACTIONS; +//SDI('ROLLED BACK!'); + $result = false; + if( isset($DB) && !empty($DB) ) + switch($DB_TYPE){ + case "MYSQL": + $result = DBexecute('rollback;'); + break; + case "POSTGRESQL": + $result = DBexecute('rollback;'); + break; + case "ORACLE": + $result = ocirollback(); + $DB_TRANSACTIONS = 0; + break; + case "SQLITE3": + if($DB_TRANSACTIONS>1) + $DB_TRANSACTIONS--; + + if(1 == $DB_TRANSACTIONS){ + $result = DBexecute('rollback;'); + $DB_TRANSACTIONS = 0; + + unlock_db_access(); + } + break; } - // unlock_db_access(); /* check DBselect & DBexecute */ + return $result; } + /* NOTE: LIMIT and OFFSET records @@ -266,72 +348,64 @@ function &DBselect($query, $limit='NO') { - global $DB, $DB_TYPE; + global $DB, $DB_TYPE, $DB_TRANSACTIONS; //COpt::savesqlrequest($query); $result = false; if( isset($DB) && !empty($DB) ) - switch($DB_TYPE) - { + switch($DB_TYPE){ case "MYSQL": - if(is_numeric($limit)) - { + if(is_numeric($limit)){ $query .= ' limit '.intval($limit); } $result=mysql_query($query,$DB); - if(!$result) - { + if(!$result){ error("Error in query [$query] [".mysql_error()."]"); } break; case "POSTGRESQL": - if(is_numeric($limit)) - { + if(is_numeric($limit)){ $query .= ' limit '.intval($limit); } - if(!($result = pg_query($DB,$query))) - { + $result = pg_query($DB,$query); + if(!$result){ error("Error in query [$query] [".pg_last_error()."]"); } break; case "ORACLE": - if(is_numeric($limit)) - { + if(is_numeric($limit)){ $query = 'select * from ('.$query.') where rownum<'.intval($limit); } $stid=OCIParse($DB,$query); - if(!$stid) - { + if(!$stid){ $e=@ocierror(); error("SQL error [".$e["message"]."] in [".$e["sqltext"]."]"); } - $result=@OCIExecute($stid); - if(!$result) - { + + $result=@OCIExecute($stid,($DB_TRANSACTIONS?OCI_DEFAULT:OCI_COMMIT_ON_SUCCESS)); + if(!$result){ $e=ocierror($stid); error("SQL error [".$e["message"]."] in [".$e["sqltext"]."]"); } - else - { + else{ $result = $stid; } break; case "SQLITE3": - lock_db_access(); - if(!($result = sqlite3_query($DB,$query))) - { - error("Error in query [$query] [".sqlite3_error($DB)."]"); - } - else - { + if(!$DB_TRANSACTIONS){ + lock_db_access(); + } + + if(!($result = sqlite3_query($DB,$query))){ + error("Error in query [$query] [".sqlite3_error($DB)."]"); + } + else{ $data = array(); - while($row = sqlite3_fetch_array($result)) - { - foreach($row as $id => $name) - { + while($row = sqlite3_fetch_array($result)){ + foreach($row as $id => $name){ if(!zbx_strstr($id,'.')) continue; $ids = explode('.',$id); $row[array_pop($ids)] = $row[$id]; @@ -344,69 +418,69 @@ $result = &$data; } - unlock_db_access(); + if(!$DB_TRANSACTIONS){ + unlock_db_access(); + } break; } return $result; } - function DBexecute($query, $skip_error_messages=0) - { - global $DB,$DB_TYPE; + function DBexecute($query, $skip_error_messages=0){ + global $DB,$DB_TYPE,$DB_TRANSACTIONS; //COpt::savesqlrequest($query); $result = false; if( isset($DB) && !empty($DB) ) - switch($DB_TYPE) - { + switch($DB_TYPE){ case "MYSQL": $result=mysql_query($query,$DB); - if(!$result) - { + if(!$result){ error("Error in query [$query] [".mysql_error()."]"); } break; case "POSTGRESQL": - if(!($result = pg_query($DB,$query))) - { + if(!($result = pg_query($DB,$query))){ error("Error in query [$query] [".pg_last_error()."]"); } break; case "ORACLE": $result = DBselect($query); - if(!$result) - { + if(!$result){ $e = ocierror($stid); error("SQL error [".$e["message"]."] in [".$e["sqltext"]."]"); } break; case "SQLITE3": - lock_db_access(); + if(!$DB_TRANSACTIONS){ + lock_db_access(); + } + $result = sqlite3_exec($DB, $query); - if(!$result) - { + if(!$result){ error("Error in query [$query] [".sqlite3_error($DB)."]"); } - unlock_db_access(); + + if(!$DB_TRANSACTIONS){ + unlock_db_access(); + } break; } - return $result; + return $result; } - function DBfetch(&$cursor) - { + function DBfetch(&$cursor){ global $DB, $DB_TYPE; $result = false; - if( isset($DB) && !empty($DB) ) - switch($DB_TYPE) - { + if(isset($DB) && !empty($DB)) + switch($DB_TYPE){ case "MYSQL": $result = mysql_fetch_assoc($cursor); break; @@ -422,17 +496,14 @@ } break; case "SQLITE3": - if($cursor) - { + if($cursor){ $result = array_shift($cursor); - if(is_null($result)) $result = false; - } break; } - return $result; + return $result; } -- cgit