|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Arioch, тебя почему-то не смущает string в Delphi. А ведь преобразование char/varchar в string несёт дополнительные накладные расходы и не малые. Не вижу никакой разницы с преобразованиями из/в bcd ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 13:23 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Симонов Денис, смущает, но в данном случае влезть влезть внутрь компилятора и переписать строки 1) невозможно 2) если бы было возможно - было бы весьма трудно а вот в твоём-моём случае не надо "убирать" блокировки, достаточно их "недобавлять" Возвращаясь к строкам и BCD, в одном англоязычном FAQ отвечала на вечный вопрос о сравнении двух float на равенство. И "правильный" ответ был - заменить "if f1 = f2" на "if FloatToStr(f1) = FloatToStr(f2)" В принципе - код рабочий. Но какой-то он неправильный. Вот твой совет ради копирования raw bytes создать и потом уничтожить dynamic array - с ним на мой вкус ровно та же проблема. Накладные расходы на порядки больше самого действия. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 13:36 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Arioch, оно и в стрингах большое. Преобразование UTF8 <-> UTF-16 вызывает ничуть не меньше проблем и никто не жужжитю Уж извини работает с тем что есть. А от тебя лучших предложений пока не поступало. Вот только не надо про преобразование в double, оно не допустимо ибо несёт потерю точности. AriochИ "правильный" ответ был - заменить "if f1 = f2" на "if FloatToStr(f1) = FloatToStr(f2)" хрень это а не ответ. Все давно знают что сравнивать числа с плавающей точность надо с допустимой погрешностью. Правильный ответ Код: pascal 1.
где eps допустимая погрешность. Хочешь переменную придумай, хочешь константу ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 13:43 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Симонов Денис, поправочка abs, т.е. модуль ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 13:44 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Симонов ДенисА от тебя лучших предложений пока не поступало поступало AriochВ общем, если там и делать Delphi helper, то возвращать он должен не TBytes (неформатированный дамп который может совпасть по длине и внутреннему содержимому с TBcd, а может и не совпасть), а сразу готовый TBcd. И не по указателю "из" SQLDA, а "на" SQLDA. но, конечно, удобнее вопринимать реальность выборочно Симонов ДенисAriochЁ! ещё и указатель надо взять не НА DA, а ИЗ DA. Т.е. DA придётся руками парсить. не надо там ничего парсить. Сразу видно не разбирался. AriochРазмер входного буфера никто не проверяет Ну что ты написал - то и читаю если ты не рукожоп, то его не надо проверять. Зачем чтобы дополнительные тормоза поиметь? Это великолепно. Т.е. две глобальных блокировки и две неизвестно какой сложности операции внутри pluggable heap manager - это нормально. А одно сравнение integer с константой - это тормоза. А давайте из Firebird'а все bugcheck'и уберём. Я-то рукожоп, что с меня взять, но вы-то не рукожопы, вы же чoткие пацаны. Заодно и "дополнительных тормозов" меньше будет, сервер взлетит просто. Ariochс проверкой на dialect 0 SQLDA этого не нужно. Старый диалект только для совместимости со старыми компонентами. Он не используется уже лет 15. Разве что в недрах старого BDE. В новом API этого понятия нет вообще. Мы тут как бы про старый API говорим, про введение в классический API integer-128 и какую адаптацию *существующих* библиотек доступа это повлечёт. Arioch3. дёрганье хелпера, создающего "сырой" дамп в TBytes - ARC-структуре, т.е. запускающего две глобальные блокировки потоков процессора, как минимум две. сразу видно что ты не пытался разобраться. Нет там никаких блокировок. Хелпер надо получить ровно один раз, а потом пользоваться им. В нём нет глобального состояния.[/quote] Сразу видно, что ты не знаешь, что такое TBytes, хотя и заговорил про string, казалось бы в тему заговорил, но... Я удивлён. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 14:04 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
AriochВ общем, если там и делать Delphi helper, то возвращать он должен не TBytes с чего бы "интерфейсам" C++ который совершенно не привязан к Embercadro такое возвращать. Если хочешь пиши сам, да там как раз есть возможность хелперы классам писать. Это уже хелперы в терминах Delphi AriochТ.е. две глобальных блокировки и две неизвестно какой сложности операции внутри pluggable heap manager - это нормально. А одно сравнение integer с константой - это тормоза. да откуда ты их взял? Пальцем покажи. Там для получения хелпера нет ни одного интерфейса с подсчётом ссылок, да и не забывай про паттерн синглетон, не надо 100500 раз один и тот же хелпер получать. кто мешает проверять допустимость длины буфера на клиенте? Кто мешает выделить сразу буфер нужной длины? Так-то я тебе и в SQLDA могу по указателю хрень воткнуть для любого типа AriochМы тут как бы про старый API говорим, ты не о том. Я тебе говорю что даже старый API завязанный на SQLDA уже как 100 лет не использует понятие диалект SQLDA. Параметр есть, пишут туда что-то отличное от 0. Оно с 0 реально используется только в совсем древних компонентах, куда всё равно новые типы никто портировать не будет. AriochСразу видно, что ты не знаешь, что такое TBytes, хотя и заговорил про string, казалось бы в тему заговорил, но... Я удивлён. посмотри как устроен TEncoding для перекодировки строк и причём там TBytes, тогда может поймёшь ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 14:21 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Arioch, я это к тому, что ты так и сяк уже используешь TBytes для строк и не жужжишь не про его накладные расходы, ни про накладные расходы string. В последних версиях Delphi строки полученные из FB приходится перекодировать почти всегда (если только не AnsiString), ибо они в UTF-16, который никогда из FB не возвращается. Чего тогда из-за bcd здесь бучу поднимаешь? Не нравится иди на c++, где это можно сделать более прямым способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:01 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
ладно вам спорить то. перекодировка нужна и там, и там. ибо 1. нативные (RAW) типы отдаваемые клиентом, напрямую в Delphi не ложатся (за редким исключением) 2. "интерфейсное АПИ" разрабатывалось тоже без оглядки на Delphi Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:08 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий, так я и пытаюсь ему это донести. Накладных расходов избежать не удастся в любом варианте. Тогда чего панику поднимать, мол ой неудобно сделали, тут блокировки... Там и без того накладных расходов вагон и маленькая тележка ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:11 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Симонов ДенисВ последних версиях Delphi строки полученные из FB приходится перекодировать почти всегда (если только не AnsiString), ибо они в UTF-16, который никогда из FB не возвращается. ты серьёзно не понимаешь, что перекодирование потока байтов из одного формата в другой не приводит к глобальной блокировке всех потоков одного, а возможно и всех процессов (префикс LOCK в x86)? при этом как правило перекодируются строки длиннее, чем 16 байтов. Т.е. даже если приравнять остановку всех потоков к неблокирующей работе внутри одного процесса, то и в этом случае накладные расходы на строки вызываются много реже, чем для int128/bcd > Не нравится иди на c++ А голову отрубать для удаления зуба - это принципиальная позиция Firebird Project ? ....не читатель, но писатель. Я ведь написал, как бы я это делал на Delphi. Симонов Дениспосмотри как устроен TEncoding для перекодировки строк Никогда не считал TEncoding образцом хорошего кода. Это просто тупой копипаст из C# не включая голову. Причём настолько не включая, что элементарно можно получить use after free и dangling pointer. Потому что "цельнотянутое" API разрабатывалось для GC-языка. Симонов ДенисAriochВ общем, если там и делать Delphi helper , то возвращать он должен не TBytes с чего бы " интерфейсам" C++ который совершенно не привязан к Embercadro такое возвращать. Если хочешь пиши сам, да там как раз есть возможность хелперы классам писать. Это уже хелперы в терминах Delphi И снова подмена предмета спора. Ты начал разговор про какой-то неофигенно удобный Delphi хелпер, ради которого стоит отказаться от классического API и существующих библиотек, а теперь переключился на какой-то "непривязанный к Эмбаркадеро" новый Delphi-интерфейс. AriochТ.е. две глобальных блокировки и две неизвестно какой сложности операции внутри pluggable heap manager - это нормально. А одно сравнение integer с константой - это тормоза. да откуда ты их взял? Пальцем покажи. показывал уже, снова показываю - TBytes Там для получения хелпера нет ни одного интерфейса с подсчётом ссылок, да и не забывай про паттерн синглетон, не надо 100500 раз один и тот же хелпер получать. Я ж говорю, ты не знаешь что такое TBytes - но радостно его советуешь вместо memcpy как "правильное" решение. Ну как те ребята со сравнением float'ов. кто мешает проверять допустимость длины буфера на клиенте? А что, посоветованная тобой BcdFromBytes на сервере выполняется??? А мужики-то не знают.... (c) Так-то я тебе и в SQLDA могу по указателю хрень воткнуть для любого типа Можешь. Но там нет иллюзии безопасности. Там идёт работа с низкоуровневыми структурами данных. А BcdFromBytes эту иллюзию создает. Принимая на вход ARC-завёрнутый буфер данных произвольной структуры и размера. И ожидая от кого-то создания этого буфера (с межпоточными блокировами и вызовоми заранее неизвестного heap manager) недокументированного размера и заполнения его в недокументированном формате. И потом убивания буфера (с межпоточными.....). Фактически единственное относительно безопасное (на уровне source level compatibility с другими версиями Delphi или имитирующими Delphi сторонними языками) этой функции - только и исключительно использование в паре с BcdToBytes и никак кроме. AriochМы тут как бы про старый API говорим, ты не о том. Я тебе говорю что даже старый API завязанный на SQLDA уже как 100 лет не использует понятие диалект SQLDA. Параметр есть, пишут туда что-то отличное от 0. Оно с 0 реально используется только в совсем древних компонентах, куда всё равно новые типы никто портировать не будет. А должно быть, кстати, не "отличное от нуля", а +1, поскольку это версия DA, предназначенная для дальнейшего расширения, и изначально означавшее то же самое, что SQL dialect.... Пока этот диалект DA задокументирован - библиотеки должны ожидать его прихода от сервера, хотя бы в размере "проверить и выдать ошибку". Хотя, конечно, ничего не проверять и тупо иметь шанс запороть память - лучше. Ведь "дополнительных тормозов" не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:49 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Симонов ДенисТам и без того накладных расходов вагон и маленькая тележка а поэтому давайте на ровном месте, без какой-либо пользы, сделаем ЕЩЁ БОЛЬШЕ накладных расходов пц! пц! пц! (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:52 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий2. "интерфейсное АПИ" разрабатывалось тоже без оглядки на Delphi Зато Delphi разрабатывался с оглядкой на классическое API 21986134 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 15:56 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Arioch, сотый раз тебе повторяю. Все перекодировки строк в Delphi используют TBytes. Я не говорю что это хорошее решение, но оно так работает внутри. У тебя наверное из БД выбираются много полей с типами CHAR/VARCHAR. Ты не жужжишь? Ну так с какого перепугу беспокоиться об использовании его в Bcd? Покажи нам тупым как правильно инициализировать Bcd прям из структуры INT128. Только кодом, не надо нам тут поток бреда нести. Загляни в любой компонент доступа для современной Delphi. Глянь как получается string из CHAR/VARCHAR. Перевари, сильно не огорчайся. У тебя все числа теперь NUMERIC(38, x) что ли стали? Чего это оверхед на каждом шагу чудится ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 16:21 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
07.10.2019 16:21, Симонов Денис пишет: > У тебя все числа теперь NUMERIC(38, x) что ли стали? ну, агрегаты таки уже да. а это значит, что без изменений в библиотеке доступа не обойтись, для нормальной работы с FB4. даже не затачиваясь на новые фичи и типы . поясню. большинство (если не все) дельфийских библиотек для мапирования RAW-типов в дельфийские типы, не мудрствуя лукаво, запрашивают от сервера описание полей резалтсета при помощи isc_dsql_describe(). в данном же случае, результат будет отличный от того, на который библиотека "умеет" реагировать. так что без напильника не обойтись. в любом случае. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 16:45 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий, делаешь в ON CONNECT триггере Код: sql 1.
Если результат помещается в BIGINT, то можно не править ни одной строчки кода ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 16:57 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
07.10.2019 16:57, Симонов Денис пишет: > > делаешь в ON CONNECT триггере > SET INT128 BIND BIGINT кривые костыли. в DB-конфиге ещё куда ни шло, но в триггере... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:00 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий, да не важно где. Это новый вид запросов, так называемые "Управляющие запросы". Их позволили выполнять где угодно, в том числе и PSQL. Хотя согласен привязка типов там выглядит странно, ибо получается что потенциально мы можем менять привязку на лету. Можно попросить параметр пока не поздно, ну или через dbp_ ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:05 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
07.10.2019 17:05, Симонов Денис пишет: > Можно попросить параметр пока не поздно, ну или через dbp_ если не затруднит, закинь в FD удочку. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:11 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий, isc_dpb_int128_bind уже есть оказывается ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:22 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
07.10.2019 17:22, Симонов Денис пишет: > isc_dpb_int128_bind уже есть оказывается а в DB-конфиге? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:27 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий, не уверен что он там нужен. Клиенты разные бывают, кто поддерживает нативный тип, кто-то нет. ИХМО, сразу для всех ставить не правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:33 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
07.10.2019 17:33, Симонов Денис пишет: > не уверен что он там нужен. Клиенты разные бывают, кто поддерживает > нативный тип, кто-то нет. > ИХМО, сразу для всех ставить не правильно основной опиньён совместимости: унаследованный клиент должен работать БЕЗ переделок. к тому же это ничуть не хужее триггера на коннект. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 17:37 |
|
Корректное завершение gbak/isql при b/r
|
|||
---|---|---|---|
#18+
Мимопроходящий> У тебя все числа теперь NUMERIC(38, x) что ли стали? ну, агрегаты таки уже да.Не все. Тип агрегата выводится из типа его аргумента. Например sum(int) -> bigint sum(bigint) -> numeric(38) С какого перепугу 0.0 стал bigint - тут мы ещё разберёмся. Не всё так страшно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2019, 20:25 |
|
|
start [/forum/topic.php?fid=40&msg=39872697&tid=1560551]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
114ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 219ms |
0 / 0 |