Yair Zaslavsky has uploaded a new change for review. Change subject: core: Adding saveOrUpdate to DbUserDao ......................................................................
core: Adding saveOrUpdate to DbUserDao Change-Id: I4b6add7cbbe0a3055b6eb11ebf67cc77fec4bf53 Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com> --- M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DbUserDAOTest.java M packaging/dbscripts/user_sp.sql 4 files changed, 98 insertions(+), 15 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/28429/1 diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java index e480d9a..ccb5a33 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAO.java @@ -97,4 +97,11 @@ * the user id */ void remove(Guid user); + + /** + * Saves or updates the user. + * + * @param user + */ + void saveOrUpdate(DbUser user); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java index f90790c..0986441 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DbUserDAODbFacadeImpl.java @@ -164,4 +164,9 @@ getCallsHandler().executeModification("DeleteUser", parameterSource); } + @Override + public void saveOrUpdate(DbUser user) { + new SimpleJdbcCall(jdbcTemplate).withProcedureName("InsertOrUpdateUser").execute(new DbUserMapSqlParameterSource(user)); + } + } diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DbUserDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DbUserDAOTest.java index 88ea8d5..6b5fb4d 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DbUserDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/DbUserDAOTest.java @@ -223,6 +223,29 @@ assertEquals(existingUser, result); } + @Test + public void testSaveOrUpdateExisting() { + int sizeBeforeSave = dao.getAll().size(); + existingUser.setFirstName("changedname"); + existingUser.setLastName("changedsurname"); + int sizeAfterSave = dao.getAll().size(); + dao.saveOrUpdate(existingUser); + DbUser result = dao.get(existingUser.getId()); + assertEquals(existingUser, result); + assertEquals(0, sizeAfterSave - sizeBeforeSave); + + } + + @Test + public void testSaveOrUpdateNew() { + int sizeBeforeSave = dao.getAll().size(); + dao.saveOrUpdate(newUser); + DbUser result = dao.getByUsername(newUser.getLoginName()); + int sizeAfterSave = dao.getAll().size(); + assertEquals(newUser, result); + assertEquals(1, sizeAfterSave - sizeBeforeSave); + } + /** * Ensures that inserting an user with no external id fails, as it has a * not null constraint. diff --git a/packaging/dbscripts/user_sp.sql b/packaging/dbscripts/user_sp.sql index 26f2973..bdbb70b 100644 --- a/packaging/dbscripts/user_sp.sql +++ b/packaging/dbscripts/user_sp.sql @@ -31,11 +31,43 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION UpdateUserImpl( + v_department VARCHAR(255) , + v_domain VARCHAR(255), + v_email VARCHAR(255) , + v_groups VARCHAR(4000), + v_name VARCHAR(255) , + v_note VARCHAR(255) , + v_role VARCHAR(255) , + v_active BOOLEAN, + v_surname VARCHAR(255) , + v_user_id UUID, + v_username VARCHAR(255), + v_group_ids VARCHAR(2048), + v_external_id TEXT, + v_namespace VARCHAR(2048)) +RETURNS VOID + + --The [users] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated + AS $procedure$ +BEGIN + UPDATE users + SET department = v_department,domain = v_domain, + email = v_email,groups = v_groups,name = v_name,note = v_note, + role = v_role,active = v_active,surname = v_surname, + username = v_username, + group_ids = v_group_ids, + external_id = v_external_id, + namespace = v_namespace, + _update_date = CURRENT_TIMESTAMP + WHERE user_id = v_user_id; +END; $procedure$ +LANGUAGE plpgsql; - -Create or replace FUNCTION UpdateUser(v_department VARCHAR(255) , +Create or replace FUNCTION UpdateUser( + v_department VARCHAR(255) , v_domain VARCHAR(255), v_email VARCHAR(255) , v_groups VARCHAR(4000), @@ -55,23 +87,39 @@ --The [users] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated AS $procedure$ BEGIN - UPDATE users - SET department = v_department,domain = v_domain, - email = v_email,groups = v_groups,name = v_name,note = v_note, - role = v_role,active = v_active,surname = v_surname, - username = v_username, - last_admin_check_status = v_last_admin_check_status, - group_ids = v_group_ids, - external_id = v_external_id, - namespace = v_namespace, - _update_date = CURRENT_TIMESTAMP + PERFORM UpdateUserImpl(v_department, v_domain, v_email, v_groups, v_name, v_note, v_role, v_active, v_surname, v_user_id, v_username, v_group_ids, v_external_id, v_namespace); + UPDATE users SET + last_admin_check_status = v_last_admin_check_status WHERE user_id = v_user_id; END; $procedure$ LANGUAGE plpgsql; - - - +Create or replace FUNCTION InsertOrUpdateUser( + v_department VARCHAR(255) , + v_domain VARCHAR(255), + v_email VARCHAR(255) , + v_groups VARCHAR, + v_name VARCHAR(255) , + v_note VARCHAR(255) , + v_role VARCHAR(255) , + v_active BOOLEAN, + v_surname VARCHAR(255) , + v_user_id UUID, + v_username VARCHAR(255), + v_group_ids VARCHAR(2048), + v_external_id TEXT, + v_namespace VARCHAR(2048)) +RETURNS VOID + AS $procedure$ +BEGIN + IF NOT EXISTS (SELECT 1 from USERS where USERS.user_id = v_user_id) THEN + PERFORM InsertUser(v_department, v_domain, v_email, v_groups, v_name, v_note, v_role, v_active, v_surname, v_user_id, v_username, v_group_ids, v_external_id, v_namespace); + ELSE + PERFORM UpdateUserImpl(v_department, v_domain, v_email, v_groups, v_name, v_note, v_role, v_active, v_surname, v_user_id, v_username, v_group_ids, v_external_id, v_namespace); + End IF; +END; $procedure$ +LANGUAGE plpgsql; + Create or replace FUNCTION DeleteUser(v_user_id UUID) RETURNS VOID -- To view, visit http://gerrit.ovirt.org/28429 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4b6add7cbbe0a3055b6eb11ebf67cc77fec4bf53 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches