/** * 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); } }
/** * 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(); }
if (!isLockReleased() && DatabaseUpdater.isLocked()) {
@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_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_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_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_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(); }
Liquibase liquibase = getLiquibase(null, null); database = liquibase.getDatabase(); if (database.hasDatabaseChangeLogLockTable() && isLocked()) { LockService.getInstance(database).forceReleaseLock();