Выполнение графа скриптов - PullRequest
       19

Выполнение графа скриптов

5 голосов
/ 07 сентября 2011

У меня есть несколько (SQL) скриптов.Большинство из них имеют некоторые требования: другие сценарии, которые должны быть запущены раньше.

Вы можете представить объединенные деревья зависимостей в виде ориентированного графа .Я хотел бы иметь возможность "сделать недействительным" определенный узел в графе, что приведет к созданию составного сценария, который содержит все (в правильном порядке), которые должны быть повторно выполнены для достижения состояния готовности.

Я думаю о чем-то вроде процесса запуска Debian ... с изюминкой.

Редактировать: Если кому-то нужен явный вопрос, начинающийся с W и заканчивающийсяс вопросительным знаком, самое близкое, что я могу дать: Как мне добиться поведения, описанного выше.

Edit2: Идеальным решением было бы то, что сканирует файлы, соответствующиешаблон и чтение информации о зависимостях из первой строки (комментария).

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Вы можете использовать make.Создайте соглашение об именах для файлов штампов (возможно, используйте файлы журналов из сценариев) Файл Makefile может быть создан сценарием.Пример:

stamp1: stamp2 stamp3 script1.sql
     sql <script1.sql > $@

stamp2: stamp3 stamp5 script2.sql
     sql <script2.sql > $@

...

РЕДАКТИРОВАТЬ: Makefile является направленным ациклическим графом.В приведенном выше фрагменте stamp1 «зависит от» {stamp2, stamp3, script3.sql}: если что-то из этого изменится, будет выполнена строка под ним (sql <>).Так что если script1 всегда должен запускаться после script2, то приведенный выше фрагмент будет применяться.

2 голосов
/ 07 сентября 2011

[извините, предыдущий ответ не был достаточно общим. сейчас исправлено]

вам нужен топологический вид вашего графа. см http://en.wikipedia.org/wiki/Topological_sorting, в котором говорится:

Каноническое применение топологической сортировки (топологический порядок) в планировании последовательности заданий или задач

, который определяет как ваш начальный порядок сборки, так и способ перезапуска с любой промежуточной недействительной точки (просто найдите эту точку в отсортированном списке и начните с нее).

вы также можете отсортировать подграф, достижимый из недействительной точки, что в некоторых случаях даст вам меньше очков (вы избегаете восстановления точек в исходной сортировке, которые могли быть построены «параллельно» с недопустимым узлом и его дочерними элементами ) (чтобы найти подграф из точки, просто выполните оттуда поиск в ширину).

ps, поскольку порядок должен быть одинаковым, вы можете просто отфильтровать глобальный порядок для точек, которые находятся ниже вашей недействительной точки. Другими словами, вам не нужно на самом деле прибегать к помощи, просто начните с недействительной точки в вашем глобальном списке и пропустите узлы, которых нет в подграфе ниже вашей плохой точки.

1 голос
/ 07 сентября 2011

Не могли бы вы использовать подход, который "раздувает" порядок, находя ошибки? Я делал это несколько раз вручную и думал о написании программы для автоматизации:

Что-то вроде, данный список скриптов L:

  1. Старт транзакции
  2. Set i = 1
  3. Прогон L [i]
  4. Если ошибка Переместить L [i] в ​​конец L, Откат, Перейти к 1
  5. Остальное i = i + 1, Goto 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...