Проблема с Service API

Администирование клиентской и серверной части InterBase, Firebird, Yaffil. Настройка файла конфигурации и т.п.

Модераторы: kdv, Alexey Kovyazin

Ответить
Alex_KV
Сообщения: 6
Зарегистрирован: 17 ноя 2005, 18:13

Проблема с Service API

Сообщение Alex_KV » 17 ноя 2005, 18:34

Здравствуйте!
Работаю на Д7 + FB1.5.
Пытаюсь наладить backup/restore через isc_service_xxx.
Через IBExpert все работает, блин :)
А я даже подключиться не могу.
Пишет: Cannot attach to services manager
Подскажите кто знает, что не так.
Привожу код:
...
type
isc_status = longint;
pisc_status = ^isc_status;
isc_svc_handle = pointer;
pisc_svc_handle = ^isc_svc_handle;
isc_resv_handle = pointer;
pisc_resv_handle = ^isc_resv_handle;

status_vector = array[0..19] of isc_status;
pstatus_vector = ^status_vector;

Tisc_service_attach = function(psv : pisc_status;
serv_len : Word;
service : PChar;
serv_h : Tisc_svc_handle; //(PVoid)
buf_len : Word;
buf : PChar) : isc_status; stdcall;
var
isc_service_attach : Tisc_service_attach;

//загрузка
FLibHandle := LoadLibrary(DLL_Name);
//fbclient.dll or gds.dll
@isc_interprete := GetProcAddress(FLibHandle, 'isc_interprete');
@isc_service_attach := GetProcAddress(FLibHandle, 'isc_service_attach');
if @isc_service_attach = nil then Exit;
...
function TForm1.Attach : boolean;
var
status : pisc_status; //pstatus_vector;
errCode : isc_status;
service : PChar;
serv_len : Word;
res : integer;
mes : array[0..1023] of char;
buf : string;
F_service_handle : Tisc_svc_handle;
const
us = 'sysdba';
pas = 'masterkey';
begin
result := false;
if @isc_service_attach = nil then Exit;

Buf := Char(isc_spb_version);
Buf := Buf + Char(isc_spb_current_version);
Buf := Buf + Char(isc_spb_user_name);
Buf := Buf + Char(Length(us));
Buf := Buf + us;
Buf := Buf + Char(isc_spb_password);
Buf := Buf + Char(Length(pas));
Buf := Buf + pas;

service := 'localhost:service_mgr';
serv_len := Length(service);
F_service_handle := nil;
errCode := isc_service_attach(status, serv_len, service, @F_service_handle, Length(buf), PChar(buf));
if errCode <> 0 then begin
FillChar(mes, Length(mes), 0);
isc_interprete(@mes, @status);
result := false;
ShowMessage(mes);
end

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 ноя 2005, 20:30

к чему это все? тебя не устраивают компоненты InterBase Admin в Delphi?
www.ibase.ru/devinfo/ibx.htm

Alex_KV
Сообщения: 6
Зарегистрирован: 17 ноя 2005, 18:13

Сообщение Alex_KV » 18 ноя 2005, 12:48

kdv писал(а):к чему это все? тебя не устраивают компоненты InterBase Admin в Delphi?
www.ibase.ru/devinfo/ibx.htm
Да, конечно, с компонентами все работает.
Но мне по ТЗ необходимо все через Api.
Точнеее, создание БД и backup/restore.
А вся остальная работа через ADO.
Это для того, чтоб работать с MSSQL Server,
Interbase, FireBird, MySQL, Oracle.
И никаких компонентов под каждую БД.
Вот я решил поинтересоваться, может кто сталкивался
с такой проблемой. Все примеры, какие видел, тоже
не пашут. Где-то что-то я упускаю.
Если кто подскажет буду благодарен!
А пока полезу в исходники FireBird.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 ноя 2005, 13:28

Но мне по ТЗ необходимо все через Api.
Точнеее, создание БД и backup/restore.
что за ТЗ? компоненты все равно через API работают. Возьми да скопируй исходный текст. Или включи нужные модули, и все.
И никаких компонентов под каждую БД.
мутишь ты, на мой взгляд. данная функциональность специфична для каждой СУБД, поэтому что через компоненты, что через api будет что в лоб, что по лбу.
А пока полезу в исходники FireBird.
куда-куда? ЗАЧЕМ??? Может, ты имел в виду исходники IBX?

Alex_KV
Сообщения: 6
Зарегистрирован: 17 ноя 2005, 18:13

Сообщение Alex_KV » 22 ноя 2005, 17:27

С backup/restore разорался.
Проблема была с именами параметров, т.е.
в документации одни, а надо другие.
Только IBServices.pas помог :)

Но вот теперь проблема с shutdown database.
Работаю на FB 1.5 Classic Server.
Перед restore надо проверить нет ли активных соединений.
Если будет откат, то отложить restore.
...
Buf : string;
...
Buf := Char(isc_action_svc_properties);
Buf := Buf + Char(isc_spb_dbname_mapped_to_server) +
Char(Length(Edit1.Text)) + Edit1.Text; //Edit1.Text = ServerName+DBName
Buf := Buf + Char(isc_spb_prp_shutdown_db) + ;
errCode := isc_service_start(F_status_vector,
@F_service_handle,
nil,
Length(Buf),
PChar(Buf));
Функция не возвращает кода ошибки и не вырубает БД.
При использовании компонета
ibconfigservice1.ServerName := 'localhost';
ibconfigservice1.DataBaseName := 'd:\1.fdb';
ibconfigservice1.Protocol := TCP;
// user_name =... , password = ...
ibconfigservice1.Active := true;
ibconfigservice1.ShutdownDatabase(Forced, 0);
ibconfigservice1.Active := false;
Тоже никах ошибок и никаких действий.
А с gfix все работает.
Что может быть нет так?
Спасибо

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 ноя 2005, 17:45

Services API <> gfix or gbak, увы.

кроме того, все равно базу не ресторят в туже самую базу, с которой работают.

Alex_KV
Сообщения: 6
Зарегистрирован: 17 ноя 2005, 18:13

Сообщение Alex_KV » 22 ноя 2005, 18:16

kdv писал(а):Services API <> gfix or gbak, увы.

кроме того, все равно базу не ресторят в туже самую базу, с которой работают.
По документации, утилиты gbak, gfix и т.д. работают как раз через Services API. По крайней мере так в APIGuide написано. Если это не так, то конечно жаль.
А насчет рестора в тужу базу - все равно если и ресторить сначала в др. файл, а потом подменять рабочий необходимо всех отключить.
Ну или хотя бы проверить рабочие подключения.
Про ограничения на данную функцию в доках вроде нет
(isc_spb_prp_shutdown_db).
Можно как по-другому решить задачу подключений для ClassicServer?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 ноя 2005, 19:06

По документации, утилиты gbak, gfix и т.д. работают как раз через Services API.
якобы. у gbak есть ключ -se, он только в этом случае через services api работает.
Можно как по-другому решить задачу подключений для ClassicServer?
есть скрипты, которы гасят все процессы классика, принудительно.

Alex_KV
Сообщения: 6
Зарегистрирован: 17 ноя 2005, 18:13

Сообщение Alex_KV » 23 ноя 2005, 09:51

kdv писал(а):
По документации, утилиты gbak, gfix и т.д. работают как раз через Services API.
якобы. у gbak есть ключ -se, он только в этом случае через services api работает.
Можно как по-другому решить задачу подключений для ClassicServer?
есть скрипты, которы гасят все процессы классика, принудительно.
Да, у gbak есть ключ -se для работы как раз через Services Api.
Но вот для gfix, с которым основная проблема, такой опции нету.
А вот скрипты - было бы здорово. Буду искать, спасибо.
Если приведете их здесь или ссылочку буду очень признателен.

Ответить