/** * Ask Liquibase if it needs to do any updates * * @param changeLogFilenames the filenames of all files to search for unrun changesets * @return true/false whether database updates are required * @should always have a valid update to latest file */ public static boolean updatesRequired(String... changeLogFilenames) throws Exception { log.debug("checking for updates"); List<OpenMRSChangeSet> changesets = getUnrunDatabaseChanges(changeLogFilenames); return !changesets.isEmpty(); }
/** * Convenience method that reads from liquibase again to get the most recent list of changesets * that still need to be run. */ public void updateChanges() { Logger log = LoggerFactory.getLogger(getClass()); try { changes = DatabaseUpdater.getUnrunDatabaseChanges(); // not sure why this is necessary... if (changes == null && DatabaseUpdater.isLocked()) { changes = DatabaseUpdater.getUnrunDatabaseChanges(); } } catch (Exception e) { log.error("Unable to get the database changes", e); } }
/** * @see DatabaseUpdater#getUnrunDatabaseChanges(String...) */ @Authorized(PrivilegeConstants.GET_DATABASE_CHANGES) public static List<OpenMRSChangeSet> getUnrunDatabaseChanges() { return getUnrunDatabaseChanges(CHANGE_LOG_FILE); }
/** * Ask Liquibase if it needs to do any updates. Only looks at the {@link #CHANGE_LOG_FILE} * * @return true/false whether database updates are required * @throws LockException * @should always have a valid update to latest file */ public static boolean updatesRequired() throws LockException { log.debug("checking for updates"); List<OpenMRSChangeSet> changesets = getUnrunDatabaseChanges(); // if the db is locked, it means there was a crash // or someone is executing db updates right now. either way // returning true here stops the openmrs startup and shows // the user the maintenance wizard for updates if (isLocked() && changesets.isEmpty()) { // if there is a db lock but there are no db changes we undo the // lock DatabaseUpdater.releaseDatabaseLock(); log.debug("db lock found and released automatically"); return false; } return !changesets.isEmpty(); }
@Test public void createUpdateFilterModel_shouldRequireAnUpdateIfDatabaseUpdaterIsLockedAndChangesAreNotNull() throws Exception { OpenMRSChangeSet change = mock(OpenMRSChangeSet.class); List<OpenMRSChangeSet> changes = new ArrayList<>(); changes.add(change); when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(null, changes); when(DatabaseUpdater.isLocked()).thenReturn(true); model = new UpdateFilterModel(); assertTrue("should require an update", model.updateRequired); assertThat(model.changes, is(changes)); PowerMockito.verifyStatic(times(2)); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(never()); DatabaseUpdater.updatesRequired(); } }
@Test public void createUpdateFilterModel_shouldrequireAnUpdateAndSetChangesToUnrunDatabaseChangesIfChangesAreNonEmpty() throws Exception { OpenMRSChangeSet change = mock(OpenMRSChangeSet.class); List<OpenMRSChangeSet> changes = new ArrayList<>(); changes.add(change); when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(changes); when(DatabaseUpdater.isLocked()).thenReturn(false); model = new UpdateFilterModel(); assertTrue("should require an update", model.updateRequired); assertThat(model.changes, is(changes)); PowerMockito.verifyStatic(); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(never()); DatabaseUpdater.updatesRequired(); }
@Test public void createUpdateFilterModel_shouldNotRequireAnUpdateIfChangesAreEmptyAndDatabaseUpdaterDoesNotRequireAnUpdate() throws Exception { when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(new ArrayList<>()); when(DatabaseUpdater.isLocked()).thenReturn(false); when(DatabaseUpdater.updatesRequired()).thenReturn(false); model = new UpdateFilterModel(); assertFalse("should not require an update", model.updateRequired); assertThat(model.changes, is(empty())); PowerMockito.verifyStatic(); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(); DatabaseUpdater.updatesRequired(); }
@Test public void createUpdateFilterModel_shouldRequiredAnUpdateIfChangesAreEmptyButDatabaseUpdaterDoesRequireAnUpdate() throws Exception { when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(new ArrayList<>()); when(DatabaseUpdater.isLocked()).thenReturn(false); when(DatabaseUpdater.updatesRequired()).thenReturn(true); model = new UpdateFilterModel(); assertTrue("should require an update", model.updateRequired); assertThat(model.changes, is(empty())); PowerMockito.verifyStatic(); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(); DatabaseUpdater.updatesRequired(); }
@Test public void createUpdateFilterModel_shouldNotRequireAnUpdateIfDatabaseUpdaterIsLockedAndCallingDatabaseUpdaterTwiceAlwaysReturnsNull() throws Exception { when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(null); when(DatabaseUpdater.isLocked()).thenReturn(true); when(DatabaseUpdater.updatesRequired()).thenReturn(false); model = new UpdateFilterModel(); assertFalse("should not require an update", model.updateRequired); assertNull("should not have changes", model.changes); PowerMockito.verifyStatic(times(2)); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(); DatabaseUpdater.updatesRequired(); }
@Test public void createUpdateFilterModel_shouldNotRequireAnUpdateIfChangesAreNullAndDatabaseUpdaterDoesNotRequireAnUpdate() throws Exception { when(DatabaseUpdater.getUnrunDatabaseChanges()).thenReturn(null); when(DatabaseUpdater.isLocked()).thenReturn(false); when(DatabaseUpdater.updatesRequired()).thenReturn(false); model = new UpdateFilterModel(); assertFalse("should not require an update", model.updateRequired); assertNull("should not have changes", model.changes); PowerMockito.verifyStatic(); DatabaseUpdater.getUnrunDatabaseChanges(); PowerMockito.verifyStatic(); DatabaseUpdater.updatesRequired(); }