powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пример 10.backup.cpp на Pascal
25 сообщений из 30, страница 1 из 2
Пример 10.backup.cpp на Pascal
    #40035497
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Перевожу пример 10.backup.cpp на Pascal (Delphi XE10). Возникли проблемы с функцией printInfo. Функцию isc-vax-integer нашел этой теме: https://www.sql.ru/forum/1325822/isc-vax-integer-i-iattachment но не могу понять, подходит ли PortableInteger для этой ситуации.

Наивная трансляция получилась следующая:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
//by _Vasilisk_ 
function PortableInteger(APtr: Pointer; ASize: Integer): Int64;
type
  TValue = record
  case Byte of
    1: (v1: ShortInt);
    2: (v2: SmallInt);
    4: (v4: Integer);
    8: (v8: Int64);
    255: (reserved: array[0..7] of ShortInt);
  end;
var
  LValue: ^TValue absolute APtr;
  Li: integer;
begin
  case ASize of
    SizeOf(LValue^.v1): Result := LValue^.v1;
    SizeOf(LValue^.v2): Result := LValue^.v2;
    SizeOf(LValue^.v4): Result := LValue^.v4;
    SizeOf(LValue^.v8): Result := LValue^.v8;
  else
    if LValue^.reserved[ASize - 1] < 0 then
      Result := -1
    else
      Result := 0;
    for Li := ASize - 1 downto 0 do
      Result := (Result shl 8) or (LValue^.reserved[Li] and $FF);
  end;
end;

function PrintLine(var p: BytePtr; var outBuffer: string): boolean;
var
  Length: word;
begin
  Length := word(PortableInteger(p, sizeof(word)));
  p := BytePtr(NativeUInt(p) + sizeof(word));
  if Length > 0 then
    outBuffer := outBuffer + Format('%s'#13#10, [PAnsiChar(p)]);
  p := BytePtr(NativeUInt(p) + Length);
  Result := Length > 0;
end;

function PrintInfo(p: BytePtr; pSize: cardinal; var outBuffer: string): boolean;
var
  pEnd: BytePtr;
begin
  Result := False;
  pEnd := BytePtr(NativeUInt(p) + pSize);
  while ((NativeUInt(p) < NativeUInt(pEnd)) and (p^ <> isc_info_end)) do begin
    case p^ of
      isc_info_svc_line: begin
        Result := PrintLine(p, outBuffer);
        break;
      end;
      isc_info_truncated: begin
        outBuffer := outBuffer + #13#10'<<< truncated >>>'#13#10;
        Result := True;
        break;
      end;
      isc_info_svc_timeout, isc_info_data_not_ready: begin
        Result := True;
        break;
      end
      else begin
        outBuffer := outBuffer + Format('Unknown item 0x%x in received buffer'#13#10, [NativeUInt(p) - 1]);
        break;
      end;
    end;
  end;
end;

...
      repeat
        svc.query(st, 0, nil, sizeof(receiveItems2), @receiveItems2, sizeof(results), @results);
      until PrintInfo(@results, sizeof(results), outBuffer);
...



при выполнении ошибок не выдает, но в outBuffer записывается мусор.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035521
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строки в буфере не нуль-терминированные.

И уж тем более - не юникодные.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035529
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Я смотрел значение PAnsiChar(p) в отладчике, там проблемы с не-нуль-терминированностью еще нет. Проблема где-то гораздо раньше.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035542
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosЯ смотрел значение PAnsiChar(p) в отладчике

Ну значит ты можешь в том же отладчике посмотреть где, когда и откуда в outBuffer попадает
мусор и не морочить нам хрустальные шары.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035547
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

зачем изобретать велосипед, когда и isc_vax_integer, и isc_portable_integer экспортируются из fbclient.dll,
которая в любом случае загружена процессом ?
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035548
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Код: pascal
1.
 255: (reserved: array[0..7] of ShortInt);

ShortInt ? Это что, нынче 1 байт ?
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035555
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
ShortInt ? Это что, нынче 1 байт ?[/quote]Таки да, 1.
Странный выбор названия для этого типа.
Всегда short был 2 байта и tiny - 1 байт.
"Плюс" в карму тому, кто так поиздевался...
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035666
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Переделал PrintLine так:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function PrintLine(hLib: HMODULE; var p: BytePtr; var outBuffer: string): boolean;
var
  Length: long;
  s: string;
  ss: short;
  isc_vax_integer: function(Ptr: BytePtr; Length: short): long;
begin
  @isc_vax_integer := GetProcAddress(hLib, 'isc_vax_integer');
  ss := sizeof(word);
  Length := isc_vax_integer(p, ss);
  p := BytePtr(NativeUInt(p) + sizeof(word));
  if Length > 0 then begin
    s := PAnsiChar(p);
    outBuffer := outBuffer + Format('%s'#13#10, [s]);
  end;
  p := BytePtr(NativeUInt(p) + Length);
  Result := Length > 0;
end;




isc_vax_integer возвращает 0. Может неправильно объявил? Ориентировался на
SLONG API_ROUTINE isc_vax_integer(const SCHAR* input, SSHORT length)

PrintLine из вызывается PrintInfo (p в PrintLine - это @results):



т.е. данные в results есть и раз бэкап успешно создается, скорее всего правильные. Значение p - $18F054. Соответственно, p^ - 62.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035682
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Код: pascal
1.
isc_vax_integer: function(Ptr: BytePtr; Length: short): long;

stdcall забыл
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035710
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Точно. Теперь isc_vax_integer вернул то же, что и PortableInteger - 62. В любом случае, строки по адресу p + sizeof(word) нет, любой длины.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035729
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идём дальше.
nicholaos
Код: pascal
1.
  p := BytePtr(NativeUInt(p) + sizeof(word));

Почему не Inc(p, 2) ?

nicholaos
Код: pascal
1.
2.
  if Length > 0 then begin
    s := PAnsiChar(p);

Это не правильно - как минимум потому, что строки не терминируются нулями (как тут уже говорилось)

nicholaos
В любом случае, строки по адресу p + sizeof(word) нет, любой длины.
Конечно, на картинке p указывает на самое начало results - там находятся теги и только потом сами строки.
В данном случе в results лежит 62, 0, 0, 1, 0, 0, 0, 0...
62 - isc_info_svc_line
0, 0 - длина строки (0)
1 - isc_info_end
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035783
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Т.е. на самом деле никакой информации там нет? Я думал будет лог по типу того, что выдает gbak. Тогда проще вообще удалить PrintInfo.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035787
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

это смотря с какими ты ключами gbak запускаешь (тегами в данном случае). Он может лог операций выдавать в буфер, если ты его не в лог файл пишешь
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035789
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosТ.е. на самом деле никакой информации там нет? Я думал будет лог по типу того, что выдает
gbak.

Так gbak ничего и не выдаёт при тех же условиях запуска. Поэтому и от сервисов ты
получаешь то же самое ничего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035810
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, Dimitry Sibiryakov,

Точно тэг? Добавил spb2.insertTag(st, isc_action_svc_get_fb_log); получил ошибку
Internal error when using clumplet API: attempt to store 0 bytes in a clumplet, need 1

Если сделать так:
spb2.insertInt(st, isc_spb_options, isc_action_svc_get_fb_log);

ошибки нет, но и результата нет.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035817
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжайте случайный поиск. Через бесконечное количество лет вам удастся воспроизвести
второй том "Мёртвых душ".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035823
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Я думал будет лог по типу того, что выдает gbak.
А ты его об этом попросил ?
hint: isc_spb_verbose

nicholaos
Тогда проще вообще удалить PrintInfo.
Проще вообще всё удалить.

nicholaos
Добавил ... spb2.insertInt(st, isc_spb_options, isc_action_svc_get_fb_log);
Это в тот же spb, в котором уже есть isc_action_svc_backup ?
Может API Guide почитать сначала ?

PS Инкремент p кто делать будет ?
nicholaos
Код: pascal
1.
2.
3.
    case p^ of
      isc_info_svc_line: begin
        Result := PrintLine(p, outBuffer);

...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035841
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad

Проще вообще всё удалить.


Я относительно примера 10.backup.cpp. Логично либо добавить isc_spb_verbose, либо вообще удалить printLine, если она всегда упирается в isc_info_end.

hvlad

Может API Guide почитать сначала ?


Вы имеете в виду https://www.ibase.ru/files/interbase/ib6/ApiGuide.pdf от Interbase 6?

hvlad

Инкремент p кто делать будет ?

Виноват. Добавил inc(p) после case.

Добавил spb2.insertTag(st, isc_spb_verbose);
ничего не поменялось.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035851
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Я относительно примера 10.backup.cpp. Логично либо добавить isc_spb_verbose, либо вообще удалить printLine, если она всегда упирается в isc_info_end.
А result кто читать\показывать будет ?

nicholaos
hvladМожет API Guide почитать сначала ?
Вы имеете в виду https://www.ibase.ru/files/interbase/ib6/ApiGuide.pdf от Interbase 6?Да

nicholaos
Добавил inc(p) после case.

Добавил spb2.insertTag(st, isc_spb_verbose);
ничего не поменялось.
Ошибки проверяются ?
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035891
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В своей реализации я PrintLine удалил, в ней нет необходимости. Надеюсь, когда-нибудь все примеры из examples/interfaces переведут на Pascal в каноничной реализации.

В любом случае всем спасибо за участие.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035892
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

конечная цель-то какая?
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035898
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Делать бэкап/рестор не через CreateProcess gbak.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035902
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIBBackupService/TIBRestoreService уже выпили из IBX, а TFDIBBackup/TFDIBRestore из FireDAC?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035905
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Да, они и используются. Но раз в FB3 добавили новый OO API, хотел проверить как получится на нем.
...
Рейтинг: 0 / 0
Пример 10.backup.cpp на Pascal
    #40035907
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosНо раз в FB3 добавили новый OO API, хотел проверить как получится на нем.

Проверка провалилась: уровень API тебе пока не по зубам, вернись к киданию мышкой готовых
компонент.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пример 10.backup.cpp на Pascal
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]