CubaPlugin 7.2.20 CubaUpdateDb.groovy

Добрый день!

В процессе разработки выросло число компонентов, и теперь сценарии обновления баз данных основного приложения имеют “индекс” “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-х символов?

Имитируем активность ветки

Добрый день,
Вы можете подправить задачу CubaDbUpdate локально у себя в проекте.
Определить наследника Groovy-класса в build.gradle:

class MyCubaDbUpdate extends CubaDbUpdate {
    @Override
    protected boolean containsIgnoringPrefix(List<String> strings, String s) {
        print("called " + strings.size() + " with " + s + "\n");
        return super.containsIgnoringPrefix(strings, s)
    }
}

// ...
configure(coreModule) {
    task updateDb(dependsOn: assembleDbScripts, description: 'Updates local database', type: 
                MyCubaDbUpdate) {
    }
}

Добрый день.

Спасибо.

Попробую.

Добрый день, Александр.
Еще раз спасибо.
Вот вариант получился.

class MyCubaDbUpdate extends CubaDbUpdate {
    @Override
    protected boolean containsIgnoringPrefix(List<String> strings, String s) {
        return strings.find { it -> distinguishingSubstring(it).equals(distinguishingSubstring(s)) }
    }

    /**
     * Возвращает наименование скрипта без индекса компоненты.
     * @param scriptName наименование скрипта.
     * @return наименование скрипта без индекса компоненты.
     */
    protected String distinguishingSubstring(String scriptName) {
        int substringStart = scriptName.indexOf("-") + 1
        return scriptName.length() > substringStart
                ? scriptName.substring(substringStart)
                : scriptName
    }
}
1 симпатия