Initial Import: Database transaction handling.

Initial Import: Error handling using ewf error library.
Added a CMS_ERROR_FILTER as part of registered filters of CMS_SERVICE
This commit is contained in:
jvelilla
2014-10-09 10:01:49 -03:00
committed by Jocelyn Fiat
parent b8257e7bf0
commit 4b9a692c2c
20 changed files with 301 additions and 167 deletions

View File

@@ -10,7 +10,7 @@ inherit
DATABASE_CONFIG
SHARED_ERROR
SHARED_ERROR_HANDLER
feature {NONE} -- Initialization
@@ -72,6 +72,65 @@ feature -- Database Setup
keep_connection: BOOLEAN
-- Keep connection alive?
feature -- Transactions
begin_transaction
-- Start a transaction which will be terminated by a call to `rollback' or `commit'.
local
rescued: BOOLEAN
do
if not rescued then
if db_control.is_ok then
db_control.begin
else
database_error_handler.add_database_error (db_control.error_message_32, db_control.error_code)
end
end
rescue
rescued := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
db_control.reset
retry
end
commit
-- Commit updates in the database.
local
rescued: BOOLEAN
do
if not rescued then
if db_control.is_ok then
db_control.commit
else
database_error_handler.add_database_error (db_control.error_message_32, db_control.error_code)
end
end
rescue
rescued := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
db_control.reset
retry
end
rollback
-- Rollback updates in the database.
local
rescued: BOOLEAN
do
if not rescued then
if db_control.is_ok then
db_control.rollback
else
database_error_handler.add_database_error (db_control.error_message_32, db_control.error_code)
end
end
rescue
rescued := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
db_control.reset
retry
end
feature -- Change Element
not_keep_connection

View File

@@ -8,7 +8,7 @@ deferred class
inherit
SHARED_ERROR
SHARED_ERROR_HANDLER
feature -- Access
@@ -42,15 +42,15 @@ feature -- Modifiers
feature -- Functionality Store Procedures
execute_reader
-- Execute store.
execute_store_reader
-- Execute a `store' to read data.
require
store_not_void: store /= void
deferred
end
execute_writer
-- Execute store.
execute_store_writer
-- Execute a `store' to write data.
require
store_not_void: store /= void
deferred
@@ -59,14 +59,14 @@ feature -- Functionality Store Procedures
feature -- SQL Queries
execute_query
-- Execute query.
-- Execute sql query, the read data from the database.
require
query_not_void: query /= void
deferred
end
execute_change
-- Execute sqlquery that update/add data.
-- Execute sql query that update/add data.
require
query_not_void: query /= void
deferred
@@ -147,14 +147,49 @@ feature -- Access
feature -- Status Report
has_error: BOOLEAN
-- Is there an error?
count: INTEGER
-- Number of rows, last execution.
deferred
end
connection: DATABASE_CONNECTION
-- Database connection.
db_control: DB_CONTROL
-- Database control.
do
Result := connection.db_control
end
db_result: detachable DB_RESULT
-- Database query result.
db_selection: detachable DB_SELECTION
-- Database selection.
db_change: detachable DB_CHANGE
-- Database modification.
feature -- Error handling
check_database_change_error
-- Check database error from `db_change'.
do
if attached db_change as l_change and then not l_change.is_ok then
database_error_handler.add_database_error (l_change.error_message_32, l_change.error_code)
log.write_error (generator + ".check_database_change_error: " + l_change.error_message_32)
end
end
check_database_selection_error
-- Check database error from `db_selection'.
do
if attached db_selection as l_selection and then not l_selection.is_ok then
database_error_handler.add_database_error (l_selection.error_message_32, l_selection.error_code)
log.write_error (generator + ".check_database_selection_error: " + l_selection.error_message_32)
end
end
feature {NODE_DATA_PROVIDER}-- Implementation
connect

View File

@@ -21,7 +21,6 @@ feature {NONE} -- Initialization
do
connection := a_connection
create last_query.make_now
set_successful
ensure
connection_not_void: connection /= Void
last_query_not_void: last_query /= Void
@@ -29,71 +28,52 @@ feature {NONE} -- Initialization
feature -- Functionality
execute_reader
execute_store_reader
-- Execute stored procedure that returns data.
local
l_db_selection: DB_SELECTION
l_retried: BOOLEAN
do
if not l_retried then
if not keep_connection then
connect
end
if attached store as l_store then
create l_db_selection.make
db_selection := l_db_selection
items := l_store.execute_reader (l_db_selection)
check_database_selection_error
end
if not keep_connection then
disconnect
end
set_successful
log.write_debug ( generator+".execute_reader Successful")
end
rescue
set_last_error_from_exception ("Store procedure execution")
log.write_critical (generator+ ".execute_reader " + last_error_message)
if is_connected then
disconnect
end
l_retried := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
if attached db_selection as l_selection then
l_selection.reset
end
retry
end
execute_writer
execute_store_writer
-- Execute stored procedure that update/add data.
local
l_db_change: DB_CHANGE
l_retried : BOOLEAN
do
if not l_retried then
if not keep_connection and not is_connected then
connect
end
if attached store as l_store then
create l_db_change.make
db_update := l_db_change
db_change := l_db_change
l_store.execute_writer (l_db_change)
if not l_store.has_error then
db_control.commit
end
check_database_change_error
end
if not keep_connection then
disconnect
end
set_successful
log.write_debug ( generator+".execute_writer Successful")
end
rescue
set_last_error_from_exception ("Store procedure execution")
log.write_critical (generator+ ".execute_writer " + last_error_message)
if is_connected then
disconnect
end
l_retried := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
if attached db_change as l_change then
l_change.reset
end
retry
end
@@ -106,60 +86,43 @@ feature -- SQL Queries
l_retried: BOOLEAN
do
if not l_retried then
if not keep_connection then
connect
end
if attached query as l_query then
create l_db_selection.make
db_selection := l_db_selection
items := l_query.execute_reader (l_db_selection)
check_database_selection_error
end
if not keep_connection then
disconnect
end
set_successful
end
rescue
set_last_error_from_exception ("execute_query")
log.write_critical (generator+ ".execute_query " + last_error_message)
if is_connected then
disconnect
end
l_retried := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
if attached db_selection as l_selection then
l_selection.reset
end
retry
end
execute_change
-- Execute sqlquery that update/add data.
-- Execute sql_query that update/add data.
local
l_db_change: DB_CHANGE
l_retried : BOOLEAN
do
if not l_retried then
if not keep_connection and not is_connected then
connect
end
if attached query as l_query then
create l_db_change.make
db_update := l_db_change
db_change := l_db_change
l_query.execute_change (l_db_change)
db_control.commit
check_database_change_error
end
if not keep_connection then
disconnect
end
set_successful
end
rescue
set_last_error_from_exception ("Store procedure execution")
log.write_critical (generator+ ".execute_writer " + last_error_message)
if is_connected then
disconnect
end
l_retried := True
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
if attached db_change as l_change then
l_change.reset
end
retry
end
@@ -207,24 +170,6 @@ feature -- Iteration
feature {NONE} -- Implementation
connection: DATABASE_CONNECTION
-- Database connection.
db_control: DB_CONTROL
-- Database control.
do
Result := connection.db_control
end
db_result: detachable DB_RESULT
-- Database query result.
db_selection: detachable DB_SELECTION
-- Database selection.
db_update: detachable DB_CHANGE
-- Database modification.
last_query: DATE_TIME
-- Last time when a query was executed.
@@ -263,7 +208,7 @@ feature {NONE} -- Implementation
affected_row_count: INTEGER
-- The number of rows changed, deleted, or inserted by the last statement.
do
if attached db_update as l_update then
if attached db_change as l_update then
Result := l_update.affected_row_count
end
end

View File

@@ -1,5 +1,5 @@
note
description: "External iteration cursor for {ESA_DATABASE_HANDLER}"
description: "External iteration cursor for {DATABASE_HANDLER}"
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
revision: "$Revision: 95678 $"

View File

@@ -0,0 +1,27 @@
note
description: "Summary description for {DATABASE_NO_CHANGE_ERROR}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
DATABASE_NO_CHANGE_ERROR
inherit
DATABASE_ERROR
redefine
make_from_message
end
create
make_from_message
feature {NONE} -- Init
make_from_message (a_m: like message; a_code: like code)
-- Create from `a_m'
do
make (a_code, once "Database No Change Error", a_m)
end
end

View File

@@ -8,14 +8,14 @@ class
inherit
SHARED_ERROR
SHARED_ERROR_HANDLER
REFACTORING_HELPER
create
data_reader
feature -- Intialization
feature {NONE} -- Intialization
data_reader (a_query: STRING; a_parameters: STRING_TABLE [detachable ANY])
-- SQL data reader for the query `a_query' with arguments `a_parameters'
@@ -29,6 +29,8 @@ feature -- Intialization
parameters_set: parameters = a_parameters
end
feature -- Execution
execute_reader (a_base_selection: DB_SELECTION): detachable LIST [DB_RESULT]
-- Execute the Current sql query.
do
@@ -42,7 +44,6 @@ feature -- Intialization
a_base_selection.load_result
Result := a_base_selection.container
else
set_last_error (a_base_selection.error_message_32, generator + ".execute_reader" )
log.write_error (generator + "." + a_base_selection.error_message_32)
end
unset_map_name (a_base_selection)
@@ -50,17 +51,12 @@ feature -- Intialization
end
execute_change (a_base_change: DB_CHANGE)
-- Execute the Current sql query .
-- Execute the Current sql query to change/update data in the database.
do
to_implement ("Check test dynamic sequel. to redesign.")
set_map_name (a_base_change)
a_base_change.set_query (query)
a_base_change.execute_query
if a_base_change.is_ok then
else
set_last_error (a_base_change.error_message_32, generator + ".execute_reader" )
log.write_error (generator + "." + a_base_change.error_message_32)
end
unset_map_name (a_base_change)
end
@@ -72,17 +68,6 @@ feature -- Access
parameters: STRING_TABLE [detachable ANY]
-- query parameters.
feature -- Status Report
has_error: BOOLEAN
-- is there an error?
error_message: detachable STRING_32
-- Error message if any.
error_code: INTEGER
-- Error code.
feature {NONE} -- Implementation
set_map_name (a_base_selection: DB_EXPRESSION)
@@ -140,4 +125,4 @@ feature {NONE} -- Implementation
end
end -- ESA_DATABASE_QUERY
end -- DATABASE_QUERY

View File

@@ -0,0 +1,23 @@
note
description: "Error from database"
date: "$Date: 2013-08-08 16:39:49 -0300 (ju. 08 de ago. de 2013) $"
revision: "$Revision: 195 $"
class
DATABASE_ERROR
inherit
ERROR_CUSTOM
create
make_from_message
feature {NONE} -- Init
make_from_message (a_m: like message; a_code: like code)
-- Create from `a_m'
do
make (a_code, once "Database Error", a_m)
end
end

View File

@@ -15,21 +15,21 @@ create
feature -- Error operation
add_database_error (a_message: READABLE_STRING_32; a_code: INTEGER)
-- Add a database error
-- Add a database error.
local
-- l_error: DATABASE_ERROR
l_error: DATABASE_ERROR
do
-- create l_error.make_from_message (a_message, a_code)
-- add_error (l_error)
create l_error.make_from_message (a_message, a_code)
add_error (l_error)
end
add_database_no_change_error (a_message: READABLE_STRING_32; a_code: INTEGER)
-- Add a database error
-- Add a database error.
local
-- l_error: DATABASE_NO_CHANGE_ERROR
l_error: DATABASE_NO_CHANGE_ERROR
do
-- create l_error.make_from_message (a_message, a_code)
-- add_error (l_error)
create l_error.make_from_message (a_message, a_code)
add_error (l_error)
end
end

View File

@@ -6,14 +6,26 @@ note
class
SHARED_ERROR_HANDLER
inherit
SHARED_LOGGER
feature -- Access
database_error_handler: DATABASE_ERROR_HANDLER
-- Error handler
-- Error handler.
once
create Result.make
end
feature -- Status Report
has_error: BOOLEAN
-- Has error?
do
Result := database_error_handler.has_error
end
feature -- Helper
exception_as_error (a_e: like {EXCEPTION_MANAGER}.last_exception)

View File

@@ -21,6 +21,7 @@ feature {NONE} -- Initialization
require
is_connected: a_connection.is_connected
do
connection := a_connection
log.write_information (generator+".make_with_database is database connected? "+ a_connection.is_connected.out )
create node_provider.make (a_connection)
create user_provider.make (a_connection)
@@ -125,11 +126,14 @@ feature -- Change: user
save_user (a_user: CMS_USER)
-- Add a new user `a_user'.
do
if
attached a_user.password as l_password and then
attached a_user.email as l_email
then
connection.begin_transaction
user_provider.new_user (a_user.name, l_password, l_email)
connection.commit
else
set_last_error ("User or Password not attached", generator + ".save_user")
end
@@ -282,4 +286,6 @@ feature {NONE} -- Post process
user_provider: USER_DATA_PROVIDER
-- User Data provider.
connection: DATABASE_CONNECTION
-- Current database connection.
end

View File

@@ -34,17 +34,11 @@ feature -- Initialization
if keep_connection then
connect
end
set_successful
else
create db_control.make
end
rescue
create db_control.make
set_last_error_from_exception ("Connection execution")
log.write_critical (generator + ".make_common:" + last_error_message)
if is_connected then
disconnect
end
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
l_retried := True
retry
end
@@ -66,17 +60,11 @@ feature -- Initialization
if keep_connection then
connect
end
set_successful
else
create db_control.make
end
rescue
create db_control.make
set_last_error_from_exception ("Connection execution")
log.write_critical (generator + ".make_common:" + last_error_message)
if is_connected then
disconnect
end
exception_as_error ((create {EXCEPTION_MANAGER}).last_exception)
l_retried := True
retry
end

View File

@@ -34,7 +34,6 @@ feature -- Status Report
is_successful: BOOLEAN
-- Is the last execution sucessful?
do
Result := db_handler.successful
end
feature -- Access
@@ -481,13 +480,6 @@ feature {NONE} -- Implementation
post_execution
-- Post database execution.
do
if db_handler.successful then
set_successful
else
if attached db_handler.last_error then
set_last_error_from_handler (db_handler.last_error)
end
end
end
end

View File

@@ -35,7 +35,7 @@ feature -- Status Report
is_successful: BOOLEAN
-- Is the last execution sucessful?
do
Result := db_handler.successful
-- Result := db_handler.successful
end
has_roles: BOOLEAN
@@ -210,13 +210,7 @@ feature {NONE} -- Implementation
post_execution
-- Post database execution.
do
if db_handler.successful then
set_successful
else
if attached db_handler.last_error then
set_last_error_from_handler (db_handler.last_error)
end
end
end
end

View File

@@ -34,7 +34,6 @@ feature -- Status Report
is_successful: BOOLEAN
-- Is the last execution sucessful?
do
Result := db_handler.successful
end
has_user: BOOLEAN
@@ -311,13 +310,6 @@ feature {NONE} -- Implementation
post_execution
-- Post database execution.
do
if db_handler.successful then
set_successful
else
if attached db_handler.last_error then
set_last_error_from_handler (db_handler.last_error)
end
end
end
end

View File

@@ -24,6 +24,7 @@ feature
do
create l_parameters.make (0)
a_connection.begin_transaction
-- Clean Profiles
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_user_profiles, l_parameters))
@@ -72,6 +73,7 @@ feature
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_profiles_autoincrement, l_parameters))
db_handler(a_connection).execute_change
a_connection.commit
end