Обратите внимание, что новости можно получать по RSS.
X
-

Информационные технологии, LiveJournal cr_it - архив

17 марта 2010, 16:34 (3635 дней назад, №8787)Непростое добавление IP диапазона
Я уже упоминал в предыдущем посте о задаче написать редактор IP диапазонов сотовых операторов (кстати, кому интересно - открытая база есть вот здесь ).

Сама по себе задача тривиальная - в БД есть две таблицы, в одной из которых перечислены (помимо различной вспомогательной информации) начальный и конечный IP диапазона и id сотового оператора, к которому относится этот диапазон. Во второй перечислены операторы с их id.

Однако, есть очень важный ньюанс. Допустим, поступила информация о новом диапазоне - стало известно, что он относится, скажем, к МТС. Конечно можно просто добавить еще одну строчку в базу, но это будет некорректно, т.к. вполне может оказаться, что там уже есть диапазон, с которым новый совпадёт или, того хуже, частично пересечётся. Даже более того - этот старый диапазон мог в прошлом быть отнесен к другому оператору (скажем, по ошибке). Также есть опасность случайно ошибиться цифрой при вводе IP и затереть таким образом половину базы. Все эти нередкие ситуации надо анализировать и обрабатывать.

В итоге я сделал примерно так:

Вызываем на сервере сервис RangeService.addRangePreview, который получает через метод checkRangeIntersect() список всех IP диапазонов, с которыми пересекается добавляемый:

SELECT ... FROM ... WHERE ... AND
(
    :ip_start BETWEEN start AND finish
    OR
    :ip_finish BETWEEN start AND finish
    OR
    start BETWEEN :ip_start AND :ip_finish
    OR
    finish BETWEEN :ip_start AND :ip_finish
)
AND NOT
( start = :ip_start AND finish = :ip_finish )


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

Возможные ситуации при добавлении нового диапазонаВариантов не так много:
  • будет создан, поскольку задан как новый и с другими не пересекается
  • совпадает с новым, будет обновлён
  • полностью поглощается новым, поэтому будет удален
  • будет создан (слева), в связи с попаданием нового диапазона внутрь существующего
  • будет создан (справа), в связи с попаданием нового диапазона внутрь существующего
  • будет удален, в связи с попаданием внутрь него нового диапазона (и созданием вместо него двух новых)
  • будет урезан слева, поскольку имеет общую часть с новым диапазоном
  • будет урезан справа, поскольку имеет общую часть с новым диапазоном
  • будет создан, поскольку задан как новый и с другими не пересекается
  • будет создан, поскольку задан как новый

Таким образом, метод getRangeFutureList() возвращает массив операций, которые надо совершить и параметры удаляемых/создаваемых/изменяемых диапазонов.

Массивы пересечений и планируемых изменений возвращаются во Flex клиент, где демонстрируются наглядно в виде диаграммы и таблицы - см. рис. в начале поста. Кстати, полоски сделаны не через graphics.drawRect(), а через new Button(), чтобы можно было легко навесить на каждую полоску toolTip и сделать её кликабельной (для выдачи дополнительной информации по клику).

Далее, если пользователь согласен и нажимает "Accept", вызывается RangeService.addRangeModify и по массиву с изменениями последовательно выполняются необходимые INSERT / DELETE / UPDATE.

Опубликовано: Пётр Соболев

Случайная заметка

7131 день назад, 01:3120 августа 2000 Успешно завершился первый день CAFE'2000 demo party. Он целиком был посвящен ZX Spectrum compos. Прошли ZX Spectrum music, graphics, intro, demo compo. Также вначале показывали demo на Commodore 64 (увы, не слишком удачно подобранные). В первый день на party побывало 350-400 человек (почти полный зал). Бардак был как и всегда, но в принципе имел приемлимый уровень и форму :) По ...далее

Избранное

1029 дней назад, 01:575 мая 2017 Часть 1: От четырёх до восьми Я люблю читать воспоминания людей, заставших первые шаги вычислительной техники в их стране. В них всегда есть какая-то романтика, причём какого она рода — сильно зависит от того, с каких компьютеров люди начали. Обычно это определяется обстоятельствами — местом работы, учёбы, а иногда и вовсе — ...далее

541 день назад, 20:305 сентября 2018 "Finally, we come to the instruction we've all been waiting for – SEX!" / из статьи про микропроцессор CDP1802 / В начале 1970-х в США были весьма популярны простые электронные игры типа Pong (в СССР их аналоги появились в продаже через 5-10 лет). Как правило, такие игры не имели микропроцессора и памяти в современном понимании этих слов, а строились на жёсткой ...далее