LINUX.ORG.RU

UnixWay: Часто запускаемый бинарник и редко изменяемая конфигурация


0

0

Есть некий проект, который хочется сделать Unixway, проект кроссплатформенный, для него недопустимо использование GNU или BSD специфических вызовов или библиотек. Вкратце продукт состоит из бинарника и файла конфигурации.

Бинарник часто запускается (по несколько раз в день), иногда как CGI. Конфигурационный файл - обычный текстовый .conf вида "PARAMETER VALUE", он меняется раз в неделю (в худшем случае) или раз в месяц (в норме).

Парсинг конфигурационного файла в бинарнике длителен и занимает около 2 секунд на целевой машине. Для CGI это не очень хорошо, т.к. бинарник еще и статистику считает некоторое время.

Допускает ли UnixWay такое: - бинарник проверяет контрольную сумму конфигурационного файла, если она не соответствует записанной в бинарном конфигурационном файле, то происходит его перегенерация; - бинарник читает свою конфигурацию из бинарного конфигурационного файла (т.е. уже без парсинга).

Возможно кто то подскажет кроссплатформенную (не GNU/BSD специфичную) библиотеку для парсинга конфигурационного файла?

★★★★★

> бинарник проверяет контрольную сумму конфигурационного файла

Наверное проще проверять дату изменения. Про библиотеку только вчера где-то тут пробегало, поищи.

shumer
()

Может быть, лучше сделать а-ля сендмейл: текстовый конфиг (аналог sendmail.mc), его "компилятор" - взамен m4, генерящий бинарный конфиг (аналог sendmail.cf)?

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

anonymous
()

ИМХО гораздо луче, если сделать утилиту, в которой валидация и экспорт в двоичный файл, не требующий парсинга/обработки вообще. Основная же прога не имеет делов с конфигфайлом напрямую, а только считывает двоичный файл, приготовленный этой утилитой. Меняеш конфигурацию, по выходу запускаеш утилиту, и никаких проверок не нужно.

bugmaker ★★★★☆
()

> Конфигурационный файл - обычный текстовый .conf вида "PARAMETER VALUE", он меняется раз в неделю (в худшем случае) или раз в месяц (в норме).

> Парсинг конфигурационного файла в бинарнике длителен и занимает около 2 секунд на целевой машине.

Что-то долговато для такого простого формата. Какой он длины? Если небольшой, то, по-моему, не худо бы оптимизировать парсинг.

anonymous_incognito ★★★★★
()

а может какой libConfuse статически вкомпилить: весит он мало ?

Pi ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Типовой конфигурационный файл:
- размер 15'300 байт;
- кол-во строк 553.

Конечно там есть комментарии, парсинг сейчас реализован (не мною) как:
if (strcmp(string, "parameter1_name") == 0) { ... }
...
if (strcmp(string, "parameter1_name") == 0) { ... }

Если оптимизировать, то как лучше? Первое что подумал:

switch(string[0]) {
case a:
if (strcmp ...
break;
case b:
if (strcmp ...
...
}

А комментарии и пустые строки в этот цикл не попадают, они выше отсеиваются.

saper ★★★★★
() автор топика
Ответ на: комментарий от saper

> Если оптимизировать, то как лучше?

как лучше -- см. info flex

но переписать придётся сразу всё

scotinomys
()
Ответ на: комментарий от saper

Во первых, strcmp здесь не годится вообще, если хочется скорости, то надо всё ручками писать, во вторых есть и готовые либы для парсинга таких конфигов, например, libconfuse о которой уже сказал Pi http://www.nongnu.org/confuse/

Кстати, если ручками будешь писать, то надо проверку делать наоборот, по сравнению с тем как сейчас у тебя, т.е., не искать какие параметры есть в конфиге, а наоборот, выделять параметр и значение и искать в индексированной таблице (хэш может быть) какая для него существует функция инициализации. Смотри также http://www.rsdn.ru/article/alg/textsearch.xml хотя здесь таких сложных методов не нужно, можно упростить.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Спасибо, буду думать-выбирать. Проект откроем под GPL ;-)

saper ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.