Added persistence support for Eiffel sqlite3 wrapper.

Updated existing persistency solution to be more generic to any db solution.
This commit is contained in:
2015-10-05 16:04:10 +02:00
parent 7fcacad5eb
commit eb5ae32e46
18 changed files with 859 additions and 160 deletions

View File

@@ -37,7 +37,7 @@ feature -- URL aliases
error_handler.add_custom_error (0, "alias exists", "Path alias %"" + a_alias + "%" already exists!")
end
else
sql_change (sql_insert_path_alias, l_parameters)
sql_insert (sql_insert_path_alias, l_parameters)
end
end
@@ -63,7 +63,7 @@ feature -- URL aliases
l_parameters.put (l_previous_alias, "old")
l_parameters.put (a_alias, "alias")
sql_change (sql_update_path_alias, l_parameters)
sql_modify (sql_update_path_alias, l_parameters)
end
end
@@ -79,7 +79,7 @@ feature -- URL aliases
-- Found
create l_parameters.make (1)
l_parameters.put (a_alias, "alias")
sql_change (sql_delete_path_alias, l_parameters)
sql_modify (sql_delete_path_alias, l_parameters)
else
error_handler.add_custom_error (0, "alias mismatch", "Path alias %"" + a_alias + "%" is not related to source %"" + a_source + "%"!")
end
@@ -97,11 +97,12 @@ feature -- URL aliases
create l_parameters.make (1)
l_parameters.put (a_source, "source")
sql_query (sql_select_path_source, l_parameters)
if not has_error then
if sql_rows_count = 1 then
Result := sql_read_string (1)
end
if not has_error and not sql_after then
Result := sql_read_string (1)
sql_forth
check one_row: sql_after end
end
sql_finalize
end
source_of_path_alias (a_alias: READABLE_STRING_8): detachable READABLE_STRING_8
@@ -114,10 +115,13 @@ feature -- URL aliases
l_parameters.put (a_alias, "alias")
sql_query (sql_select_path_alias, l_parameters)
if not has_error then
if sql_rows_count = 1 then
if not has_error and not sql_after then
Result := sql_read_string (1)
sql_forth
check one_row: sql_after end
end
end
sql_finalize
end
sql_select_path_alias: STRING = "SELECT source FROM path_aliases WHERE alias=:alias ;"
@@ -166,7 +170,7 @@ feature -- Logs
l_parameters.put (Void, "link")
end
l_parameters.put (now, "date")
sql_change (sql_insert_log, l_parameters)
sql_insert (sql_insert_log, l_parameters)
end
sql_insert_log: STRING = "INSERT INTO logs (category, level, uid, message, info, link, date) VALUES (:category, :level, :uid, :message, :info, :link, :date);"
@@ -193,10 +197,10 @@ feature -- Misc
if a_value.same_string (l_value) then
-- already up to date
else
sql_change (sql_update_custom_value, l_parameters)
sql_modify (sql_update_custom_value, l_parameters)
end
else
sql_change (sql_insert_custom_value, l_parameters)
sql_insert (sql_insert_custom_value, l_parameters)
end
end
@@ -214,7 +218,7 @@ feature -- Misc
l_parameters.put (a_type, "default")
end
l_parameters.put (a_name, "name")
sql_change (sql_delete_custom_value, l_parameters)
sql_modify (sql_delete_custom_value, l_parameters)
end
custom_value (a_name: READABLE_STRING_GENERAL; a_type: detachable READABLE_STRING_8): detachable READABLE_STRING_32
@@ -232,11 +236,12 @@ feature -- Misc
end
l_parameters.put (a_name, "name")
sql_query (sql_select_custom_value, l_parameters)
if not has_error then
if sql_rows_count = 1 then
Result := sql_read_string_32 (1)
end
if not has_error and not sql_after then
Result := sql_read_string_32 (1)
sql_forth
check one_row: sql_after end
end
sql_finalize
end
sql_select_custom_value: STRING = "SELECT value FROM custom_values WHERE type=:type AND name=:name;"
@@ -252,4 +257,7 @@ feature -- Misc
-- SQL delete custom value;
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end

View File

@@ -68,19 +68,24 @@ feature -- Operation
sql_storage.sql_query (a_sql_statement, a_params)
end
sql_change (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
sql_finalize
-- Finalize sql query (i.e destroy previous query statement.
do
sql_storage.sql_change (a_sql_statement, a_params)
sql_storage.sql_finalize
end
sql_insert (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
do
sql_storage.sql_insert (a_sql_statement, a_params)
end
sql_modify (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
do
sql_storage.sql_modify (a_sql_statement, a_params)
end
feature -- Access
sql_rows_count: INTEGER
-- Number of rows for last sql execution.
do
Result := sql_storage.sql_rows_count
end
sql_start
-- Set the cursor on first element.
do
@@ -109,6 +114,16 @@ feature -- Access
Result:= sql_storage.sql_item (a_index)
end
sql_read_integer_32 (a_index: INTEGER_32): INTEGER_32
do
Result := sql_storage.sql_read_integer_32 (a_index)
end
sql_read_date_time (a_index: INTEGER_32): detachable DATE_TIME
do
Result := sql_storage.sql_read_date_time (a_index)
end
feature -- Conversion
sql_statement (a_statement: STRING): STRING
@@ -117,4 +132,7 @@ feature -- Conversion
Result := sql_storage.sql_statement (a_statement)
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end

View File

@@ -119,12 +119,22 @@ feature -- Operation
end
sql_query (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
-- <Precursor>
-- Execute sql query `a_sql_statement' with optional parameters `a_params'.
deferred
end
sql_change (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
-- <Precursor>
sql_finalize
-- Finalize sql query (i.e destroy previous query statement.
deferred
end
sql_insert (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
-- Execute sql insert `a_sql_statement' with optional parameters `a_params'.
deferred
end
sql_modify (a_sql_statement: STRING; a_params: detachable STRING_TABLE [detachable ANY])
-- Execute sql modify `a_sql_statement' with optional parameters `a_params'.
deferred
end
@@ -179,7 +189,11 @@ feature -- Helper
loop
if attached next_sql_statement (a_sql_script, i, cl) as s then
if not s.is_whitespace then
sql_change (sql_statement (s), a_params)
if s.starts_with ("INSERT") then
sql_insert (sql_statement (s), a_params)
else
sql_modify (sql_statement (s), a_params)
end
err := err or has_error
reset_error
end
@@ -217,11 +231,6 @@ feature -- Helper
feature -- Access
sql_rows_count: INTEGER
-- Number of rows for last sql execution.
deferred
end
sql_start
-- Set the cursor on first element.
deferred
@@ -279,17 +288,7 @@ feature -- Access
sql_read_integer_32 (a_index: INTEGER): INTEGER_32
-- Retrieved value at `a_index' position in `item'.
local
l_item: like sql_item
do
l_item := sql_item (a_index)
if attached {INTEGER_32} l_item as i then
Result := i
elseif attached {INTEGER_32_REF} l_item as l_value then
Result := l_value.item
else
check is_integer_32: False end
end
deferred
end
sql_read_string (a_index: INTEGER): detachable STRING
@@ -329,15 +328,7 @@ feature -- Access
sql_read_date_time (a_index: INTEGER): detachable DATE_TIME
-- Retrieved value at `a_index' position in `item'.
local
l_item: like sql_item
do
l_item := sql_item (a_index)
if attached {DATE_TIME} l_item as dt then
Result := dt
else
check is_date_time_nor_null: l_item = Void end
end
deferred
end
sql_read_boolean (a_index: INTEGER): detachable BOOLEAN

View File

@@ -30,10 +30,12 @@ feature -- Access: user
write_information_log (generator + ".user_count")
sql_query (select_users_count, Void)
if sql_rows_count = 1 then
Result := sql_read_integer_32 (1)
if not has_error and then not sql_after then
Result := sql_read_integer_64 (1).to_integer_32
sql_forth
check one_row: sql_after end
end
error_handler.reset
sql_finalize
end
users: LIST [CMS_USER]
@@ -47,13 +49,14 @@ feature -- Access: user
sql_query (select_users, Void)
sql_start
until
sql_after
sql_after or has_error
loop
if attached fetch_user as l_user then
Result.force (l_user)
end
sql_forth
end
sql_finalize
end
user_by_id (a_id: like {CMS_USER}.id): detachable CMS_USER
@@ -66,11 +69,12 @@ feature -- Access: user
create l_parameters.make (1)
l_parameters.put (a_id, "uid")
sql_query (select_user_by_id, l_parameters)
if sql_rows_count = 1 then
if not has_error and not sql_after then
Result := fetch_user
else
check no_more_than_one: sql_rows_count = 0 end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
user_by_name (a_name: like {CMS_USER}.name): detachable CMS_USER
@@ -83,11 +87,12 @@ feature -- Access: user
create l_parameters.make (1)
l_parameters.put (a_name, "name")
sql_query (select_user_by_name, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user
else
check no_more_than_one: sql_rows_count = 0 end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
user_by_email (a_email: like {CMS_USER}.email): detachable CMS_USER
@@ -100,11 +105,12 @@ feature -- Access: user
create l_parameters.make (1)
l_parameters.put (a_email, "email")
sql_query (select_user_by_email, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user
else
check no_more_than_one: sql_rows_count = 0 end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
user_by_activation_token (a_token: READABLE_STRING_32): detachable CMS_USER
@@ -117,11 +123,12 @@ feature -- Access: user
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_query (select_user_by_activation_token, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user
else
check no_more_than_one: sql_rows_count = 0 end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
user_by_password_token (a_token: READABLE_STRING_32): detachable CMS_USER
@@ -134,11 +141,12 @@ feature -- Access: user
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_query (select_user_by_password_token, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user
else
check no_more_than_one: sql_rows_count = 0 end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
is_valid_credential (l_auth_login, l_auth_password: READABLE_STRING_32): BOOLEAN
@@ -160,7 +168,6 @@ feature -- Access: user
write_information_log (generator + ".is_valid_credential User:" + l_auth_login + "does not exist" )
end
end
end
recent_users (a_lower: INTEGER; a_count: INTEGER): LIST [CMS_USER]
@@ -187,6 +194,7 @@ feature -- Access: user
end
sql_forth
end
sql_finalize
end
feature -- Change: user
@@ -216,7 +224,7 @@ feature -- Change: user
l_parameters.put (create {DATE_TIME}.make_now_utc, "created")
l_parameters.put (a_user.status, "status")
sql_change (sql_insert_user, l_parameters)
sql_insert (sql_insert_user, l_parameters)
if not error_handler.has_error then
a_user.set_id (last_inserted_user_id)
update_user_roles (a_user)
@@ -226,6 +234,7 @@ feature -- Change: user
else
sql_rollback_transaction
end
sql_finalize
else
-- set error
error_handler.add_custom_error (-1, "bad request" , "Missing password or email")
@@ -265,7 +274,7 @@ feature -- Change: user
l_parameters.put (l_email, "email")
l_parameters.put (a_user.status, "status")
sql_change (sql_update_user, l_parameters)
sql_modify (sql_update_user, l_parameters)
if not error_handler.has_error then
update_user_roles (a_user)
end
@@ -274,6 +283,7 @@ feature -- Change: user
else
sql_rollback_transaction
end
sql_finalize
else
-- set error
error_handler.add_custom_error (-1, "bad request" , "Missing password or email")
@@ -290,8 +300,9 @@ feature -- Change: user
write_information_log (generator + ".delete_user")
create l_parameters.make (1)
l_parameters.put (a_user.id, "uid")
sql_change (sql_delete_user, l_parameters)
sql_modify (sql_delete_user, l_parameters)
sql_commit_transaction
sql_finalize
end
update_user_roles (a_user: CMS_USER)
@@ -347,6 +358,7 @@ feature -- Change: user
else
sql_rollback_transaction
end
sql_finalize
end
assign_role_to_user (a_role: CMS_USER_ROLE; a_user: CMS_USER)
@@ -356,7 +368,8 @@ feature -- Change: user
create l_parameters.make (2)
l_parameters.put (a_user.id, "uid")
l_parameters.put (a_role.id, "rid")
sql_change (sql_insert_role_to_user, l_parameters)
sql_insert (sql_insert_role_to_user, l_parameters)
sql_finalize
end
unassign_role_from_user (a_role: CMS_USER_ROLE; a_user: CMS_USER)
@@ -366,7 +379,8 @@ feature -- Change: user
create l_parameters.make (2)
l_parameters.put (a_user.id, "uid")
l_parameters.put (a_role.id, "rid")
sql_change (sql_delete_role_from_user, l_parameters)
sql_modify (sql_delete_role_from_user, l_parameters)
sql_finalize
end
feature -- Access: roles and permissions
@@ -380,13 +394,16 @@ feature -- Access: roles and permissions
create l_parameters.make (1)
l_parameters.put (a_id, "rid")
sql_query (select_user_role_by_id, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user_role
sql_forth
check one_row: sql_after end
sql_finalize
if Result /= Void and not has_error then
fill_user_role (Result)
end
else
check no_more_than_one: sql_rows_count = 0 end
sql_finalize
end
end
@@ -400,13 +417,16 @@ feature -- Access: roles and permissions
create l_parameters.make (1)
l_parameters.put (a_name, "name")
sql_query (select_user_role_by_name, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := fetch_user_role
sql_forth
check one_row: sql_after end
sql_finalize
if Result /= Void and not has_error then
fill_user_role (Result)
end
else
check no_more_than_one: sql_rows_count = 0 end
sql_finalize
end
end
@@ -431,6 +451,7 @@ feature -- Access: roles and permissions
end
sql_forth
end
sql_finalize
if not has_error then
across Result as ic loop
fill_user_role (ic.item)
@@ -458,6 +479,7 @@ feature -- Access: roles and permissions
end
sql_forth
end
sql_finalize
if not has_error then
across Result as ic loop
fill_user_role (ic.item)
@@ -501,6 +523,7 @@ feature -- Access: roles and permissions
-- end
sql_forth
end
sql_finalize
end
role_permissions: LIST [READABLE_STRING_8]
@@ -522,6 +545,7 @@ feature -- Access: roles and permissions
end
sql_forth
end
sql_finalize
end
feature -- Change: roles and permissions
@@ -550,7 +574,7 @@ feature -- Change: roles and permissions
create l_parameters.make (2)
l_parameters.put (a_user_role.id, "rid")
l_parameters.put (a_user_role.name, "name")
sql_change (sql_update_user_role, l_parameters)
sql_modify (sql_update_user_role, l_parameters)
end
if not a_user_role.permissions.is_empty then
-- FIXME: check if this is non set permissions,or none ...
@@ -596,14 +620,17 @@ feature -- Change: roles and permissions
else
create l_parameters.make (1)
l_parameters.put (a_user_role.name, "name")
sql_change (sql_insert_user_role, l_parameters)
sql_insert (sql_insert_user_role, l_parameters)
if not error_handler.has_error then
a_user_role.set_id (last_inserted_user_role_id)
sql_finalize
across
a_user_role.permissions as ic
loop
set_permission_for_role_id (ic.item, a_user_role.id)
end
else
sql_finalize
end
end
end
@@ -619,7 +646,8 @@ feature -- Change: roles and permissions
l_parameters.put (a_role_id, "rid")
l_parameters.put (a_permission, "permission")
l_parameters.put (Void, "module") -- FIXME: unsupported for now!
sql_change (sql_insert_user_role_permission, l_parameters)
sql_insert (sql_insert_user_role_permission, l_parameters)
sql_finalize
end
unset_permission_for_role_id (a_permission: READABLE_STRING_8; a_role_id: INTEGER)
@@ -633,7 +661,8 @@ feature -- Change: roles and permissions
create l_parameters.make (2)
l_parameters.put (a_role_id, "rid")
l_parameters.put (a_permission, "permission")
sql_change (sql_delete_user_role_permission, l_parameters)
sql_modify (sql_delete_user_role_permission, l_parameters)
sql_finalize
end
last_inserted_user_role_id: INTEGER_32
@@ -642,9 +671,12 @@ feature -- Change: roles and permissions
error_handler.reset
write_information_log (generator + ".last_inserted_user_role_id")
sql_query (Sql_last_insert_user_role_id, Void)
if sql_rows_count = 1 then
Result := sql_read_integer_32 (1)
if not sql_after then
Result := sql_read_integer_64 (1).to_integer_32
sql_forth
check one_row: sql_after end
end
sql_finalize
end
@@ -658,9 +690,10 @@ feature -- Change: roles and permissions
write_information_log (generator + ".delete_role")
create l_parameters.make (1)
l_parameters.put (a_role.id, "rid")
sql_change (sql_delete_role_permissions_by_role_id, l_parameters)
sql_change (sql_delete_role_by_id, l_parameters)
sql_modify (sql_delete_role_permissions_by_role_id, l_parameters)
sql_modify (sql_delete_role_by_id, l_parameters)
sql_commit_transaction
sql_finalize
end
@@ -676,9 +709,12 @@ feature -- Access: User activation
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_query (sql_select_activation_expiration, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := sql_read_integer_32 (1)
sql_forth
check one_row: sql_after end
end
sql_finalize
end
user_id_by_activation (a_token: READABLE_STRING_32): INTEGER_64
@@ -691,9 +727,12 @@ feature -- Access: User activation
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_query (sql_select_userid_activation, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
Result := sql_read_integer_32 (1)
sql_forth
check one_row: sql_after end
end
sql_finalize
end
feature -- Change: User activation
@@ -712,8 +751,9 @@ feature -- Change: User activation
l_parameters.put (a_token, "token")
l_parameters.put (a_id, "uid")
l_parameters.put (l_utc_date, "utc_date")
sql_change (sql_insert_activation, l_parameters)
sql_insert (sql_insert_activation, l_parameters)
sql_commit_transaction
sql_finalize
end
remove_activation (a_token: READABLE_STRING_32)
@@ -726,8 +766,9 @@ feature -- Change: User activation
write_information_log (generator + ".remove_activation")
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_change (sql_remove_activation, l_parameters)
sql_modify (sql_remove_activation, l_parameters)
sql_commit_transaction
sql_finalize
end
feature -- Change: User password recovery
@@ -746,8 +787,9 @@ feature -- Change: User password recovery
l_parameters.put (a_token, "token")
l_parameters.put (a_id, "uid")
l_parameters.put (l_utc_date, "utc_date")
sql_change (sql_insert_password, l_parameters)
sql_insert (sql_insert_password, l_parameters)
sql_commit_transaction
sql_finalize
end
remove_password (a_token: READABLE_STRING_32)
@@ -760,8 +802,9 @@ feature -- Change: User password recovery
write_information_log (generator + ".remove_password")
create l_parameters.make (1)
l_parameters.put (a_token, "token")
sql_change (sql_remove_password, l_parameters)
sql_modify (sql_remove_password, l_parameters)
sql_commit_transaction
sql_finalize
end
feature {NONE} -- Implementation: User
@@ -776,11 +819,14 @@ feature {NONE} -- Implementation: User
create l_parameters.make (1)
l_parameters.put (a_username, "name")
sql_query (select_salt_by_username, l_parameters)
if sql_rows_count = 1 then
if not sql_after then
if attached sql_read_string (1) as l_salt then
Result := l_salt
end
sql_forth
check one_row: sql_after end
end
sql_finalize
end
fetch_user: detachable CMS_USER
@@ -826,9 +872,12 @@ feature {NONE} -- Implementation: User
error_handler.reset
write_information_log (generator + ".last_inserted_user_id")
sql_query (Sql_last_insert_user_id, Void)
if sql_rows_count = 1 then
if not sql_after then
Result := sql_read_integer_64 (1)
sql_forth
check one_row: sql_after end
end
sql_finalize
end
feature {NONE} -- Implementation: User role