Добрый день!
В процессе разработки выросло число компонентов, и теперь сценарии обновления баз данных основного приложения имеют “индекс” “100”. При обновлении баз данных через плагин “студии” обнаружили некорректную работу плагина в задаче “UpdateDb”, а именно: повторно начинают выполнятся ранее выполненные скрипты обновления.
Например ранее был выполнен скрипт “70-app/update/postgres/21/06/210601-1-updateProject.sql”, после добавления компонентов и новой сборки скрипт переместился в “100-app/update/postgres/21/06/210601-1-updateProject.sql”. Если выполнять обновление через плагин “студии” (./gradlew updateDb), данный скрипт пытается выполниться повторно.
По видимому, проблема находится в groovy скрипте “CubaDbUpdate.groovy”, а именно:
protected boolean containsIgnoringPrefix(List<String> strings, String s) {
strings.find { it -> it.length() > 3 && s.length() > 3 && it.substring(3) == s.substring(3) }
}
В данном фрагменте при сравнении отбрасываются только 3 первых символа.
Пока “индекс” приложения был двузначным ошибка не проявлялась. Теперь “индекс” стал “100”, ошибка проявляется.
В рамках java bean “com.haulmont.cuba.core.sys.dbupdate.DbUpdaterEngine” эта ситуация обрабатывается корректно:
protected boolean containsIgnoringPrefix(Collection<String> strings, String s) {
return strings.stream()
.anyMatch(it -> distinguishingSubstring(it).equals(distinguishingSubstring(s)));
}
protected String distinguishingSubstring(String scriptName) {
int substringStart = scriptName.indexOf("-") + 1;
return scriptName.length() > substringStart ? scriptName.substring(substringStart) : scriptName;
}
Поэтому при обновлении базы данных при старте приложения описываемая ошибка не возникает.
Можно ли добавить поддержку “индексов” приложения длинной более 3-х символов?