Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
_Vasilisk_,

Про ошибки я забыл описать.
Но тут суть именно в этой реализации IStatus реализован как бросающий исключение FbException. Т.е. для методов в которые передаётся IStatus будет сгенерировано исключение в случае ошибки, и выполнение будет немедленно прервано.

Стандартные исключения Delphi тоже будут автоматически перехвачены с isc_random в статус векторе. Генерировать ошибки с другими кодами надо постараться


var
  statusVector: array [0 .. 4] of NativeIntPtr;
....
// исключение будут перехвачены в любом случае с кодом isc_random
// здесь же мы будем выбрасывать стандартную для Firebird
// ошибку isc_convert_error
try
  Output.Id := OutputArray[Counter].ToInteger();
except
  on e: EConvertError do
  begin
    statusVector[0] := NativeIntPtr(isc_arg_gds);
    statusVector[1] := NativeIntPtr(isc_convert_error);
    statusVector[2] := NativeIntPtr(isc_arg_string);
    statusVector[3] := NativeIntPtr(PAnsiChar('Cannot convert string to integer'));
    statusVector[4] := NativeIntPtr(isc_arg_end);
    AStatus.setErrors(@statusVector);
  end;
end;



_Vasilisk_
Понятно. Ну тогда хотя бы указать, что undocumented и делайте так


вообще-то там всё не документировано. Есть только примеры. Так что всё что там написано не есть истина в последней инстанции. Это предмет моих исследований в области UDR.
21 май 20, 17:46    [22137216]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Я не знаю, насколько это интересно широкой общественности, но для меня стало открытием и стоило часа отладки, чтобы понять, что для NUMERIC(9,2) нужно в IMetadataBuilder указывать отрицательный Scale -2.

Передавая 50.12 и указывая положительный Scale 2, я в UDR получал значение 0. И только указав -2 получил 5012
29 май 20, 12:20    [22142114]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

_Vasilisk_
Я не знаю, насколько это интересно широкой общественности

Я не знаю насколько широкая общественность читала старый, ещё интербейзовский, API Guide.

Posted via ActualForum NNTP Server 1.5

29 май 20, 12:53    [22142161]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Dimitry Sibiryakov
старый, ещё интербейзовский, API Guide.
В итоге получаем вместо обособленного документа какой-то What's new.

Мне, как человеку не работавшим ранее напрямую с API разбираться с ним крайне сложно.

Описания того же IExternalContext я не нашел вообще нигде в интернете
29 май 20, 13:23    [22142196]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Документация - традиционно слабая сторона птицы.

Влад и Адриано в таких случаях говорят "читайте исходники, там всё написано".
Алекс говорит "задавай вопросы в девеле", но отвечает на эти вопросы через раз.

Posted via ActualForum NNTP Server 1.5

29 май 20, 13:28    [22142201]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
_Vasilisk_
Описания того же IExternalContext я не нашел вообще нигде в интернете

Это у Дениса надо спросить.
Потому что в
http://www.ibase.ru/files/firebird/udr.pdf
оно (и не только) часто упоминается, а в
http://www.ibase.ru/files/firebird/fbapi.html
ничего похожего нет (даже слова context).

p.s. я с этим вообще не разбирался, но че-то не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить" через CLOOP.
29 май 20, 14:14    [22142240]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

kdv
че-то не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить"
через CLOOP.

Потому что клоп не включён в процедуру сборки под винду. Потому что он под ней не
собирается. Потому что кому-то было лень это фиксиить.

Он входит в пакет с исходниками, поскольку тот собирается на линуксе.

Posted via ActualForum NNTP Server 1.5

29 май 20, 14:18    [22142244]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
kdv,

он есть в дистрибутивах под Linux. Почему не попадает в снапшоты винды хз
29 май 20, 14:18    [22142245]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
kdv

http://www.ibase.ru/files/firebird/fbapi.html
ничего похожего нет (даже слова context).


так это только перевод из firebird/doc/Using_OO_API.html
От себя я там ничего не писал, ну разве что про клопа
29 май 20, 14:24    [22142253]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
kdv
не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить" через CLOOP.
К слову, в 3.0.5 он обнаружился в папке include\firebird
1 июн 20, 13:32    [22143635]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
_Vasilisk_,

возможно это правили.
1 июн 20, 13:53    [22143664]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
_Vasilisk_
К слову, в 3.0.5 он обнаружился в папке include\firebird

в zip с офсайта ничего такого нет.
1 июн 20, 14:04    [22143675]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Док
Member

Откуда: Казань
Сообщений: 6700
kdv
в zip с офсайта ничего такого нет.

верно, в архивчик его положить забыли от слова совсем
1 июн 20, 17:49    [22143894]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
kdv
в zip с офсайта ничего такого нет.
Я инсталлятор запускал
1 июн 20, 18:06    [22143907]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Док
Member

Откуда: Казань
Сообщений: 6700
_Vasilisk_
kdv
в zip с офсайта ничего такого нет.
Я инсталлятор запускал

я тут по ходу дела проверил - ни в одном архиве с исподниками, начиная с 1.0.3, firebird.pas нет :)
1 июн 20, 18:17    [22143920]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
ъъъъъ
Member

Откуда:
Сообщений: 796
Док,

клооп не настолько древний.
1 июн 20, 21:18    [22144031]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Кстати, Денис, добавь в сабж копирайты и лицензию какую-нибудь, а то статус непонятен,
Ривз колеблется с переводом.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:14    [22144897]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61467
DS> Ривз колеблется с переводом.

Боится нелицензионности что ли?

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:20    [22144900]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
Dimitry Sibiryakov,

ну копирайты в примерах и тексте я могу поставить. А вот что там за лицензия хз
3 июн 20, 14:30    [22144911]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Симонов Денис
А вот что там за лицензия хз

Два напрашивающихся варианта: IDPL и Public Domain.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:36    [22144919]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
что-то типа вот этого что ли?

{
 *	PROGRAM:	Object oriented API samples.
 *	MODULE:		01.create.pas
 *	DESCRIPTION:	A sample of creating new database and new table in it.
 *					Run second time (when database already exists) to see
 *					how FbException is caught and handled by this code.
 *
 *					Example for the following interfaces:
 *					IMaster - main inteface to access all the rest
 *					Status - returns the status of executed command
 *					Provider - main interface to access DB / service
 *					Attachment - database attachment interface
 *					Transaction - transaction interface
 *					Util - helper calls here and there
 *					XpbBuilder - build various parameters blocks
 *
 *					Run something like this to build: fpc -Fu<path-to-Firebird.pas> -Mdelphi 01.create.pas
 *
 *  The contents of this file are subject to the Initial
 *  Developer's Public License Version 1.0 (the "License");
 *  you may not use this file except in compliance with the
 *  License. You may obtain a copy of the License at
 *  http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
 *
 *  Software distributed under the License is distributed AS IS,
 *  WITHOUT WARRANTY OF ANY KIND, either express or implied.
 *  See the License for the specific language governing rights
 *  and limitations under the License.
 *
 *  The Original Code was created by Alexander Peshkoff
 *  for the Firebird Open Source RDBMS project.
 *
 *  Copyright (c) 2015 Alexander Peshkoff <peshkoff@mail.ru>
 *  and all contributors signed below.
 *
 *  All Rights Reserved.
 *  Contributor(s): ______________________________________. }
3 июн 20, 14:39    [22144922]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Симонов Денис
что-то типа вот этого что ли?

Да, только я бы лицензию тут же положил в виде отдельного файла, а то URL-ы имеют свойство
протухать.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:47    [22144933]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Я правильно понимаю, что для каждого вызова процедуры/функции/триггера создается свой экземпляр IExternalProcedure/IExternalFunction/IExternalTrigger?

Или хотя бы обращение к одному экземпляру не идет одновременно из разных потоков?

Другими словами, я могу безболезненно сохранить аргументы, передаваемые в IExternalProcedure.open в поля класса и безопасно к ним обращаться из любого места. А не передавать нужные мне параметры как аргументы в мои методы.
10 июн 20, 14:39    [22148797]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
_Vasilisk_,

нет, не правильно. Экземпляр процедуры создаётся в момент её загрузки в кэш метаданных

автор
Метод newItem вызывается для создания экземпляра внешней процедуры, функции или
триггера. Создание экземпляров UDR происходит в момент её загрузки в кэш метаданных, т.е.
при первом вызове процедуры, функции или триггера. В настоящий момент кэш метаданных
раздельный для каждого соединения для всех архитектур сервера.

Кэш метаданных процедур и функция связан с их именами в базе данных. Например,
две внешние функции с разными именами, но одинаковыми точками входа, будут разными
экземплярами IExternalFunction. Точка входа состоит из имени внешнего модуля и имени
под которым зарегистрирована фабрика. Как это можно использовать покажем позже.


Если у тебя процедура выбора, передавай сохраняй аргументы в экземляр класса реализующий IExternalResultSet, если нет то можешь создать свой отдельный класс, раз там такая сложная логика
10 июн 20, 15:18    [22148821]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Симонов Денис
создать свой отдельный класс
Мысль. Спасибо.
10 июн 20, 15:25    [22148827]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить