Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7      [все]
 PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Добрый день!

Нарвались на неприятный критический глюк https://bugs.php.net/bug.php?id=73021
Это только мы что-то неправильно делаем, или не первые?

Вот еще: https://bugs.php.net/bug.php?id=72583
В mysqlnd все нормально.

Неужели придется вернутся к ibase_ ? Скоро дедлайн. PDO нравится больше.

Вижу драйвер написал Adrian Marius Popa (Mariuz) который комитит еще и в Firebird Project.
Но он пока молчит на все попытки связыватся с ним. Может Firebird девы?

Код драйвера вроди простой, несколько строк кода, но я в С++ не очень.
https://github.com/php/php-src/tree/master/ext/pdo_firebird

Может там одну строку только подправить... ;)

Помогите!
6 сен 16, 09:30    [19631439]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

вообще в PDO для firebird глюков полно, драйвер весьма сырой и даже в PHP он до сих пор лишь экспериментальный. Помнится там ещё были проблемы с NULL индикаторами и предложением RETURNING. А некоторые фичи доступные для других СУБД до сих пор не реализованы.

Увы и ах большинство современных фрейворков работают именно с PDO и ibase_ функции прикрутить туда весьма проблематично.

По поводу исправления бага это нужен человек которые привык работать с Firebird API на С++ вроде Дмитрия Сибирякова. Сам несколько раз смотрел код драйвера, заметил там несколько подозрительных мест, но полностью не уверен в своих догадках. Всё таки для того чтобы разобраться что там к чему нужно время.

З.Ы. Собираюсь скоро выпустить статью о интеграции Firebird в фреймворк Laravel. Там тоже используется PDO.
6 сен 16, 09:54    [19631550]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Дмитрий Сибиряков, помогите сообществу которую продвигает Firebird в браузерах!
Давайте уничтожим легенду что Firebird на вебе плохой, тормозной и глючный :)
Если надо, скинусь на несколько часов работы, честно...
8 сен 16, 11:29    [19641215]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163
Лучше попытайтесь уничтожить легенду, что все уэб-программисты - днище криворукое, ни на что толковое без готовых фреймворков не годное.
8 сен 16, 12:13    [19641559]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Работаем и в это направление, есть чем гордится.
Вот только драйверы сырые, с чем собственно и обращались...
8 сен 16, 12:45    [19641827]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

фреймворки тут не причём бага в драйвере
8 сен 16, 12:56    [19641916]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Dorin Marcoci
Вот только драйверы сырые, с чем собственно и обращались...

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

Posted via ActualForum NNTP Server 1.5

8 сен 16, 12:58    [19641929]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
бага в драйвере

Ты ещё скажи "в ДНК"...

Posted via ActualForum NNTP Server 1.5

8 сен 16, 13:01    [19641952]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Dimitry Sibiryakov
Даже глупые дельфины время от времени способны поправить баги в
библиотеках...


ты не сравнивай библиотеки доступа в Дельфи и PDO драйвер пыха. Дельфийские библиотеки написаны на самой дельфе и разобраться там проще. PDO написана на C++, т.е. человек владеющий только PHP это сделать не способен. Там нужно разбираться в Firebird API и внутренней кухне PHP одновременно.
8 сен 16, 13:06    [19641996]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
человек владеющий только PHP это сделать не способен

Ну так легенда, о которой я говорил, именно так и гласит.

Posted via ActualForum NNTP Server 1.5

8 сен 16, 13:12    [19642031]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Dimitry Sibiryakov
Даже глупые дельфины время от времени способны поправить баги в библиотеках...

Дмитрий, я большенство времени в Делфя и работаю. Да, правили там много либов, FibPlus, EhLib. Отправил фиксы авторам.
Но здесь код драйвера в С++, и FB API, как и сказал выше.

Ладно, чет вы сегодня с сарказмом и злой. Нет так нет...
8 сен 16, 13:13    [19642043]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Dorin Marcoci
Но здесь код драйвера в С++, и FB API, как и сказал выше.

И? С++ не слишком отличается от Дельфи (а если уж на то пошло, то и от PHP), а FB API -
обычное API на функциях (синтаксис вызова которых совершено одинаков во всех языках) и
хэндлах. Что именно делает их невозможными для понимания?

Posted via ActualForum NNTP Server 1.5

8 сен 16, 13:28    [19642162]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5708
Dorin Marcoci
Ладно, чет вы сегодня с сарказмом и злой.
Это его нормальное состояние))
8 сен 16, 13:45    [19642278]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Ура! Вопрос снят.

Пересел проэкт на PHP7.10 (из Debian Testing) и глюка нету. Может что-то правили с 5.6.24, но факт что работает.

Короче заинтриговали. В отпуск буду ставить себе студию и компилить пых пых...
8 сен 16, 13:54    [19642350]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

кстати да. Я тоже заметил что 7 работает корректней
8 сен 16, 14:19    [19642567]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
вот только у меня подозрения, что эти баги никто не исправлял в PDO Firebird, а сам ПХП их просто аккуратно прячет под ковёр
8 сен 16, 14:24    [19642600]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Симонов Денис,
Может быть глюк был на уровне PDO, а не в сам драйвер FB... cмотрел чендж лог, ничего подобного не нашел.
Или менеджер памяти движка, так как в 7-ой версии переписали кучу кода. Глюк был только при больших строк (100kb).
Даже не знаю что думать, рад что исчез :)
8 сен 16, 14:32    [19642642]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Dorin Marcoci
Глюк был только при больших строк (100kb).

Firebird в принципе не может работать со строками длиннее 32к-3 байт.

Posted via ActualForum NNTP Server 1.5

8 сен 16, 15:32    [19643121]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

речь о BLOB SUB_TYPE TEXT
8 сен 16, 15:37    [19643169]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
речь о BLOB SUB_TYPE TEXT

Если кто-то по мускулистой привычке пытался собирать текст запроса со значениями, а не
параметрами, то это клиника и уже не лечится.

Posted via ActualForum NNTP Server 1.5

8 сен 16, 15:56    [19643330]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

ты не понимаешь о чём речь. Дело не в сборки запроса вместо параметра. Проблема в самой передачи параметру длинной строки. Хоть бы почитал содержание приведённых багов.

На самом деле PDO поддерживает два варианта подготовленных запросов:
1. Эмуляцию (для СУБД которые не поддерживают нативно. Привет привычкам мускуля)
2. Настоящие подготовленные запросы

Вроде бы для Firebird в PDO по умолчанию используются нативные подготовленные запросы.
8 сен 16, 16:05    [19643419]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Симонов Денис
для Firebird в PDO по умолчанию используются нативные подготовленные запросы.

Так и есть, никакой эмуляции.
8 сен 16, 16:48    [19643681]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
Хоть бы почитал содержание приведённых багов.

Почитал. Мнение не изменилось. Апача ставить, пыхпых ставить, PDO и драйвер к нему из
исходников собирать, потом ещё разбираться как это всё друг с другом связать, чтобы оно
хотя бы попыталось заработать. Потом ловить крэш отладчиком, смотреть стэк. С вероятностью
90% в процессе нарвёшься на совсем другой баг или проблему собственно сборки. Дня два
дурной работы и ради чего? Возможное продвижение Firebird в изначально сомнительную нишу
без всякого полезного выхлопа? Бесперспективняк.

Posted via ActualForum NNTP Server 1.5

8 сен 16, 16:58    [19643743]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

ну тебя же никто не заставляет. Да геморрой там порядочный. Ко всему этому надо ещё понимать потроха пыха.
8 сен 16, 17:24    [19643901]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
Да геморрой там порядочный.

Ты его недооцениваешь. ИМНИП, там ещё и собирать надо компилятором исключительно
православной версии, иначе оно работать откажется без объяснения причин. У разработчиков
пых-пыха очень сильные тараканы.

Posted via ActualForum NNTP Server 1.5

8 сен 16, 17:28    [19643919]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Dimitry Sibiryakov
Возможное продвижение Firebird в изначально сомнительную нишу без всякого полезного выхлопа? Бесперспективняк.

Зря вы это говорите. Хотим мы или нет, но веб проэкты все больше вытисняют десктопные. И тренд неутишительный.
В Штатах уже практически все бизнес приложения в облаке, а фэйс юзеров на хтмл.
9 сен 16, 19:33    [19648776]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Оказывается все-таки глюк есть, проверял 100 раз :(
https://bugs.php.net/bug.php?id=73087

Проявляется при следующем запросе, если в предыдущем был блоб параметр с utf8 текстом.
Примите на заметку и запасаемся надеждой что кто-то исправит...
15 сен 16, 11:11    [19667558]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Ура, Товарищи!
Мой фикс с блоб параметрами был принят в мэйнстрим: https://github.com/php/php-src/pull/2183
Заодно фиксил ставка NULLов если такие передаются. Раньше переобразовались в пустую строку.
7 ноя 16, 10:21    [19864391]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

молодец! Спасибо. Если есть возможность посмотри почему PDO не работает с INSERT ... RETURNING в 3.0. В 2.5 всё отрабатывает без ошибок.
7 ноя 16, 10:49    [19864602]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Симонов Денис,

Ок, проверю. Если надо будет помощь по внутреннестями API птички, будьте рядом.

Еще на очереди этот глюк https://bugs.php.net/bug.php?id=65689
Не вызывается isc_dsql_free_statement в PDO->exec() и кушается память на стороне Firebird-a.
7 ноя 16, 10:56    [19864650]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 688
а этот баг тоже считается?
я столкнулся с необходимостью следить
// !!!! баг - 32 бит INT идут как 64 бит UINT
            if (PHP_INT_SIZE == 8) {
                foreach ($agendaRepeats as &$a) {
                    if ($a['CNT_ROUND'] > 0x7FFFFFFF)
                        $a['CNT_ROUND'] -= 0x100000000;
                }
            }
7 ноя 16, 10:59    [19864668]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

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

Это только на x64, да?

Если несложно, создай плиз тестовый скрипт.
Можешь еще регистрировать глюк здесь: https://bugs.php.net/search.php?cmd=display&package_name[]=PDO+Firebird

Будем фиксить, думаю это несложно.
7 ноя 16, 11:07    [19864747]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

это ссылка на bug https://bugs.php.net/bug.php?id=72931

На последних снапшотах он проявляется иначе. Пишет что-то вроде cursor not open
7 ноя 16, 11:11    [19864789]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 688
Dorin Marcoci,
Да, на х64. Сейчас уже и нет других-то серверов, по сути.

CREATE TABLE TABLE1 (INT_FIELD INTEGER);
INSERT INTO TABLE1 (INT_FIELD) VALUES (-1);
SELECT FIRST 1 INT_FIELD FROM TABLE1;


получаем 2147483648
7 ноя 16, 11:26    [19864908]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

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

У меня не воспроизводится.

INT SIZE: 8
array(1) { [0]=> array(1) { ["finter"]=> string(2) "-1" } }

Все на x64. Debian, пакет PHP7 из тестинг.

echo 'INT SIZE: '.PHP_INT_SIZE.'<br>';

$S = $C['kind'].':dbname='.$C['host'].':'.$C['base'].';charset='.$C['charset'];
$D = new PDO($S, $C['user'], $C['password'], $C['options']);

$Q = $D->prepare('select t.finter from ta_test t');
$Q->execute();
$D = $Q->fetchAll();

var_dump($D);
7 ноя 16, 11:40    [19864983]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

какой PHP точная версия и разрядность?
7 ноя 16, 11:47    [19865022]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 688
Черт, сейчас проверил, не воспроизводится.
Но я на днях поднял новую базу, т.к. мой хостер прекратил поддержку Firebird на хостинге. пришлось покупать VDS

а код из рабочего сайта взят, поэтому ошибка точно была...
была PHP 5.6 на apache 2.2 и подключалась к FB 2.5
сейчас сайт остался на хостинге пока, а база переехала на VDS. Там я поставил FB 3.0
7 ноя 16, 12:04    [19865110]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 688
вот ссылка
http://ftsso.ru/new.php
7 ноя 16, 12:07    [19865119]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

sweb? Была аналогичная ситуация с хостером, но я ставил PHP7.
7 ноя 16, 12:07    [19865121]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 688
да, sweb.
и у них 7 появилась совсем недавно. я решил от греха не менять, мало ли опять какие модули не установлены
7 ноя 16, 12:12    [19865134]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Павел Ишенин
Member

Откуда: Красноярск
Сообщений: 358
Баг [url=]https://bugs.php.net/bug.php?id=72931[/url]. Пишет
SQLSTATE[HY000]: General error: -902 Cursor is not open

Версия Firebird 3.0.1
Версия php 5.4.3
29 ноя 16, 05:37    [19945381]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Павел Ишенин,

ага 19864789
29 ноя 16, 06:54    [19945430]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Павел Ишенин
Member

Откуда: Красноярск
Сообщений: 358
Симонов Денис, да, я все лишь хотел подтвердить, что проблема имеется и делает пока невозможным использование FB3 с некоторыми PHP-фреймворками (например с Yii).
29 ноя 16, 08:37    [19945544]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Павел Ишенин
проблема имеется и делает пока невозможным использование FB3 с некоторыми PHP-фреймворками
(например с Yii).

Или лучше сказать, она делает невозможным использование некоторых фреймворков с FB3.
Поскольку баг-то в фреймворках, а не Firebird.

Posted via ActualForum NNTP Server 1.5

29 ноя 16, 12:57    [19946782]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

не в фреймворках, а в PDO. Хотя FB 2.5 нормально работал.
29 ноя 16, 12:59    [19946797]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
не в фреймворках, а в PDO.

А PDO это, типа, не фреймворк, ага...

Posted via ActualForum NNTP Server 1.5

29 ноя 16, 13:05    [19946831]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

в фреймворках бага нет. Они честно делают запрос insert ... returning. То что PDO не может догадаться, что это не курсор, скорее всего баг PDO. Но вот почему-то в Firebird 2.5 запросы с returning нормально выполнялись. Причём ошибка происходит и fbclient версии 2.5, значит изменения произошли где-то глубже в самом ядре.
29 ноя 16, 13:10    [19946852]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

PDO - это абстрактный слой для работы с различными типами БД. Считай компонент доступа вроде FireDac, UniDac и т.д., но только являющийся частью ядра PHP. В зависимости от DSN PDO подгружает драйвер для работы с конкретной СУБД. Так вот ошибка где-то в этом драйвере, ибо тот же самый Postgres отрабатывает insert ... returning без проблем.

Кстати набор функций ibase_* работает нормально, но они не очень удобны для использования в фреймворках, потому что тем удобнее пользоваться унифицированным интерфейсом.
29 ноя 16, 13:21    [19946910]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
значит изменения произошли где-то глубже в самом ядре.

В ядре, конечно, произошла туева хуча изменений, но для returning как возвращалось
isc_info_stmt_execute_procedure, так и возвращается.

Posted via ActualForum NNTP Server 1.5

29 ноя 16, 13:23    [19946919]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Покопаюсь к пятницу, суботу насчет этой баги.
Мы пока на FB2.5 сидим, и там работает без проблем.
Но в будущем планируем пересесть на FB3.
29 ноя 16, 13:36    [19946981]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

если исправишь будет здорово. А то приходится для Fb3 обходные пути искать.

Там есть ещё один недостаток, который проявляется во всех версиях. Предварительный парсер, который вычленяет именованные параметры, делает это везде даже там где не надо. Из-за чего EXECUTE BLOCK наворачивается медным тазом. Вот если бы этот парсер был более умным и искал именованные параметры для EB только во входных параметрах EXECUTE BLOCK [(<params>)] и остальное тело не трогал было бы здорово.
29 ноя 16, 13:54    [19947076]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Денис,
Я так, не профи в C, VC14, но впервые, после танцем с бубном и много методом тыка, за день, получилось.
Если здесь есть кто-то более продвинут в C, то могу помочь со сборкой, дебагингом и тестингом, и структурами данных в PHP коде.
29 ноя 16, 14:08    [19947178]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Посмотрел насчет баги https://bugs.php.net/bug.php?id=72931 (insert returning)

Дело в том что PDO драйвер при execute всегда вызывает isc_dsql_execute.
Но как показывют скудные инфы про Firebird, для стэйтмент isc_info_sql_stmt_exec_procedure нужно вызвать isc_dsql_execute2.
isc_dsql_execute подразумевает открытие курсора с последующими isc_dsql_fetch.

До v3 при "insert returning" FB открывал курсор, но Влад говорил что это глюк, и щас уже не открывает :)
Соответственно, isc_dsql_fetch обламывается и получаем ошибку.

Щас нужно вызвать уже isc_dsql_execute2 если стэйтмэнт тайп isc_info_sql_stmt_exec_procedure и обрабатывать по другому фетч в драйвере. Я начал сделать, есть мелкие прогрессы, но чувствую будет долго, так как не очень разбираюсь в FB API :)
3 дек 16, 22:01    [19964080]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Dorin Marcoci,

давай конкретные куски кода - поможем
3 дек 16, 23:52    [19964493]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Влад, порядок такой:

firebird_alloc_prepare_stmt(dbh, sql, sql_len, &num_sqlda, &s, np)

/* allocate a statement handle struct of the right size (struct out_sqlda is inlined) */
S = ecalloc(1, sizeof(*S)-sizeof(XSQLDA) + XSQLDA_LENGTH(num_sqlda.sqld));
S->out_sqlda.version = PDO_FB_SQLDA_VERSION;
S->out_sqlda.sqln = num_sqlda.sqld;

isc_dsql_describe(H->isc_status, &s, PDO_FB_SQLDA_VERSION, &S->out_sqlda)

isc_dsql_execute2(H->isc_status, &H->tr, &S->stmt, PDO_FB_SQLDA_VERSION, S->in_sqlda, &S->out_sqlda)

На последнем вызове: General error: -804 Incorrect values within SQLDA structure empty pointer to data at SQLVAR index 0

Если просто isc_dsql_execute и потом isc_dsql_fetch(H->isc_status, &S->stmt, PDO_FB_SQLDA_VERSION, &S->out_sqlda)
То все работает.

Нужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?
5 дек 16, 12:26    [19967592]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Dorin Marcoci
Нужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?

Её нужно хоть как-то инициализировать. Ясно же пишется: "empty pointer to data", то есть
sqldata == NULL. Полученные данные куда клиент должен складывать?

Posted via ActualForum NNTP Server 1.5

5 дек 16, 13:18    [19967839]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Dimitry, да, спасибо, нашел косяк.

Там точно &S->out_sqlda->sqlvar[0]->sqldata = NULL

Тоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2.
Мысль уловил, копаем дальше.
5 дек 16, 13:44    [19967996]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Ура! Работает!
Там если бы был просто C. А такой стиль в драйвере, логика кодирования и организация структур что пипец.
Ну.. в общем буду еще тестировать, полировать, упаковывать, и потом открою пулл реквест в PHP мастер.
5 дек 16, 14:18    [19968214]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

Надо бы проверить что ничего старого не сломалось. Спасибо.
5 дек 16, 14:24    [19968249]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
rdb_dev, это я так, образно писал, дебагером смотрел, никакое присвоение
Денис, тестировал несколько примеров, все ок, и простые селеты, и даже returning id, name.
5 дек 16, 14:32    [19968303]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Кстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :)
Слышал что процедурный стиль щас обертка над обьектным...
5 дек 16, 14:37    [19968334]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Dorin Marcoci
а как там обьектый API в FB3?

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

Posted via ActualForum NNTP Server 1.5

5 дек 16, 14:43    [19968373]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Dorin Marcoci
Кстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :)


Примеры есть, но переписывать не стоит.
Не надо ломать совместимость с 2.5
5 дек 16, 15:00    [19968465]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Симонов Денис
Не надо ломать совместимость с 2.5

Я так, пошутил конечно. Сможешь тестировать под вин64 билд?
5 дек 16, 17:49    [19969370]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

смогу если билд выложишь. Я не разбирался как его компилировать
5 дек 16, 17:53    [19969380]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Вот: https://mega.nz/#!EFwCDAjT!kVrAzT7YGPi9Aco6IEdZfR_SISenXL3swTQAYBiS2_M
После распаковке, клади рядом фиребирдскую либу от тройки или чтоб движок находил ее.
5 дек 16, 18:31    [19969543]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

что-то я не пойму. Я думал ты расширение скомпилировал, а тут весь движок PHP. Ладно попробую запустить
5 дек 16, 22:03    [19970084]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

вроде всё нормально. Проверил различные виды запросов. INSERT, INSERT ... RETURNING, SELECT, EXECUTE PROCEDURE везде результаты правильные и ничего не падает
5 дек 16, 22:33    [19970155]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Dorin Marcoci
Нужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?
Нужно указать - куда данные помещать
Dorin Marcoci
Тоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2.
Нет, FB клиентской памятью не управляет.
В данном случае, скорее всего, память под вых пар-ры\результат выделяется перед первым фетчем.
Это я к тому, куда можно посмотреть в имеющемся коде.
5 дек 16, 23:30    [19970347]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Dorin Marcoci
Ура! Работает!
Поздравляю :)
5 дек 16, 23:36    [19970358]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

надо бы ещё посмотреть нет ли утечек памяти
6 дек 16, 09:35    [19970808]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Денис, вроди проверял, все должно быть OK.
В старой реализации шансы были больше на утечек, так как sqldata инициализировалась при firebird_stmt_describe, что было неправильно. Например fetchColumn могли бы не работать, но специально не проверял.
Используется только один выходной буффер sqldata для всех записей и при firebird_stmt_dtor все освобождается.
Дебаг билд кричит в конце если есть утечки, все чисто пока. Там еще до принятия в мэйнстрим проверяют каким-то валгриндом на утечек.
Вот изменения: https://github.com/php/php-src/pull/2230/commits/c92ddeabdc7e40e8e0c2878bd12b96e3dff1a986
Ждем одобрения.
6 дек 16, 11:01    [19971255]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Насчет execute block и обработка параметров, вот что есть щас: https://gist.github.com/madorin/83300eaf3d9044bc6e56a710b3700368
new_sql - полученный результат, в хэш списке - именные параметры.
Логика там простая и быстрая, но есть проколы, например не учитывает и комменты (--, /* */).
Супер навороченный парсер/лексер врядли там понадобится но хочется красивое решение.
Нужно в начале определить если "execute block (" и обработать до ")" с существующем алгортиме и все что после передать как есть.
Надо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF.
Все гики и параноики по оптимизации приветствуется :)
8 дек 16, 11:32    [19979595]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Dorin Marcoci
Надо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF.


Есть ещё строковые литералы. Я не проверял, но почему-то мне кажется текущий алгоритм будет работать не правильно на вот таких запросах

SELECT 'Параметр :NAME равен ' AS TXT, 'Вася' AS VAL FROM RDB$DATABASE
8 дек 16, 11:43    [19979675]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
там есть in_quote, это обрабатывается правильно
8 дек 16, 11:46    [19979700]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

проверь ещё вариант, когда :параметры и 'квотированные строки' находится внутри комментария.
стандартный парсер IBX криво это обрабатывал.

Posted via ActualForum NNTP Server 1.5

8 дек 16, 12:10    [19979821]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Мимопроходящий,

там пока обработки комментариев нет.

Dorin Marcoci,

Про строки я проглядел. Там всё нормально. Хотя для комментариев такое простое решение не подойдёт.
8 дек 16, 12:40    [19979997]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

обработка комментариев ничуть не сложнее строк.

Posted via ActualForum NNTP Server 1.5

8 дек 16, 12:45    [19980020]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Dorin Marcoci
Насчет execute block и обработка параметров
Возможно, будет полезным посмотреть на аналогичный код из поддержки EXECUTE STATEMENT:

https://github.com/FirebirdSQL/firebird/blob/master/src/jrd/extds/ExtDS.cpp

см. Statement::preprocess() и getToken() строки с 1001 по 1240
8 дек 16, 12:55    [19980078]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dorin Marcoci
Member

Откуда:
Сообщений: 261
Влад, кстати планов поддержки именнованных парамов нету? :)
8 дек 16, 13:27    [19980249]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Dorin Marcoci
Влад, кстати планов поддержки именнованных парамов нету? :)
Никто этого не просил, насколько я помню :)
8 дек 16, 14:24    [19980516]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Симонов Денис
Member

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

было такое пожелание, но автора обругали и сказали мол на фиг не надо

https://www.sql.ru/forum/682148/rasshirenie-parsera-fb-obsuzhdenie
8 дек 16, 15:10    [19980800]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

Hello, Симонов Денис!
You wrote on 8 декабря 2016 г. 15:18:10:

Симонов Денис
> было такое пожелание, но автора обругали и сказали мол на фиг не надо
никто его там не ругал.
DS, как обычно, шапками кидался надувая щеки.
а остальным было пофиг.
(и мне тоже)

Posted via ActualForum NNTP Server 1.5

8 дек 16, 15:19    [19980851]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Dimitry Sibiryakov
Member

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

Мимопроходящий
DS, как обычно, шапками кидался надувая щеки.
а остальным было пофиг.

Ну, тогда я наивно полагал, что если оградить ядерных разработчиков от излишних
фичереквестов, они сделают сервер лучше, надёжнее, быстрее. Сейчас моё мнение изменилось,
но, как ни странно, основные аргументы остались прежними: у ядерных разработчиков нет на
это времени, а остальным, кто теоретически мог бы это сделать, включая меня, оно нафиг не
сдалось.

Posted via ActualForum NNTP Server 1.5

8 дек 16, 16:09    [19981115]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Павел Ишенин
Member

Откуда: Красноярск
Сообщений: 358
Кто-нибудь пробовал собирать это расширение на linux из исходников? Я правильно понимаю, что нужно будет собирать всё php и одним расширением мне не обойтись?
15 дек 16, 04:12    [20005186]     Ответить | Цитировать Сообщить модератору
 Re: PDO Firebird bugs  [new]
Павел Ишенин
Member

Откуда: Красноярск
Сообщений: 358
Зря вопрос задал. Оказывается все предельно просто. Если кому вдруг понадобится, то процесс следующий:
  • git clone репозитория php
  • идем в каталог расширения pdo_firebird
  • phpize
  • ./configure
  • make
  • sudo make install
  • 15 дек 16, 05:08    [20005191]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Начал тестировать fb3 с поправленным pdo_firebird на своем проекте. Ошибка с RETURNING действительно ушла в большинстве мест.

    Но один запрос все еще ругается, правда теперь с другой ошибкой:
    General error: -501 Attempt to reclose a closed cursor . The SQL statement executed was:
    UPDATE TM_MAIL SET READ_DATE = CURRENT_TIMESTAMP WHERE IDTM_MAIL = :IDTM_MAIL RETURNING READ_DATE
    15 дек 16, 07:24    [20005225]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Сделал минимальный пример

    <?php
    require 'testdb.inc';
    $C = new PDO('firebird:dbname='.$test_base, $user, $password) or die;
    $C->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $C->exec('create table test_mail(idtm_mail integer, read_date timestamp)');
    $C->exec('insert into test_mail(idtm_mail) values (1)');
    $S = $C->prepare('update test_mail set read_date = current_timestamp where idtm_mail = 1 returning read_date');
    try{
      $S->execute();
      $D = $S->fetch(PDO::FETCH_NUM);
      echo $D[0];
      $S->closeCursor();
    } catch (Exception $e) {
      echo $e->getMessage();
      unset($S);
      unset($C);
    }
    ?>
    


    Комментирование строки "$S->closeCursor();" убирает Exception, но так как pdo_firebird используется в проекте через Yii-фреймворк, то это не устраняет проблем конечного приложения.
    15 дек 16, 10:03    [20005554]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    rdb_dev
    Member

    Откуда: с болот
    Сообщений: 2929
    Павел Ишенин
    Комментирование строки "$S->closeCursor();" убирает Exception, но так как pdo_firebird используется в проекте через Yii-фреймворк, то это не устраняет проблем конечного приложения.
    Каких проблем?
    15 дек 16, 10:37    [20005774]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Павел, поведение правильное. В 3.0 "returning" не открывает курсор, так как возвращается ровно одна запись.
    Получается уже нечего закрывать.
    15 дек 16, 10:40    [20005792]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Спасибо. Если поведение правильное, то значит нужно править в приложении или Yii.
    15 дек 16, 10:57    [20005918]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Павел, спасибо и вам, это наводило ны мысль и поимки бага что два последовательных стэйтментов с "returning" не работали правильно. Уже тестировал и фиксил локально.
    15 дек 16, 11:25    [20006140]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Dorin Marcoci,

    всеже мне кажется в pdo_firebird заложена логика чтобы не закрывать курсор в случае ненадобности.

    Вот код закрытия и он проверяет что S->cursror_open:
    static int firebird_stmt_cursor_closer(pdo_stmt_t *stmt) /* {{{ */
    {
    	pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
    
    	/* close the statement handle */
    	if ((*S->name || S->cursor_open) && isc_dsql_free_statement(S->H->isc_status, &S->stmt, DSQL_close)) {
    		RECORD_ERROR(stmt);
    		return 0;
    	}
    	*S->name = 0;
    	S->cursor_open = 0;
    	return 1;
    }
    


    А вот кусок кода, который этот cursor_open выставляет:

    static int firebird_stmt_execute(pdo_stmt_t *stmt) /* {{{ */
    ...
    		switch (S->statement_type) {
    			case isc_info_sql_stmt_insert:
    			case isc_info_sql_stmt_update:
    			case isc_info_sql_stmt_delete:
    			case isc_info_sql_stmt_exec_procedure:
    ...
    		S->cursor_open = (S->out_sqlda.sqln > 0);	/* A cursor is opened, when more than zero columns returned */
    


    Таким образом firebird_stmt_execute обладая информацией о типе запроса, выставляет флаг опираясь на другие факторы.

    Полагаю, что S->cursor_open не нужно выставлять в true для запросов insert, update, delete даже если они возвращают столбец.
    15 дек 16, 12:31    [20006514]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    Курсор может быть только для
    isc_info_sql_stmt_select и isc_info_sql_stmt_select_for_upd
    15 дек 16, 12:41    [20006559]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dimitry Sibiryakov
    Member

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

    hvlad
    Курсор может быть только для
    isc_info_sql_stmt_select и isc_info_sql_stmt_select_for_upd

    И то не всегда. Поэтому тщатильнее надо с установкой этого флага.

    Posted via ActualForum NNTP Server 1.5

    15 дек 16, 12:47    [20006592]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    hvlad,

    Спасибо, это действительно решает проблему драйвера и Yii без правок последнего.

    Вот вся правка:
                    /* A cursor is opened, when more than zero columns returned.
                     * We must also check the statement type since only SELECT and 
                     * SELECT FOR UPDATE statements open a cursor.
                     */
    		S->cursor_open = (S->out_sqlda.sqln > 0) && (S->statement_type == isc_info_sql_stmt_select || S->statement_type == isc_info_sql_stmt_select_for_upd);
    
    15 дек 16, 12:54    [20006630]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Павел, код закрытия правильный. Там неправильно инициализировался S->cursor_open в firebird_stmt_execute().
    Раньше пологалось что если есть столбцы (out_sqlda.sqln) то это прямо cursor_open.
    А при синглетонов получается что столбцы есть, а курсора нету :)

    Вот фикс:
    https://github.com/php/php-src/pull/2241/commits/6b5dc90efa75c2785d6078b94521ccf1e16ea1c5

    Влад, спасибо, учтем.
    15 дек 16, 12:54    [20006635]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Павел, в твой фикс уже exhausted не будет правильный.
    Думаю наличие столбцов и исключение синглетонов быстро и достаточно чтобы определить наличие курсора.
    15 дек 16, 13:00    [20006672]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Dorin Marcoci
    Павел, в твой фикс уже exhausted не будет правильный.
    Думаю наличие столбцов и исключение синглетонов быстро и достаточно чтобы определить наличие курсора.


    S->cursor_open = S->out_sqlda.sqln && (S->statement_type != isc_info_sql_stmt_exec_procedure);
    


    У меня запрос update, следовательно S->statement_type != isc_info_sql_stmt_exec_procedure. При этом видимо S->out_sqlda.sqln выдает 1.

    Следовательно твой фикс будет продолжать выставлять cursor_open в true.
    15 дек 16, 13:11    [20006741]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Павел Ишенин,

    запросы с returning возвращают isc_info_sql_stmt_exec_procedure
    15 дек 16, 13:16    [20006762]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Щас проверим, знаю только что при insert returning тип тоже был isc_info_sql_stmt_exec_procedure.
    15 дек 16, 13:17    [20006775]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Симонов Денис
    Павел Ишенин,

    запросы с returning возвращают isc_info_sql_stmt_exec_procedure


    Спасибо, не знал об этом. Тогда видимо проблем с патчем Dorin Marcoci быть не должно.
    15 дек 16, 13:23    [20006806]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Все работает правильно:

    $S = $D->prepare('update ta_test set name = :name where id = :id returning id');
    $S->execute(['id' => 1, 'name' => 'AAA']);
    $S->execute(['id' => 1, 'name' => 'BBB']);
    

    Курсор не открывается.
    15 дек 16, 13:23    [20006807]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Денис, вчерашняя статья на хабре учетная, поздравляю!
    Кстати, нужно добавить доддержку файра и для Doctrine.
    Очень многие фрэймворки используют ее, и следовательно будет и продвижение.
    Вот в phpbb3,4 выкинули поддержку :(
    Получается DBMS хорошая, а продвижение и маркетинг - почти ноль.
    А то, будет медленно умирать как десктопная дб для делфи...
    Или может нанять маркетолога. Еще и сайт файра на бутстрапе чтоб респонсив был.
    Заодно и где-то и список сайтов, built with Firebird :) У нас есть кучка.
    Вот такой вот маленький оффтоп.
    15 дек 16, 13:40    [20006906]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    Спасибо. Как только исправление по returning попадёт в драйвер PDO, выпилю кусок гавнокода из моего драйвера Laravel, а то там для тройки прыжки в ширину приходилось делать.
    15 дек 16, 13:55    [20006983]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Хэллоу! Все проснулись? С праздником!
    Я пилил в своем брэнче фичу чтоб целые типы (SMALLINT, INTEGER, BIGINT) возвращались как целые в PHP а не как щас - строки.
    Если кому-то интересно протестировать, буду очень рад, так как не хочется сломать что-то другое, особенно на x86.
    Исходники: https://github.com/madorin/php-src/tree/fb_native
    2 янв 17, 18:14    [20069395]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Gallemar
    Member

    Откуда: г.Иркутск
    Сообщений: 5149
    Dorin Marcoci
    Хэллоу! Все проснулись? С праздником!

    Привет. Я и не ложился. С праздником тебя!!!
    3 янв 17, 18:38    [20071239]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Денис, сегодня вышел 7.0.15 и 7.1.1 с
    * Fixed bug #72931 (PDO_FIREBIRD with Firebird 3.0 not work on returning statement).
    19 янв 17, 17:26    [20123885]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    отлично. Спасибо. Подкручу свой модуль для Laravel
    19 янв 17, 17:41    [20123998]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Добавил поддержку булеан полей: https://github.com/php/php-src/pull/2522
    Testers are welcome :)
    13 май 17, 17:38    [20479112]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Заметил утечку памяти при работе с blob-полями (тестировалось на Yii). Сделаю на днях тест на чистом pdo_firebird.
    27 май 18, 16:50    [21444174]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    kdv
    Member

    Откуда: iBase.ru
    Сообщений: 28117
    Павел Ишенин,

    с этим не сюда, а в Yii. Если бы утечка была в ФБ, об этом давно было бы известно и исправлено. А так - хрен знает что компонентописатели пишут. Может и с утечкой. Но исправлять-то тогда Yii надо.
    27 май 18, 19:12    [21444386]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    не в fb и не Yii, а в pdo драйвере. Раз уж Dorin Marcoci взялся в нём ошибки править, то логично к нему постучаться. Само сообщество PHP довольно вялое. По крайней мере баги в PDO драйвере для Firebird них не в приоритете, вот если в mysql-ом драйвере ошибку нашли то реагируют значительно быстрее.
    27 май 18, 19:38    [21444433]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Yii тут не причем.

    Вот код на чистом php:
    <?php
    
    $dbh = new PDO('firebird:dbname=...;role=...;charset=UTF8', "...", "...") or die;
    
    $limit = 250;
    $offset = 0;
    
    while (true) {
       $start = $offset + 1;
       $stop = $offset + $limit;
    
       $sql = "SELECT * FROM tablename ROWS {$start} TO {$stop}";
       $stmt = $dbh->prepare($sql);
       $stmt->execute();
       $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
       if (count($rows) < $limit) {
         return;
       }
       unset($stmt);
       $rows = null;
       $offset += $limit;
       echo "used: " . memory_get_usage(true) . "\r\n";
    }
    unset($dbh);
    


    Вот итоги использования памяти:

    used: 10485760
    used: 16777216
    used: 20971520
    used: 27262976
    used: 33554432
    used: 37748736
    used: 41943040
    used: 46137344
    used: 52428800
    used: 58720256
    used: 62914560
    used: 69206016
    used: 75497472
    28 май 18, 04:38    [21444997]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Забыл добавить, что тестировалось на php 7.1.18 windows. В таблице 2 блоб поля для которых используется следующий домен:
    CREATE DOMAIN T_MEMO AS BLOB SUB_TYPE 1 CHARACTER SET UTF8
    
    28 май 18, 05:03    [21444999]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    При анализе кода pdo_firebird вот первое за что цепляется глаз:
    *ptr = S->fetch_buf[colno] = erealloc(*ptr, *len+1);
    


    Зачем там erealloc? Разве где-то память выделяется ранее? И если нет, то всегда ли там null?

    Под все остальные типы используется следующая конструкция:
    *ptr = FETCH_BUF(S->fetch_buf[colno], char, *len, NULL);
    
    28 май 18, 06:19    [21445019]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    Симонов Денис
    kdv,

    не в fb и не Yii, а в pdo драйвере. Раз уж Dorin Marcoci взялся в нём ошибки править, то логично к нему постучаться. Само сообщество PHP довольно вялое. По крайней мере баги в PDO драйвере для Firebird них не в приоритете, вот если в mysql-ом драйвере ошибку нашли то реагируют значительно быстрее.


    самым правильным вариантом будет найти утечку, исправить и сделать пул реквест
    28 май 18, 08:26    [21445149]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    как минимум зарепортить, если такого тикета еще нет
    28 май 18, 08:26    [21445151]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Дегтярев Евгений,

    Для начала хотелось бы подтверждения от других участников, что
    - либо утечка действительно подтверждается
    - либо я что-то делаю не так.
    28 май 18, 09:12    [21445217]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Павел Ишенин,

    не факт что утечка есть. Менеджер памяти PHP не обязан моментально освобождать память.
    Ну и не плохо бы проверить разные варианты, когда есть BLOB поле и когда его нет.

    Павел Ишенин
    Зачем там erealloc? Разве где-то память выделяется ранее? И если нет, то всегда ли там null?


    я не слишком разбираюсь во внутренностях PHP, но для BLOB заранее память может быть выделена разве что для ISC_QUAD и Null флага. А вот с самим содержимым BLOB намного сложнее, там как раз память должна выделяться если блоб не пустой. А вот когда оно должно освобождаться хз, по идее по правилам PHP
    28 май 18, 09:34    [21445283]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    Павел Ишенин,

    а как тестируете?
    консольно вряд ли получится
    имеет смысл сделать скрипт, например test.php, в той же папке запустить php в режиме девсервера, дать нагрузку и смотреть за расходом памяти
    > php -S localhost:8000
    > ab -n 10000 http://localhost:8000/test.php
    

    по завершении каждого запроса все ресурсы а соответственно и память, занятая ими, должны быть освобождены.
    если память постоянно будет расти то имеет место утечка

    зы
    проверьте тот же сценарий с расширением interbase (ibx_)
    28 май 18, 09:49    [21445331]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Дегтярев Евгений,

    Тестирую именно консолью. Обратите внимание на скрипт - это просто последовательный запрос таблицы по 250 строк. На моей таблице > 200 тысяч строк я получаю превышение памяти в php. Я пробовал этот скрипт и с принудительной сборкой мусора и без.

    Если вдаваться в логику, то statement при смерти должен удалять буферы, и как следствие память не должна расти при запросе очередной порции строк. Более того, я проверил этот скрипт на postgres и там действительно нет роста памяти.
    28 май 18, 11:23    [21445726]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    Павел Ишенин,

    а что с ibase_?
    извиняюсь, в пред сообщении написал ibx
    28 май 18, 11:34    [21445777]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Дегтярев Евгений
    а что с ibase_?
    извиняюсь, в пред сообщении написал ibx


    Может ли это помочь проблеме? И если да, то как?
    28 май 18, 11:44    [21445848]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Дегтярев Евгений,

    в ibase_ работа с BLOB реализована чуток иначе. Там есть два режима вычитки блобов.

    1. При фетче читается только blob_id из которого ibase_ функциями можно прочитать содержимое
    2. Читается всё содержимое блоба при фетче (при соответствующем флаге)

    Я так понимаю эти два случая надо рассматривать отдельно. Скорее всего 1-ый случай работает без косяков, так как управление хендлами отдаётся на откуп пользователю (см. ibase_blob_close).
    28 май 18, 11:48    [21445862]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dimitry Sibiryakov
    Member

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

    Павел Ишенин
    Если вдаваться в логику, то statement при смерти должен удалять буферы

    Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть
    привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое.

    Posted via ActualForum NNTP Server 1.5

    28 май 18, 12:21    [21446009]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    поскольку PDO не умеет читать идентификаторы BLOB, а всегда читает сразу его содержимое (хотя по уму могли бы и поток для этого организовать), то в самом драйвере они должны освобождать внутренние структуры блоба сразу после фетча.
    28 май 18, 12:53    [21446159]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    а не вру, есть возможность читать BLOB как поток, но через опу
    http://php.net/manual/ru/pdo.lobs.php
    28 май 18, 12:58    [21446189]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    Павел Ишенин
    Дегтярев Евгений
    а что с ibase_?
    извиняюсь, в пред сообщении написал ibx

    Может ли это помочь проблеме? И если да, то как?

    как вариант, да, там может не быть этой проблемы
    когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы

    за ответом как, сюда - http://php.net/manual/ru/book.ibase.php
    28 май 18, 14:08    [21446628]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Павел Ишенин
    При анализе кода pdo_firebird вот первое за что цепляется глаз:
    *ptr = S->fetch_buf[colno] = erealloc(*ptr, *len+1);
    


    Зачем там erealloc? Разве где-то память выделяется ранее? И если нет, то всегда ли там null?

    Под все остальные типы используется следующая конструкция:
    *ptr = FETCH_BUF(S->fetch_buf[colno], char, *len, NULL);
    


    дело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче.
    28 май 18, 14:29    [21446770]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Dimitry Sibiryakov
    Павел Ишенин
    Если вдаваться в логику, то statement при смерти должен удалять буферы

    Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть
    привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое.


    Имелся ввиду вот этот код pdo_firebird:

    	/* clean up the fetch buffers if they have been used */
    	for (i = 0; i < S->out_sqlda.sqld; ++i) {
    		if (S->fetch_buf[i]) {
    			efree(S->fetch_buf[i]);
    		}
    	}
    
    28 май 18, 16:54    [21447685]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Дегтярев Евгений
    как вариант, да, там может не быть этой проблемы
    когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы


    Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём?
    28 май 18, 16:57    [21447703]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Симонов Денис
    дело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче.


    Спасибо, мне что-то в голову это не пришло. Тогда всё вроде верно написано. Ну может вместо realloc было бы выгодней сделать free + malloc если realloc ведет к фрагментации памяти. Тем не менее, это не должно порождать утечку.
    28 май 18, 17:03    [21447752]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Дегтярев Евгений
    Member

    Откуда: Барнаул
    Сообщений: 1642
    Павел Ишенин
    Дегтярев Евгений
    как вариант, да, там может не быть этой проблемы
    когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы


    Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём?

    в том чтобы проверить, локализовать и зарепортить все возможные проблемы
    28 май 18, 17:04    [21447758]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Можете протестить тот же код на таблицы/полей без блобов и проверить память или скажем на Postgres блобах?
    Глянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел.
    К выходу идет ptr и len который потом освобождается в базовой PDO классе.
    Обычно пхп девы тестят все изминения Valgrind-ом и другими тулами, чтобы минимизировать утечки.
    Если все же уверен что утечка есть, то создай баг репорт с юнит тест кэйсом наподобие: https://github.com/php/php-src/tree/8582e53430f12ce36f621d034a40d10ea01061fc/ext/pdo_firebird/tests
    5 июн 18, 13:06    [21469461]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    оно легко воспроизводится

    +
    <?php
    
    $sql = '
    SELECT
        RDB$PROCEDURE_NAME AS NAME,
        RDB$PROCEDURE_SOURCE AS SRC
    --    CAST(SUBSTRING(RDB$PROCEDURE_SOURCE FROM 1 FOR 8191) AS VARCHAR(8191)) AS SRC
    FROM
        RDB$PROCEDURES   
    ';
    
    try {
        $dbh = new \PDO('firebird:dbname=localhost:test', 'SYSDBA', 'masterkey');
        $dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
        $dbh->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);
        //$dbh->setAttribute(\PDO::ATTR_AUTOCOMMIT, false);
    
        echo "First used: " . memory_get_usage(true) . "<br>";
     
      
        for ($i = 0; $i < 20; $i++) {
    	//$dbh->beginTransaction();
            $sth = $dbh->prepare($sql);
            $sth->execute();          
            $rows = $sth->fetchAll();
    	unset($rows);
            //$sth->closeCursor();
    	unset($sth);
    	//$dbh->commit();
            echo "$i itteration used: " . memory_get_usage(true) . "<br>";
        }
        unset($dbh);
        echo "Last used: " . memory_get_usage(true) . "<br>";
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
    


    +
    автор
    First used: 2097152
    0 itteration used: 4194304
    1 itteration used: 4194304
    2 itteration used: 6291456
    3 itteration used: 6291456
    4 itteration used: 8388608
    5 itteration used: 8388608
    6 itteration used: 8388608
    7 itteration used: 10485760
    8 itteration used: 12582912
    9 itteration used: 12582912
    10 itteration used: 12582912
    11 itteration used: 14680064
    12 itteration used: 16777216
    13 itteration used: 16777216
    14 itteration used: 16777216
    15 itteration used: 18874368
    16 itteration used: 18874368
    17 itteration used: 20971520
    18 itteration used: 23068672
    19 itteration used: 23068672
    Last used: 23068672


    в базе данных ~200 процедур. При замене BLOB на строку утечек нет. Интересно что при повторном запуске скрипта память постепенно стабилизируется. Наверное менеджер памяти там такой хитрый.

    И ещё вот здесь
    static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,  /* {{{ */
    	zend_ulong *len, int *caller_frees)
    {
    	pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
    	XSQLVAR const *var = &S->out_sqlda.sqlvar[colno]; // тадам!!!
    
    	if (*var->sqlind == -1) {
    ...
    


    нет проверки на допустимость номера столбца. В результате при вызове PDOStatement::fetchColumn с номером большим чем количество столбцов имеем segfault с падением web сервера. Надо бы ошибку бросать
    5 июн 18, 13:51    [21469630]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    Dorin Marcoci
    Глянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел.
    К выходу идет ptr и len который потом освобождается в базовой PDO классе.
    А сам блоб - закрывается ?

    Симонов Денис
    оно легко воспроизводится
    Тут автокоммит вкл ?
    5 июн 18, 13:57    [21469647]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    я пробовал его отключать (по умолчанию включен). Разницы никакой.
    Кстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена?
    5 июн 18, 14:02    [21469661]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    Симонов Денис
    Кстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена?
    После закрытия - конечно не будет.
    Вопрос в том - закрыты ли они.
    Однако, коммит (роллбек) должен освобождать клиентские ресурсы, связанные с блобами.
    Отсюда был вопрос об автокоммите.
    5 июн 18, 14:13    [21469721]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    hvlad
    А сам блоб - закрывается ?


    Да, после чтения блоб закрывается.
    7 июн 18, 18:11    [21477153]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Павел Ишенин
    Member

    Откуда: Красноярск
    Сообщений: 358
    Dorin Marcoci,

    Если есть возможность поотлаживать код pdo-firebird, то в какой момент вызывается firebird_stmt_dtor? И что если добавить вывод потребления памяти до и после erealloc? Я не знаю как работает этот erealloc, но традиционно перевыделение вызывает фрагментацию и медленнее освобождения с повторным выделением поскольку менеджер должен, помимо прочего, скопировать содержимое старого блока памяти в новый (чего, как я понимаю, в данном случае не требуется).
    7 июн 18, 18:21    [21477176]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Павел Ишенин,

    там КМК это можно оптимизировать. Например выделять для начала 32K памяти, если блоб больше увеличивать, т.е. перевыделять память только если для БЛОБа её требуется больше.
    7 июн 18, 19:51    [21477382]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Павел Ишенин,

    ура!!! Нашёл утечку. Не зря тебе подозрительным вот этот кусок показался

    Павел Ишенин
    При анализе кода pdo_firebird вот первое за что цепляется глаз:
    *ptr = S->fetch_buf[colno] = erealloc(*ptr, *len+1);
    



    только дело не в erealloc, а в том память перевыделяют для для ptr, в котором вообще чужой буфер может быть из столбца к которому обращались до BLOBa (в моём тесте из NAME). Вот правильный код

    *ptr = S->fetch_buf[colno] = erealloc(S->fetch_buf[colno], *len+1);
    


    + тест
    try {
        $dbh = new \PDO('firebird:dbname=localhost:horses', 'SYSDBA', 'masterkey');
        $dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
        $dbh->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);
    
    $sql = '
    SELECT
        RDB$PROCEDURE_NAME AS NAME,
        RDB$PROCEDURE_SOURCE AS SRC
    FROM
        RDB$PROCEDURES   
    ';
    
        echo "First used: " . memory_get_usage(true) . "<br>";
      
        for ($i = 0; $i < 20; $i++) {
            $sth = $dbh->prepare($sql);
            $sth->execute();          
            $rows = $sth->fetchAll();
    	    unset($rows);
    	    unset($sth);
            echo "$i itteration used: " . memory_get_usage(true) . "<br>";
        }
        unset($dbh);
        echo "Last used: " . memory_get_usage(true) . "<br>";
    }
    catch(Exception $e) {
    	var_dump($e);
    }
    


    First used: 2097152
    0 itteration used: 2097152
    1 itteration used: 2097152
    2 itteration used: 2097152
    3 itteration used: 2097152
    4 itteration used: 2097152
    5 itteration used: 2097152
    6 itteration used: 2097152
    7 itteration used: 2097152
    8 itteration used: 2097152
    9 itteration used: 2097152
    10 itteration used: 2097152
    11 itteration used: 2097152
    12 itteration used: 2097152
    13 itteration used: 2097152
    14 itteration used: 2097152
    15 itteration used: 2097152
    16 itteration used: 2097152
    17 itteration used: 2097152
    18 itteration used: 2097152
    19 itteration used: 2097152
    Last used: 2097152


    теперь надо бы патч оформить. Буду разбираться как им написать
    16 июн 18, 16:39    [21496219]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    в трекер написал https://bugs.php.net/bug.php?id=76488 патч приложил ждём реакции
    17 июн 18, 16:19    [21497619]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Денис, спасибо за фикс!
    Нужно сделать тест-кэйс и пулл реквест на гитхабе, о то будешь ждать бесконечно долго.
    Попробую, может сделаю я, но дико не хватает время. Последние месяцы занят повседневными проэктами.
    25 июн 18, 11:46    [21518116]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Денис, там тест кэйс должен падать при нынешнем коде, и пройти успешно с твоим кодом.
    Например, типа утечка ноль, а с текущим кодом > 0. Но думаю смерджят.
    4 июл 18, 16:36    [21543336]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    оно падает только при segfault, а если утечка идёт, то оно скорее всего просто упрётся в ограничения на потребляемую память процессом php, который зависит от настроек. То же надеюсь что смержат. Мне комменты присылаются на почту.
    4 июл 18, 16:43    [21543367]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    не то что прямо падал процес :) мой рускиш не родной..
    имел ввиду чтоб не прошел тест, тоесть другой результат, не тот что в еxpected
    4 июл 18, 17:54    [21543687]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

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

    а.. так ты про это. Мне дали вот такой коммент

    nikic
    It shouldn't be necessary to test memory usage explicitly (because a leak message will be printed in debug builds), just have a code that was previously leaking.
    4 июл 18, 17:58    [21543707]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    патч приняли :-)
    6 июл 18, 19:02    [21550637]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Dorin Marcoci
    Member

    Откуда:
    Сообщений: 261
    Поздравляю! :)

    Анатолий (weltling) там человек добрый, русский, работает в MS, Германии.
    Наверное отвечает за php под windows, во многом помогал при правке багов.
    7 июл 18, 19:11    [21552403]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: PDO Firebird bugs  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Наконец-то в ветку PHP 7.4 приняли мой патч для нативной поддержки типа BOOLEAN во входных параметрах

    PDO firebird support type Boolean in input parameters
    10 сен 19, 17:31    [21967996]     Ответить | Цитировать Сообщить модератору
     Re: PDO Firebird bugs  [new]
    Gallemar
    Member

    Откуда: г.Иркутск
    Сообщений: 5149
    Симонов Денис
    Наконец-то в ветку PHP 7.4 приняли мой патч для нативной поддержки типа BOOLEAN во входных параметрах

    PDO firebird support type Boolean in input parameters

    Поздравляю Картинка с другого сайта.
    10 сен 19, 18:00    [21968016]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5 6 7      [все]
    Все форумы / Firebird, InterBase Ответить