Advantage Database Server
1) Краткое описание - Advantage Database Server(ADS) - разработка фирмы Extended System, Inc (http://www.AdvantageDatabase.com). Развивается с начала 90-x годов. Первоначально была известен как Advantage X-Base Server и предназначался для работы в клиент-серверном режиме с таблицами формата dbf(Clipper, Foxpro) и базировался до 4 версии только на Novell платформе. К отличительной особенностью является использование ISAМ(indexed sequentil access method) - индексный последовательный метод доступа. С версии 5.0 появилась версия для NT и добавлен собственный форма таблиц, а с версии 5.5 поддерживается SQL. В настоящее время выпущена версия с номером 7.0
2) возможности -
Небольшое отступление: ADS с таблицами работает в двух режимах Free Tables и Database. Режим Free Tables предполагает работу с таблицами как с отдельными несвязанными с друг другом структурными единицами. При режиме Database группа таблиц рассматривается как единая база данных со всеми вытекающими последствиями. Открыть таблицу, входящую в Database как самостоятельную таблицу в режиме Free Tables невозможно.
- количество баз данных на сервере - Так как физически базы данных представляют набор файлов: таблицы, индексы, словари, то ограничения определяются только возможностями операционной системы и мощностью компьютера. Имеется оганичения на количество одновременно открытых таблиц на одно соединение(не путать с пользователем) - не более 250. Но пользователь может иметь неограниченное количество соединений.
- размер таблиц - Так как в ADS могут использоваться одновременно два типа таблиц, то дается характеристики отдельно на каждую
Формат DBF
Максимальный количество индексов в индексном файле 50
Максимальное число открытых индексных файлов на таблицу 15
Максимальный размер файла (таблица, индексный файл, memo файл) 4 Гб
Максимальное число записей 2 миллиарда
Максимальная длина записи 65530 bytes
Максимальная длина имени поля 10 characters
Максимальная длина имени итдекса 10 characters
Максимальный размер binary/image/BLOB поля 4 Гб
Максимальное число полей на таблицу 2035
Формат ADT
Максимальный количество индексов в индексном файле 50
Максимальное число открытых индексных файлов на таблицу 15
Максимальный размер таблицы
Windows 95/98/ME 4 gigabytes (4,294,967,296 bytes)
Windows NT/2000 with NTFS 16 exabytes (18,446,744,073,709,551,616 bytes)
Windows NT/2000 with FAT32 4 gigabytes (4,294,967,296 bytes)
NetWare 4 gigabytes (4,294,967,296 bytes)
Linux pre-2.1.2 - 11 glibc and pre-2.4 kernel 2 gigabytes (2,147,483,648 bytes)
Linux glibc 2.1.2 - 11+ with kernel 2.4+ 8 exabytes (9,223,372,036,854,775,807 bytes)
Максимальный размер индексного файлa
Windows 95/98/ME 4 gigabytes (4,294,967,296 bytes)
Windows NT/2000 with NTFS 4 gigabytes * (Index Page Size) : Max 35 terabytes
Windows NT/2000 with FAT32 4 gigabytes (4,294,967,296 bytes)
NetWare 4 gigabytes (4,294,967,296 bytes)
Linux pre-2.1.2 - 11 glibc and pre-2.4 kernel 2 gigabytes (2,147,483,648 bytes)
Linux glibc 2.1.2 - 11+ with kernel 2.4+ 4 gigabytes * (Index Page Size) : Max 35 terabytes
Максимальный размер memo файла
Windows 95/98/ME 4 gigabytes (4,294,967,296 bytes)
Windows NT/2000 with NTFS 4 gigabytes * (Memo Page Size) : Max 4 terabytes
Windows NT/2000 with FAT32 4 gigabytes (4,294,967,296 bytes)
NetWare 4 gigabytes (4,294,967,296 bytes)
Linux pre-2.1.2 - 11 glibc and pre-2.4 kernel 2 gigabytes (2,147,483,648 bytes)
Linux glibc 2.1.2 - 11+ with kernel 2.4+ 4 gigabytes * (Memo Page Size) : Max 4 terabytes
Максимальное число записей 2 миллиард .
Максимальная длина записи 65530 bytes
Максимальная длина имени поля 128 characters
Максимальная длина имени индекса 128 characters
Максимальный размер binary/image/BLOB поля 4 Гб
Максимальное число полей в таблице зависит от длинны имени полей , и может быть вычислено: 65135 / ( 10 + AverageFieldNameLength ).
Например, если средняя длина имен полей 10, то максимальное число полей - 3256
Для обоих форматов
Максимальное число транзакций ограничено размером памяти
Максимальное число соеединений ограничено размером памяти
Максимальное число одновременно открытых файлов ограничено размером памяти
Максимальное число блокировок ограничено размером памяти
- количество пользователей и количество одновременных подключений
количество одновременно подключенных пользователей ограничено лицензионными соглашениями, количество соединений на пользователя неограничено.
наличие View -возможность создания View предусмотрена в режиме работы Database. Хранится как объект справочника (dictionary). Могут быть созданы с помощью SQL-выражение CREATE VIEW или с помощью соотвествующего диалогового окна в архитекторе (ARC32)
наличие SP, языка программирования - собственного языка нет, роль SP играют Advantage Extended Procedure (AEP), которые представляют собой либо dll или COM-библиотеки (для Windows), или shared object (для Linux). Соответственно написать их можно практически на чем угодно : Delphi/C++Builder, VB, VC++ и т.д. Для обращения в таблицам используется либо API, либо компоненты (Delphi/C++Builder). Регистрация процедур производится посредством SQL-выражения CREATE PROCEDURE , либо с помощью соотвествующего диалогового окна в архитекторе (ARC32)
Пример AEP
////////////////////////////////////////////////////////////////////////////
// ## Назначение: Точка входа хранимой процедуры "Обновление справочника серий"
// ## Описание:
// ## Аргументы: Параметры хранимой процедуры:
// ## Входные: Нет
// ## Выходные: Таблица со списком новых серий
// ## ID integer - идентификатор записи,
// ## Grup char(5) - группа,
// ## NNum char(13) - номенклатурный номер,
// ## Name char(34) - наименование сертификата,
// ## Series char(25) - серия
// ## Возврат: Код ошибки
// ## Исключения: нет
extern "C" UNSIGNED32 __declspec(dllexport) WINAPI RefreshSeries
(
UNSIGNED32 a_ConnectionID, // Идентификатор сессии
UNSIGNED8 *a_UserName, // Имя пользователя (логин)
UNSIGNED8 *a_Password, // Пароль пользователя
UNSIGNED8 *a_ProcName, // Имя хранимой процедуры(не пользоваться:
// будет исключено в следующей версии
UNSIGNED32 a_RecNum, // Аргумент зарезервирован для тригера
UNSIGNED8 *a_InpName, // Имя таблицы входных аргументов хранимой процедуры
UNSIGNED8 *a_OutName // Имя таблицы выходных аргументов хранимой процедуры
// или возращаемого курсора данных
)
{
try
{
TModuleAEP* ModuleAEP = (TModuleAEP*)gAEPSessionMgr->GetDM(a_ConnectionID);
ModuleAEP->ParamsReconnect((char*)a_InpName, (char*)a_OutName);
ModuleAEP->RefreshSeries();
}
catch( EADSDatabaseError *E )
{
return E->ACEErrorCode;
}
return AE_SUCCESS;
}
void __fastcall TCertModuleAEP::RefreshSeries(void)
{
try
{
FreeSeries_->Active = true;
Series_->Active = true;
NewSeries_->Active = true;
try
{
Series_->Last();
int LastID = Series_ID->AsInteger;
NewSeries_->AdsCopyTableContents(Series_);
Series_->Filter = Format("ID > %d",ARRAYOFCONST((LastID)));
Series_->Filtered = true;
Series_->AdsCopyTableContents(FreeSeries_);
Series_->AdsCopyTableContents(Output_);
}
__finally
{
Series_->Filtered = false;
Series_->Active = false;
FreeSeries_->Active = false;
NewSeries_->Active = false;
}
}
catch(Exception& Exc)
{
Output_->Append();
Output_->FieldByName("Name")->AsString = Exc.Message;
Output_->Post();
}
}
- наличие триггеров - имееются с в режиме Database, начиная с версии 7. Поддерживаются три вида триггеров BEFORE, AFTER и INSTEAD OF. Триггера могут быть написаны либо также как AEP, в виде dll, COM, либо они могут предствалять из себя SQL-выражение
CREATE TRIGGER mytrigger ON orders AFTER DELETE BEGIN INSERT INTO backup_orders SELECT * FROM __old; END
CREATE TRIGGER mytrigger ON orders INSTEAD OF UPDATE
FUNCTION MyFunction IN ASSEMBLY MyAssembly.MyClass PRIORITY 2
Пример кода тригера INSTEAD OF INSERT, который заполняет поле при вставке новой записи значением GUID
library AutoGUID;
{$INCLUDE versions.inc}
{$IFDEF ADSDELPHI7_OR_NEWER}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_CAST OFF}
{$ENDIF}
uses
SysUtils,
Classes,
ace,
adscnnct,
adsset,
adsdata,
adstable,
COMobj;
// Utility Function Prototype
procedure SetError ( conn : TAdsConnection; code : UNSIGNED32; err : string ); forward;
// Sample Advantage Trigger function. If you change the name of this
// function, remember to also change the name in the exports list at the bottom
// of this file.
function InsertGUID
(
ulConnectionID : UNSIGNED32; // (I) Unique ID identifying the user causing this trig
hConnection : ADSHANDLE; // (I) Active ACE connection handle user can perform
// operations on
pcTriggerName : PChar; // (I) Name of the trigger object in the dictionary
pcTableName : PChar; // (I) Name of the base table that caused the trigger
ulEventType : UNSIGNED32; // (I) Flag with event type (insert, update, etc.)
ulTriggerType : UNSIGNED32; // (I) Flag with trigger type (before, after, etc.)
ulRecNo : UNSIGNED32 // (I) Record number of the record being modified
) : UNSIGNED32;
{$IFDEF WIN32}stdcall;{$ENDIF}{$IFDEF LINUX}cdecl;{$ENDIF} // Do not change the prototype.
const
// In this case, the first field is the Primary Key field
// in the base table that needs the AutoGUID value.
// This constant definition is necessary because
// triggers don't take parameters.
iGUIDfieldNum : Integer = 0;
var
oConn : TAdsConnection;
oNewTable, oSourceTable : TAdsTable;
iFieldNum : Integer;
begin
// Result is currently reserved and not used. Always return zero.
Result := 0;
// Allocate a connection object using an active connection, no need to open it after this.
oConn := TAdsConnection.CreateWithHandle( nil, hConnection );
try
try
oConn.Name := 'conn';
oNewTable := TAdsTable.Create( nil );
oNewTable.DatabaseName := oConn.Name;
oNewTable.TableName := '__new';
oNewTable.Open;
oSourceTable := TAdsTable.Create( nil );
oSourceTable.DatabaseName := oConn.Name;
oSourceTable.TableName := pcTableName;
oSourceTable.Open;
oSourceTable.Insert;
// Copy all new field values over without posting.
for iFieldNum := 0 to Pred(oSourceTable.FieldCount) do
if not oNewTable.Fields[iFieldNum].IsNull then
oSourceTable.Fields[iFieldNum].Value :=
oNewTable.Fields[iFieldNum].Value
else
oSourceTable.Fields[iFieldNum].Clear;
// Now set the GUID field value to a GUID value.
oSourceTable.Fields[iGUIDfieldNum].AsString := CreateClassID;
oSourceTable.Post;
except
on E : EADSDatabaseError do
SetError( oConn, E.ACEErrorCode, E.message );
on E : Exception do
SetError( oConn, 0, E.message );
end;
finally
FreeAndNil(oSourceTable);
FreeAndNil(oNewTable);
FreeAndNil(oConn);
end;
end;
// Utility function to return an error from a trigger.
procedure SetError
(
conn : TAdsConnection;
code : UNSIGNED32;
err : string
);
begin
// Errors can be returned by placing a row into the __error table.
conn.Execute( 'INSERT INTO __error VALUES( ' + IntToStr( code ) +
', ' + QuotedStr( err ) + ' )' );
end;
exports
InsertGUID;
begin
// Because this DLL is used by a multi-threaded application (the Advantage
// server), we must set the Delphi IsMultiThread global variable to TRUE.
IsMultiThread := TRUE;
end.
- репликация и синхронизация, перенос данных, средства backup - встроенных механизмов в настоящее время нет, их появление запланировано в версии 8, но возможно использовании внешнего Advantage Replication, выполненного на основе сервера приложений этой же фирмы - OneBridge Mobile Groupware (ранее известного как XTNDConnect Server). Кстати этот репликатор может применяться как между серверам различных(других) фирм, так и для синхронизации баз данных между клиентом и сервером в режиме работы briefcase. Синхронизация может проходить по определенному алгоритму с заданием полей, приоритетов и правил разрешений конфликтов. Кроме того, по-скольку базы данных представляют собой набор файлов возможно использование стандартных файловых backup-систем.
- поддержка кластеров - в настоящее время,нет. Запланировано в версии 7.1
- возможность взаимодействия между серверами, включая сервера других типов. - Непосредствено в одном запросе обратиться к двум таблицам из разных баз данных, расположенных физически на разных серверах нельзя. Такую операцию можно сделать если
1). базы данных расположены на одном сервере
2). запрос направлен к локальному серверу и нужно к еще подключить таблицу(ы) от удаленного сервера.
В этом случае используется понятие Link, при создании которого указываеися алиас, путь к справочнику БД, имя пользователя и пароль, под которым происходит подключение. Если имя пользователя и пароль не задан, то подключение будет производится под тем же именем, под которым пользователь подключен к текущей
-- в примерах backup и Link1 - линки к другим базам данных
UPDATE Customers SET address = ( SELECT address FROM backup.Customers b WHERE b.cust_id = Customers.cust_id )
CREATE VIEW Link1_T1 AS SELECT cust_name FROM Link1.customers WHERE credit_limit > 50000
Кроме того, так как хранимые процедуры - это dll, COM или shared object, то посредством них можно обеспечить доступ к любым СУБД, например: подключиться к MS SQL, получить данные, вставить эти данные в набор, заполнить поля дополнительными данными из таблицы ADS, и этот набор вернуть в качестве результата работы AEP.
Можно, например, организовать цепочку вызовов процедур на удаленных серверах, например :
Клиент - > AEP(Server1)
AEP(Server1)->AEP(Server2) ->AEP(Server4)->...
AEP(SErver1)->AEP(Server4)
и т.д
- поддерживаемые типы данных -
Формат DBF
Character -- фиксированая строка(
Numeric -- число с фиксированной запятой.
Data -- дата(CCYYMMDD).
Logical -- логическое значение ('0', '1', 'T', 't', 'Y', and 'y').
Memo -- мемо-поле
Формат ADT
Character -- фиксированная строка
Date -- Дата.
Logical -- логическое значение
Memo -- memo-поле для строковых данных
Double -- число с плавающей запятой
Integer -- целое
Image -- мемополе содержащее графические данные
Binary -- мемополе для бинарных
ShortInteger -- короткое целое (-32,767 to 32,766)
Time -- время.
TimeStamp -- Дата-время
AutoIncrement -- автоинкрементное поле (0 to 4,294,967,296)
Raw -- типонезависимое поле фиксированоой длины (1 to 65530)
CurDouble -- поле для денежных расчетов (хранится два знака после запятой)
Money -- храниться четыре знака после запятой
поддерживаемые конструкции SQL-
ALTER TABLE
BEGIN TRANSACTION
COMMIT WORK
CREATE DATABASE - создание базы данных
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DROP INDEX
DROP PROCEDURE
DROP TABLE
DROP TRIGGER
DROP VIEW
EXECUTE PROCEDURE
GRANT -- давать права пользователю(группе пользователей) на выполнение операции на таблице(столбце)
QUOTE
// разрешается sales_group просматривать поле accounts таблицы customers GRANT SELECT ON customers.accounts TO sales_group //разрешается user1 вставке записи вводить значение для поля accounts таблицы customers GRANT INSERT( accounts ) ON customers TO user1 //для managers разрешаются все действия над таблицей customers GRANT ALL ON customers TO managers
GRANT быть применен к таблице(столбцу), view, процедуре линку со следующими ключами (в зависимости от типа объекта и типа операции)
SELECT, SELECT( columnname )
INSERT, INSERT( columnname )
UPDATE, UPDATE( columnname )
ACCESS
EXECUTE
INHERIT
ALL
INSERT
REVOKE -- запрещать пользователю(группе пользователей) выполнение операции (см GRANT)
ROLLBACK WORK
SELECT
SET TRANSACTION
UPDATE
Кроме того имеется возможность получить с помощью SQL - выражения всю информацию по метаданным используюя системные псевдо таблицы
Например, получение всех объектов из справочника БД
QUOTE
SELECT * FROM system.objects
system.dictinary - информация об базе данных :версия (не путать с версией сервера, имеется в виду именно версия БД), путь, ключ шифрования(если применено и только если запршивает админ), разрешение работы через интернет, прав доступа и .тд.
system.objects - все объекты
system.tables - таблицы
system.columns - столбцы
system.users
system.usersgroup
system.usergroupmembers
system.indexfiles
system.indexes
system.permission
system.relation -
system.views
system.storedprocedures
system.links
system.triggers
- поддержка транзакций - есть
- системы репортинга, в том числе для Web - возможно использование других репортинговых систем: Crystal Report, Fast Report, Quick Report, Rave и д.р. Собственного репортинга ориентированного на Web нет.
- наличие собственного агента для выполнения заданий по расписанию - нет \
3) Защита данных, шифрование - Возможно как шифрование отдельно взятых таблиц, так и шифрование базы данных в целом(вместе с метаданными). Используется профессиональный 160-битный алгоритм шифрования.
4) простота использования - Сам сервер после установки в администрировании не нужается. Адинистрирование необходимо только для текущего ведения(создание, реорганизация, модификация) баз данных и таблиц
- наличие встроенных средств администрирования с GUI интерфейсом - Имеется менеджер ARC32, реализующего все функции для создания баз данных и манипуляции с ними.
- возможность удалённого и Web администрирования - так как сервер имеет встроенный инернет-сервис(до шестой версии это был отдельный продукт) , то имеется возможность подключиться к серверу через интернет(например с помпощь того же ARC32) и выполнить все операции по реорганизации БД удаленно
- сложность перевода проекта написанного под другую базу данных на рассматриваемую - В зависимости от первоначальной БЗ, стпень переноса может быть разной. Программы, написанные на Clipper могут быть перенесены достаточно легко. Для того, что бы Clipper приложение интегрировать с Advantage необходимо его перелинковать с новым RDD. Для линковки (сборки) нужны OBJ модули. Если потерян только код, а OBJ сохранились, то проблем нет. А вот если нет OBJ, то единственное, что можно сделать - попытаться программой типа DECLIP восстановить исходные коды или подменить драйвер. Эта утилита распространяется бесплатно, она есть на многих BBS и в интернете. Имеется и также возможность импортирования таблиц (встроена в ACR32) в следующих вариантах подключения
-- ADO Data Source
-- Paradox, dBase, Advantage Compatible
-- BDE
-- PervasiveSQL(Btrieve)
-- Text file
Имеется также методика конвертирования приложений, использующих TTablе:
Converting Delphi TTable Instances to Advantage TAdsTable Instances
- сложность в установке и настройке - установка автоматическая, проблем не возникает
- насколько сложно администрирование сервера - администрирование практически не требуется
- наличие утилит для автоматизации операций для работы в командной строке - имеется в менеджере ARC32
- наличие собственных утилит для отладки запросов (выполнение SQL, построение плана выполнения кверей, профайлер и т.п.), утилиты для слежения за производительностью сервера. - ARC32
5) платформы
- на которых может работать сервер - - Npvell, Windows 9X, WinNT/2000, Linux
- на которых может работать клиент - MS DOS, Windows 9X, WinNT/2000, Linux
6) версии продуктов, краткая характеристика отличий
Текущая весия 7.0, техническая поддержка оказывается для версий 6.xx
Версия 5.0 - поддержка сервера на платформы WinNT(ранее был только Novell)
Версия 5.5 - поддержка SQL
Версия 5.7 - поддержка сервера на плптформе Win9x, поддержка транзакций
Версия 6.0 - поддержка сервера и клиента на платформе Linux, работа в режиме Database, хранимые процедуры, поддерка ссылочной целостности.
Версия 7.0 - триггера
7) способы доступа
Advantage Client Engine API
Advantage .NET Data Provider
Advantage ODBC Driver (version 3)
Advantage JDBC Driver (Type 4)
Advantage OLE DB Provider
Advantage Perl DBI Driver
Advantage PHP Extension
Advantage CA-Clipper RDD
Advantage CA-Visual Objects RDDs
Набор компонентов Advantage TDataSet Descendant for Delphi/Kylix/C++Builder
- языки программирования - Clipper, Delphi/C++Builder/Kylix, Microsoft Visual Basic, Microsoft Visual C/C++, Java, Perl , Php, CA-Visual Objects
Взято с Vingrad.ru https://forum.vingrad.ru