Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Новое API / 17 сообщений из 17, страница 1 из 1
06.08.2014, 11:43
    #38713875
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Вижу бурное обсуждение в fb-devel про несовместимость vtable.
Например с новым API можно работать из Delphi, но нельзя из FreePascal. У FreePascal кишки классов устроены иначе.

Можно посмотреть как эту проблему решал разработчик 7-zip.
Вот как выглядит код для работы с 7z.dll в Delphi (это из jedi code library): см аттач.
Т.е. вместо классов были использованы интерфейсы.
Соответственно никаких проблем с VMT.
Есть правда минус что Delphi на каждый чих зовёт _AddRef и _Release. Но имхо это не существенно. Особенно если у них будет пустое тело.
Кстати исходники 7z.dll вроде как доступны. Можно посмотреть как это выглядит со стороны C++.
...
Рейтинг: 0 / 0
08.08.2014, 23:14
    #38716422
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Кто-нибудь может пояснить, чем плохи интерфейсы?

Вот пример для тройки:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
      
type
  ITransaction30 = interface;
  ITransaction = ITransaction30;

  ITransaction30 = interface(IRefCounted)
  ['{C315ADDA-365E-4D05-8DEB-8649802DF265}']
    procedure getInfo(status: IStatus;
                      itemsLength: Cardinal; const items: PAnsiChar;
                      bufferLength: Cardinal; buffer: PAnsiChar); cdecl;
    procedure prepare(status: IStatus;
                      msgLength: Cardinal = 0; const message: PAnsiChar = nil); cdecl;
    procedure commit(status: IStatus); cdecl;
    procedure commitRetaining(status: IStatus); cdecl;
    procedure rollback(status: IStatus); cdecl;
    procedure rollbackRetaining(status: IStatus); cdecl;
    procedure disconnect(status: IStatus); cdecl;
    function join(status: IStatus; transaction: ITransaction): ITransaction; cdecl;
    function validate(status: IStatus; attachment: IAttachment): ITransaction; cdecl;
    function enterDtc(status: IStatus): ITransaction; cdecl;
  end;


Для 3.5:
Код: 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.
      
type
  ITransaction30 = interface;
  ITransaction35 = interface;
  ITransaction = ITransaction35;

  ITransaction30 = interface(IRefCounted)
  ['{C315ADDA-365E-4D05-8DEB-8649802DF265}']
    procedure getInfo(status: IStatus;
                      itemsLength: Cardinal; const items: PAnsiChar;
                      bufferLength: Cardinal; buffer: PAnsiChar); cdecl;
    procedure prepare(status: IStatus;
                      msgLength: Cardinal = 0; const message: PAnsiChar = nil); cdecl;
    procedure commit(status: IStatus); cdecl;
    procedure commitRetaining(status: IStatus); cdecl;
    procedure rollback(status: IStatus); cdecl;
    procedure rollbackRetaining(status: IStatus); cdecl;
    procedure disconnect(status: IStatus); cdecl;
    function join(status: IStatus; transaction: ITransaction): ITransaction; cdecl;
    function validate(status: IStatus; attachment: IAttachment): ITransaction; cdecl;
    function enterDtc(status: IStatus): ITransaction; cdecl;
  end;

  ITransaction35 = interface(ITransaction30)
  ['{B4AD8C6E-A87C-4CFC-9266-FE2A96E25F0D}']
    procedure commit(status: IStatus; WaitTime: Cardinal = 500); cdecl;
  end;


Для 4.0:
Код: 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.
      
type
  ITransaction30 = interface;
  ITransaction35 = interface;
  ITransaction40 = interface;
  ITransaction = ITransaction40;

  ITransaction30 = interface(IRefCounted)
  ['{C315ADDA-365E-4D05-8DEB-8649802DF265}']
    procedure getInfo(status: IStatus;
                      itemsLength: Cardinal; const items: PAnsiChar;
                      bufferLength: Cardinal; buffer: PAnsiChar); cdecl;
    procedure prepare(status: IStatus;
                      msgLength: Cardinal = 0; const message: PAnsiChar = nil); cdecl;
    procedure commit(status: IStatus); cdecl;
    procedure commitRetaining(status: IStatus); cdecl;
    procedure rollback(status: IStatus); cdecl;
    procedure rollbackRetaining(status: IStatus); cdecl;
    procedure disconnect(status: IStatus); cdecl;
    function join(status: IStatus; transaction: ITransaction): ITransaction; cdecl;
    function validate(status: IStatus; attachment: IAttachment): ITransaction; cdecl;
    function enterDtc(status: IStatus): ITransaction; cdecl;
  end;

  ITransaction35 = interface(ITransaction30)
  ['{B4AD8C6E-A87C-4CFC-9266-FE2A96E25F0D}']
    procedure commit(status: IStatus; WaitTime: Cardinal = 500); cdecl;
  end;

  ITransaction40 = interface(ITransaction35)
  ['{C64A951A-6EAB-488D-A32B-9BB9A14FE063}']
    function GetId: Cardianl; cdecl;
  end;


И т.д.
Надеюсь идея понятна :)
Если из клиентской либы будут торчать такие интерфейсы (их плюсОвые аналоги), тогда это будет удобно.
Проблема с совместимостью будет только если прога компилировалась, к примеру, с интерфейсами версии 4.0, а клиентскую либу ей подсунули от 3.0 или 3.5. Тогда просто придётся отказаться от вызова функций, объявленных в интерфейсах более старших версий.
...
Рейтинг: 0 / 0
09.08.2014, 00:00
    #38716432
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
NickDeeЕсли из клиентской либы будут торчать такие интерфейсы (их плюсОвые аналоги)
именно они и торчат. Но FreePascal ни хрена с ними не работает.
...
Рейтинг: 0 / 0
09.08.2014, 00:25
    #38716438
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
NickDeeКто-нибудь может пояснить, чем плохи интерфейсы?Интерфейсы - не плохи. Но их можно реализовывать по-разному.

В С++ нет interface, там есть pure virtual class, и именно их мы пока что и пытаемся использовать.

В Delphi есть interface, но там это жёстко вшитый IUnknown, требующий наличия addRef, release и queryInterface.

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

В Delphi тоже можно объявить pure virtual class, более того, такое объявление целиком и полностью соответствует на двоичном уровне объявлению в С++.

Но недавно обнаружилось, что 64-битный FPC for Linux строит VMT не так, как GCC, отсюда и проблемы.
Delphi x64 не проверяли (у меня её и нет).

PS У нас изначально был план Б на этот случай - plain-C обёртки над объектным АПИ (о которых упорно долдонит Джим), просто мы их ещё не писали - нет смысла, пока интерфейс не устаканится.
...
Рейтинг: 0 / 0
09.08.2014, 00:30
    #38716440
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Есть CORBA со стандартным маршалингом, независящим от языка и динамическим вызовом методов.
Там, конечно, своих тараканов до чёртиков, но, может быть, какая-то "микрореализация" позволит отвязаться от привязки к таблице виртуальных методов?
...
Рейтинг: 0 / 0
09.08.2014, 00:58
    #38716444
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
hvladPS У нас изначально был план Б на этот случай - plain-C обёртки над объектным
АПИ (о которых упорно долдонит Джим), просто мы их ещё не писали - нет смысла, пока
интерфейс не устаканится.
Для текущих провайдерских интерфейсов эти обёртки при некоторой ловкости рук будут в
точности старым ISC API.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2014, 13:16
    #38716511
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry SibiryakovДля текущих провайдерских интерфейсов эти обёртки при некоторой ловкости рук будут в
точности старым ISC API.
которые дружелюбными к пользователю считаешь ты один...
...
Рейтинг: 0 / 0
09.08.2014, 13:27
    #38716514
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
dimitrкоторые дружелюбными к пользователю считаешь ты один...
Oh, c'mon. Новое провайдерское API это просто сгруппированное по типам хэндлов старое. Его
так проектировали: без особой фантазии.

И таки да, старое API я считаю более дружелюбным, чем новое. В основном из-за тошнотворных
плоских буферов с динамической, но чертовски жёсткой структурой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2014, 13:47
    #38716521
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry SibiryakovOh, c'mon. Новое провайдерское API это просто сгруппированное по типам хэндлов старое. Его
так проектировали: без особой фантазии.
его так проектировали из-за совместимости, в том числе и по сетевому протоколу. Но в новом АПИ нет главного геморроя старого АПИ - SQLDA. Впрочем, замены тоже нет :-) Частично из-за нежелания "поторописька", частично с оглядкой, что она в каждой реализации может быть своя.

Dimitry SibiryakovИ таки да, старое API я считаю более дружелюбным, чем новое. В основном из-за тошнотворных
плоских буферов с динамической, но чертовски жёсткой структурой.
в старом были те же самые плоские буферы, только за кадром. Ты их не видел, работал с дружелюбным АПИ и огребал лишние парсинги и копирования. В новом у тебя есть выбор - работать напрямую с плоскими буферами, либо написать удобную лично тебе тонкую обертку над ними и получить все как было раньше или даже лучше. Хочешь - в виде SQLDA, хочешь - в виде MYSQL_ROW, хочешь - в виде get/setABCD() а-ля JDBC.
...
Рейтинг: 0 / 0
09.08.2014, 13:53
    #38716524
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
dimitrего так проектировали из-за совместимости, в том числе и по сетевому
протоколу. Но в новом АПИ нет главного геморроя старого АПИ - SQLDA.
Во-первых, если уж проектировать на совместимость, так имело смысл вытащить движковые
Format+Record. Они и то приятнее чем это убожество.
Во-вторых, SQLDA-то как раз меньший геморрой для использования из-а того, что работает с
указателями, то есть позволяет большую гибкость при управлении данными. Её единственный
геморрой был как раз в реализации "благодаря" двухступенчатому преобразованию
SQLDA->BLR->XDR. Прямое преобразование SQLDA->XDR делается тривиально и работает быстро.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2014, 14:04
    #38716526
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry SibiryakovВо-первых, если уж проектировать на совместимость, так имело смысл вытащить движковые
Format+Record
какое отношение они имеют к совместимости по операциям/протоколу?

Dimitry SibiryakovВо-вторых, SQLDA-то как раз меньший геморрой для использования из-за того, что работает с
указателями, то есть позволяет большую гибкость при управлении данными.
либо гибкость, либо эффективность. Выбор у тебя есть.

SQLDA->BLR->XDR
XDR тут вообще непричем
...
Рейтинг: 0 / 0
09.08.2014, 14:34
    #38716531
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
dimitrкакое отношение они имеют к совместимости по операциям/протоколу?
Прямое: если клиентский формат данных будет совпадать с движковым, можно сэкономить дофига
времени на преобразованиях. Или ты говорил о какой-то другой совместимости?..

dimitrXDR тут вообще непричем
На нём базируется сетевой протокол вроде бы как, нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2014, 14:44
    #38716539
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry Sibiryakovесли клиентский формат данных будет совпадать с движковым
то ни один существующий клиент не подключится к серверу. Я об этой совместимости говорил.

Dimitry SibiryakovНа нём базируется сетевой протокол вроде бы как, нет?
его использует сетевой протокол. Опционально. Сообщения могут передаваться и без XDR-кодирования в ряде случаев. Но я говорил о протоколе как об op-пакетах. Которые привязаны к структуре вызовов существующего АПИ. Так что ожидать в новом АПИ что-то совсем из ряда вон - наивно.
...
Рейтинг: 0 / 0
09.08.2014, 14:45
    #38716540
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry Sibiryakovdimitrкакое отношение они имеют к совместимости по операциям/протоколу?
Прямое: если клиентский формат данных будет совпадать с движковым, можно сэкономить дофига
времени на преобразованиях. Или ты говорил о какой-то другой совместимости?..

Два формата: один внутренний - для максимальной скорости, и один для совместимости и удобства использования.
...
Рейтинг: 0 / 0
09.08.2014, 15:25
    #38716549
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
Dimitry Sibiryakovесли клиентский формат данных будет совпадать с движковым, можно сэкономить дофига
времени на преобразованиях
к слову, "движковый" формат для входных и выходных параметров - это как раз сообщение, описанное через BLR. Его элементы могут мигрировать в/из Record при SIUD, но в общем случае это совсем не обязательно.
...
Рейтинг: 0 / 0
09.08.2014, 16:15
    #38716558
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
dimitrни один существующий клиент не подключится к серверу. Я об этой совместимости
говорил.
А я подразумевал вырожденный случай когда между клиентским API и движком нет remote
модуля. То, что сетевой протокол - упрямая вещь это ж совершенно ясно и специального
упоминания не стоит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2014, 18:10
    #38766987
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новое API
include\firebird\IdlFbInterfaces.h
Это уже оно?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Новое API / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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