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

Перевожу пример 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
13.01.2021, 17:19
    #40035521
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
Строки в буфере не нуль-терминированные.

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

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

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

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

ShortInt ? Это что, нынче 1 байт ?
...
Рейтинг: 0 / 0
13.01.2021, 19:13
    #40035555
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
hvlad
ShortInt ? Это что, нынче 1 байт ?[/quote]Таки да, 1.
Странный выбор названия для этого типа.
Всегда short был 2 байта и tiny - 1 байт.
"Плюс" в карму тому, кто так поиздевался...
...
Рейтинг: 0 / 0
14.01.2021, 09:54
    #40035666
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
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
14.01.2021, 10:57
    #40035682
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
nicholaos
Код: pascal
1.
isc_vax_integer: function(Ptr: BytePtr; Length: short): long;

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

Точно. Теперь isc_vax_integer вернул то же, что и PortableInteger - 62. В любом случае, строки по адресу p + sizeof(word) нет, любой длины.
...
Рейтинг: 0 / 0
14.01.2021, 12:17
    #40035729
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
Идём дальше.
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
14.01.2021, 13:39
    #40035783
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
hvlad,

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

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

Так gbak ничего и не выдаёт при тех же условиях запуска. Поэтому и от сервисов ты
получаешь то же самое ничего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.01.2021, 14:15
    #40035810
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
Симонов Денис, 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
14.01.2021, 14:21
    #40035817
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
Продолжайте случайный поиск. Через бесконечное количество лет вам удастся воспроизвести
второй том "Мёртвых душ".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.01.2021, 14:26
    #40035823
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
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
14.01.2021, 15:10
    #40035841
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
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
14.01.2021, 15:30
    #40035851
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
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
14.01.2021, 17:27
    #40035891
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пример 10.backup.cpp на Pascal
В своей реализации я PrintLine удалил, в ней нет необходимости. Надеюсь, когда-нибудь все примеры из examples/interfaces переведут на Pascal в каноничной реализации.

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

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

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

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

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


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