Александр Клечиков,
начальник отдела информационного обеспечения ЗАО "Ливиз"
alek@liviz.ru

Денис Киселев,
инженер-программист отдела информационного обеспечения ЗАО "Ливиз"
dk@liviz.ru

Предыстория

В статье "Alaska Xbase++ и миграция Clipper-приложений" (см. "BYTE/Россия", No 2'2002) рассказывалось об опыте перехода информационной системы (ИС) ЗАО "Ливиз", реализованной в среде Clipper 5.01, на 32-разрядную архитектуру. Судя по количеству писем, полученных автором статьи, проблемы дальнейшего использования наследуемых систем в целом и миграции Clipper-приложений в частности остаются актуальными и по сей день. Среди причин этого есть и экономические (плохое финансирование проектов кардинальной замены ИС и парка вычислительной техники), и содержательные (имеющаяся система адекватно отражает бизнес предприятия, следовательно, нет осознанной потребности в изменениях), и даже психологические (боязнь несостоятельности в случае удачного внедрения новой ИС). Причем в каждом конкретном случае может иметь место сочетание всех описанных факторов в разных пропорциях.

Но вернемся к нашему предприятию. В общем виде стратегия жизненного цикла корпоративной ИС компании "Ливиз" основана на следующих принципах:

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

В качестве средства миграции на 32-разрядную архитектуру в свое время был выбран продукт американской фирмы Alaska Software (http://www.alaska-software.com) - Alaska Xbase++. Основной задачей проекта было обеспечить преемственность формата хранения данных (DBF), а также механизма построения и поддержания индексов, что позволило бы одновременно работать с базами данных при помощи двух исполняемых модулей - Clipper и Xbase++. В итоге были полностью сохранены формат представления данных, бизнес-логика и привычный для пользователей интерфейс, а исполняемое Xbase-приложение со временем полностью вытеснило старую Clipper-систему.

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

Выбор сервера баз данных

Перейти к клиент-серверной технологии на основе наиболее распространенных современных СУБД (Microsoft SQL Server, Oracle и т. д.) без фундаментальных изменений в логике работы приложений не представлялось возможным из-за слишком большого различия в представлении данных в DBF-таблицах и современных СУБД и разных механизмов доступа к ним. Для эволюционной миграции из представленных на рынке СУБД была выбрана Advantage Database Server фирмы Extended Systems (http://www.advantagedatabase.com), мощный и безопасный масштабируемый сервер баз данных.

В Advantage Database Server (ADS) имеется вариант внутреннего представления данных DBF-таблицы с индексными файлами NTX, что на первом этапе позволяет получать доступ к базам одновременно из приложений, работающих напрямую с DBF-таблицами, и из приложений-клиентов ADS. Кроме того, предоставляемый с ADS API специально сделан максимально похожим на API популярных драйверов DBF-файлов, что позволяет адаптировать приложения для работы с ADS, не меняя их логики.

Advantage Database Server совместим с большим числом операционных систем (Microsoft Windows NT/98, Linux, Novell NetWare - последняя используется на нашем предприятии) и средств разработки (Delphi, Perl, PHP, SQL, Xbase++). Вообще говоря, можно выбрать любое средство разработки, где предусмотрено использование динамически подключаемых библиотек, ODBC-драйверов или OLE DB. В частности, компания Alaska Software предоставляет ADS-DBE, специально созданный для работы с ADS в Xbase++.

В дополнение к ADS компания Extended Systems поставляет Advantage Local Server, предназначенный для локальной отладки приложений, а также набор утилит, объединенных в Advantage Data Architect (рис. 1), для работы с отдельными DBF- и ADT-таблицами, словарями баз данных, а также для администрирования сервера (рис. 2).

Fig.1
Рис. 1. Advantage Data Architect.

Fig.2 Рис. 2. Advantage Management Utility.

Использование Advantage Data Architect и словаря баз данных значительно облегчает процесс создания и управления базами данных, позволяя решать все возникающие задачи при помощи единого инструментального средства. Оба этих продукта, Advantage Data Architect и Advantage Local Server - так же, как и все средства для разработки клиентских приложений - поставляются компанией Extended Systems свободно.

Переход к клиент-серверной технологии

По аналогии с предыдущим проектом миграции с Clipper на Xbase++ от компании "Хот Софт" (http://www.hotsoft.ru) для тестирования была получена полнофункциональная версия ADS с ограниченным сроком работы - месяц. Все клиентские приложения и средства интеграции со средами разработки предоставляются свободно, их можно загрузить с сайта компании "Хот Софт". Миграция, тестирование и отладка проводились параллельно с использованием старой ИС.

В результате перехода на ADS корпоративная ИС компании "Ливиз" получила дополнительную стабильность и надежность, обеспечиваемую клиент-серверной архитектурой. ADS полностью отвечает за доступ к базам данных по запросу клиента, обеспечивая защиту от физического или логического повреждения данных и индексов, что нередко случается при использовании файл-серверной архитектуры (в результате сбоев при передаче данных по сети или зависании клиентского приложения). Кроме того, ADS осуществляет контроль за одновременной обработкой данных, что увеличивает производительность.

При помощи ADS удалось разрешить проблему защиты от несанкционированного доступа к данным, существовавшую в Xbase++ при использовании файл-серверной архитектуры. Напомним, что Xbase++, в отличие от Clipper, требует выполнения операции filescan в папке на сервере, где расположены корпоративные базы данных в формате DBF. По этой причине невозможно запретить данную операцию для рядовых пользователей. Поскольку ADS может использовать свои (серверные) права для доступа к БД, не исключена ситуация, что пользователям каталоги с DBF-таблицами уже не будут видны. В этом случае доступ к данным возможен только из ADS-клиентских приложений, в которых, в свою очередь, реализована собственная система разграничения прав пользователей.

Повысилась производительность за счет перераспределения вычислительной нагрузки между клиентом и сервером, так как ADS реализует функции locate, seek, skip, filter и т. д. Если в параметрах этих функций передаются блоки кода, возможно выполнение таких блоков на сервере - при соблюдении ограничений, описанных производителем (см. http://www.hotsoft.ru/ALASKA/al_adsdbe.html). Кроме того, при использовании в выражении фильтрации индексированных полей ADS автоматически распознает их и использует для оптимизации фильтрации. Например, если поле user_date в таблице индексное, то с целью определить, подходит ли конкретная запись под фильтр user_date > CtoD(01/01/2004), ADS не сравнивает значение поля user_date напрямую, а использует индексный файл. В дополнение к этому в ADS предусмотрено упреждающее чтение записей. При выполнении операций Skip (Next/Prior/MoveNext/MovePrev) следующие N записей прочитываются и передаются клиенту. Это позволяет выполнять операции со следующими (N-1) записями локально. В результате намного более комфортным стало перемещение по таблицам (browsing), особенно отфильтрованным, а скорость построения сложных отчетов увеличилась почти вдвое.

В ближайшее время планируется активно использовать дополнительные возможности ADS, такие, как поддержка транзакций и SQL. Часто бывает необходимо, чтобы несколько операций в базе данных были выполнены одновременно (например, занесение записей в две связанные между собой таблицы). При этом важно быть уверенным, что весь набор операций выполнен либо - в случае сбоя, - наоборот, не выполнено ни одной операции. Такую уверенность дает механизм транзакций, давно используемый в промышленных СУБД. При работе с DBF-файлами приходилось сначала создавать временные таблицы, редактировать их, а потом записывать в базу данных. С появлением в ADS поддержки транзакций необходимость в таких временных файлах отпала.

Большое количество отчетов в информационной системе ЗАО "Ливиз" построено на базе SQL. Обработчиком запросов служит Microsoft Jet OLEDB-провайдер для ODBC. В ADS встроен собственный высокопроизводительный обработчик SQL-запросов Advantage SQL Engine, который, согласно документации, поддерживает стандарт SQL-92. В данном случае SQL-запросы выполняет сервер, полностью снимая нагрузку с клиента, поэтому, несмотря на некоторые различия в реализации Microsoft Jet SQL и Advantage SQL Engine, все запросы будут адаптированы для работы с Advantage SQL Engine.

Особенности использования ADS и Alaska Xbase++

Для подключения к серверу используется поставляемый вместе c ADS объект dacSession. К сожалению, ни этот объект, ни ADS-DBE не могут подключиться к ADS с использованием словаря базы данных ADS. Это связано с тем, что ADS-DBE разработан фирмой Alaska Software для ADS версии 5.1, в которой словарь баз данных еще не поддерживался (он появился в версии 6.0). Соответственно не поддерживаются и другие возможности ADS, которые появились в более поздних версиях, чем 5.1. Доступ к ним возможен только через Advantage Client Engine API.

Адаптация кода приложений для использования ADS прошла достаточно безболезненно. Большая часть исправлений связана с тем, что в ИС компании "Ливиз" (на базе Xbase++) при построении отчетов используются шаблоны - DBF-таблицы, динамически создаваемые на клиентском компьютере. Поэтому пришлось использовать одновременно два DBE: ADS-DBE для работы с таблицами, находящимися на сервере, и DBF-NTX для работы с шаблонами. ADS-DBE был установлен как DBE, используемый по умолчанию, поэтому код, работающий с таблицами на сервере, не претерпел изменений. Для всех функций, работающих с шаблонами, пришлось указать, через какой DBE они должны выполняться.

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

Разрешенные к применению переменные и функции
AllTrim()
At()
Chr()
CtoD()
Date()
Day()
Deleted()
Descend()
DtoC()
DtoS()
Empty()
I2Bin()
If()
IIf()
Left()
Len()
Lower()
LTrim()
Month()
Pad()
PadC()
PadL()
PadR()
Rat()
Recno()
Right()
Round()
RTrim()
Space()

Str()
StrZero()
SubStr()
Time()
Transform()
Trim()
Upper()
Val()
Year()

В противном случае значение выражения следует использовать как параметр. Кроме "разрешенных" функций, в выражениях допускается использование полей таблиц и символьных констант. Если это правило не соблюдается, ADS будет генерировать ошибку. Исключение составляет выражение фильтрации. Если используемый фильтр невозможно выполнить на сервере, то он выполняется на клиентском компьютере. Для соблюдения этих ограничений входящие в выражения переменные следует заменить на их значения-константы. Например:

condition := "{|| mytable->datefield == CtoD(" + DtoC(myDateVar) + ") }"
dbLocate(  &condition )

ADS-DBE не поддерживает многих дополнительных функций для управления соединением с ADS, например, AdsSetCacheRecords (для задания размера буфера упреждающего чтения), AdsSetDateFormat (для задания корректной обработки сервером блоков кода с датами). Но Xbase++ позволяет применять динамически подключаемые библиотеки и таким образом вызывать функции Advantage Client Engine API напрямую. Поэтому для полноценной работы с ADS в xBase++, помимо ADS-DBE, необходимо установить еще и Advantage Client Engine API.