powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PDO Firebird bugs
222 сообщений из 222, показаны все 9 страниц
PDO Firebird bugs
    #39304205
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Нарвались на неприятный критический глюк 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

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

Помогите!
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39304228
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

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

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

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

З.Ы. Собираюсь скоро выпустить статью о интеграции Firebird в фреймворк Laravel. Там тоже используется PDO.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305715
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Сибиряков, помогите сообществу которую продвигает Firebird в браузерах!
Давайте уничтожим легенду что Firebird на вебе плохой, тормозной и глючный :)
Если надо, скинусь на несколько часов работы, честно...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305753
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше попытайтесь уничтожить легенду, что все уэб-программисты - днище криворукое, ни на что толковое без готовых фреймворков не годное.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305796
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаем и в это направление, есть чем гордится.
Вот только драйверы сырые, с чем собственно и обращались...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305805
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

фреймворки тут не причём бага в драйвере
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305806
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociВот только драйверы сырые, с чем собственно и обращались...

Так этим и подтверждаешь легенду, что выйти за пределы фреймворка и ПыхПыха в целом для
вас - полный анрил. Даже глупые дельфины время от времени способны поправить баги в
библиотеках...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305810
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисбага в драйвере
Ты ещё скажи "в ДНК"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305814
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДаже глупые дельфины время от времени способны поправить баги в
библиотеках...


ты не сравнивай библиотеки доступа в Дельфи и PDO драйвер пыха. Дельфийские библиотеки написаны на самой дельфе и разобраться там проще. PDO написана на C++, т.е. человек владеющий только PHP это сделать не способен. Там нужно разбираться в Firebird API и внутренней кухне PHP одновременно.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисчеловек владеющий только PHP это сделать не способен

Ну так легенда, о которой я говорил, именно так и гласит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305824
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДаже глупые дельфины время от времени способны поправить баги в библиотеках...

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

Ладно, чет вы сегодня с сарказмом и злой. Нет так нет...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305834
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociНо здесь код драйвера в С++, и FB API, как и сказал выше.

И? С++ не слишком отличается от Дельфи (а если уж на то пошло, то и от PHP), а FB API -
обычное API на функциях (синтаксис вызова которых совершено одинаков во всех языках) и
хэндлах. Что именно делает их невозможными для понимания?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305852
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociЛадно, чет вы сегодня с сарказмом и злой.Это его нормальное состояние))
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305862
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура! Вопрос снят.

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

Короче заинтриговали. В отпуск буду ставить себе студию и компилить пых пых...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305892
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

кстати да. Я тоже заметил что 7 работает корректней
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305896
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот только у меня подозрения, что эти баги никто не исправлял в PDO Firebird, а сам ПХП их просто аккуратно прячет под ковёр
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305902
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Может быть глюк был на уровне PDO, а не в сам драйвер FB... cмотрел чендж лог, ничего подобного не нашел.
Или менеджер памяти движка, так как в 7-ой версии переписали кучу кода. Глюк был только при больших строк (100kb).
Даже не знаю что думать, рад что исчез :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305962
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociГлюк был только при больших строк (100kb).

Firebird в принципе не может работать со строками длиннее 32к-3 байт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305968
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

речь о BLOB SUB_TYPE TEXT
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305982
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисречь о BLOB SUB_TYPE TEXT
Если кто-то по мускулистой привычке пытался собирать текст запроса со значениями, а не
параметрами, то это клиника и уже не лечится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39305989
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

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

Вроде бы для Firebird в PDO по умолчанию используются нативные подготовленные запросы.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39306025
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдля Firebird в PDO по умолчанию используются нативные подготовленные запросы.
Так и есть, никакой эмуляции.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39306035
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисХоть бы почитал содержание приведённых багов.

Почитал. Мнение не изменилось. Апача ставить, пыхпых ставить, PDO и драйвер к нему из
исходников собирать, потом ещё разбираться как это всё друг с другом связать, чтобы оно
хотя бы попыталось заработать. Потом ловить крэш отладчиком, смотреть стэк. С вероятностью
90% в процессе нарвёшься на совсем другой баг или проблему собственно сборки. Дня два
дурной работы и ради чего? Возможное продвижение Firebird в изначально сомнительную нишу
без всякого полезного выхлопа? Бесперспективняк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39306064
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну тебя же никто не заставляет. Да геморрой там порядочный. Ко всему этому надо ещё понимать потроха пыха.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39306068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисДа геморрой там порядочный.
Ты его недооцениваешь. ИМНИП, там ещё и собирать надо компилятором исключительно
православной версии, иначе оно работать откажется без объяснения причин. У разработчиков
пых-пыха очень сильные тараканы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39306841
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВозможное продвижение Firebird в изначально сомнительную нишу без всякого полезного выхлопа? Бесперспективняк.

Зря вы это говорите. Хотим мы или нет, но веб проэкты все больше вытисняют десктопные. И тренд неутишительный.
В Штатах уже практически все бизнес приложения в облаке, а фэйс юзеров на хтмл.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39309522
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается все-таки глюк есть, проверял 100 раз :(
https://bugs.php.net/bug.php?id=73087

Проявляется при следующем запросе, если в предыдущем был блоб параметр с utf8 текстом.
Примите на заметку и запасаемся надеждой что кто-то исправит...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342386
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура, Товарищи!
Мой фикс с блоб параметрами был принят в мэйнстрим: https://github.com/php/php-src/pull/2183
Заодно фиксил ставка NULLов если такие передаются. Раньше переобразовались в пустую строку.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342414
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

молодец! Спасибо. Если есть возможность посмотри почему PDO не работает с INSERT ... RETURNING в 3.0. В 2.5 всё отрабатывает без ошибок.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342425
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

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

Еще на очереди этот глюк https://bugs.php.net/bug.php?id=65689
Не вызывается isc_dsql_free_statement в PDO->exec() и кушается память на стороне Firebird-a.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342427
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а этот баг тоже считается?
я столкнулся с необходимостью следить
Код: php
1.
2.
3.
4.
5.
6.
7.
// !!!! баг - 32 бит INT идут как 64 бит UINT
            if (PHP_INT_SIZE == 8) {
                foreach ($agendaRepeats as &$a) {
                    if ($a['CNT_ROUND'] > 0x7FFFFFFF)
                        $a['CNT_ROUND'] -= 0x100000000;
                }
            }
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342437
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krapotkin,

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

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

Будем фиксить, думаю это несложно.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342439
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

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

На последних снапшотах он проявляется иначе. Пишет что-то вроде cursor not open
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342445
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,
Да, на х64. Сейчас уже и нет других-то серверов, по сути.

Код: sql
1.
2.
3.
CREATE TABLE TABLE1 (INT_FIELD INTEGER);
INSERT INTO TABLE1 (INT_FIELD) VALUES (-1);
SELECT FIRST 1 INT_FIELD FROM TABLE1;



получаем 2147483648
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342455
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krapotkin,

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

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

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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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);
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342465
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin,

какой PHP точная версия и разрядность?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342478
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черт, сейчас проверил, не воспроизводится.
Но я на днях поднял новую базу, т.к. мой хостер прекратил поддержку Firebird на хостинге. пришлось покупать VDS

а код из рабочего сайта взят, поэтому ошибка точно была...
была PHP 5.6 на apache 2.2 и подключалась к FB 2.5
сейчас сайт остался на хостинге пока, а база переехала на VDS. Там я поставил FB 3.0
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342481
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот ссылка
http://ftsso.ru/new.php
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342483
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin,

sweb? Была аналогичная ситуация с хостером, но я ставил PHP7.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39342485
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, sweb.
и у них 7 появилась совсем недавно. я решил от греха не менять, мало ли опять какие модули не установлены
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356500
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Баг https://bugs.php.net/bug.php?id=72931 . Пишет
Код: plaintext
SQLSTATE[HY000]: General error: -902 Cursor is not open

Версия Firebird 3.0.1
Версия php 5.4.3
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356510
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

ага 19864789
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356531
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, да, я все лишь хотел подтвердить, что проблема имеется и делает пока невозможным использование FB3 с некоторыми PHP-фреймворками (например с Yii).
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356760
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинпроблема имеется и делает пока невозможным использование FB3 с некоторыми PHP-фреймворками
(например с Yii).

Или лучше сказать, она делает невозможным использование некоторых фреймворков с FB3.
Поскольку баг-то в фреймворках, а не Firebird.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356761
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

не в фреймворках, а в PDO. Хотя FB 2.5 нормально работал.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356769
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисне в фреймворках, а в PDO.
А PDO это, типа, не фреймворк, ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356773
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

в фреймворках бага нет. Они честно делают запрос insert ... returning. То что PDO не может догадаться, что это не курсор, скорее всего баг PDO. Но вот почему-то в Firebird 2.5 запросы с returning нормально выполнялись. Причём ошибка происходит и fbclient версии 2.5, значит изменения произошли где-то глубже в самом ядре.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

Кстати набор функций ibase_* работает нормально, но они не очень удобны для использования в фреймворках, потому что тем удобнее пользоваться унифицированным интерфейсом.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356787
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисзначит изменения произошли где-то глубже в самом ядре.
В ядре, конечно, произошла туева хуча изменений, но для returning как возвращалось
isc_info_stmt_execute_procedure, так и возвращается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356803
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покопаюсь к пятницу, суботу насчет этой баги.
Мы пока на FB2.5 сидим, и там работает без проблем.
Но в будущем планируем пересесть на FB3.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356822
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

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

Там есть ещё один недостаток, который проявляется во всех версиях. Предварительный парсер, который вычленяет именованные параметры, делает это везде даже там где не надо. Из-за чего EXECUTE BLOCK наворачивается медным тазом. Вот если бы этот парсер был более умным и искал именованные параметры для EB только во входных параметрах EXECUTE BLOCK [(<params>)] и остальное тело не трогал было бы здорово.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39356839
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис,
Я так, не профи в C, VC14, но впервые, после танцем с бубном и много методом тыка, за день, получилось.
Если здесь есть кто-то более продвинут в C, то могу помочь со сборкой, дебагингом и тестингом, и структурами данных в PHP коде.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39359935
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел насчет баги 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 :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39359955
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

давай конкретные куски кода - поможем
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360377
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Влад, порядок такой:

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?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360425
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociНужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?

Её нужно хоть как-то инициализировать. Ясно же пишется: "empty pointer to data", то есть
sqldata == NULL. Полученные данные куда клиент должен складывать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360450
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry, да, спасибо, нашел косяк.

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

Тоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2.
Мысль уловил, копаем дальше.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360493
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура! Работает!
Там если бы был просто C. А такой стиль в драйвере, логика кодирования и организация структур что пипец.
Ну.. в общем буду еще тестировать, полировать, упаковывать, и потом открою пулл реквест в PHP мастер.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360499
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

Надо бы проверить что ничего старого не сломалось. Спасибо.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360509
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, это я так, образно писал, дебагером смотрел, никакое присвоение
Денис, тестировал несколько примеров, все ок, и простые селеты, и даже returning id, name.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360516
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :)
Слышал что процедурный стиль щас обертка над обьектным...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360524
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociа как там обьектый API в FB3?
Взяли старые функции, без применения мозга и фантазии сгруппировали по классам на основе
первого хэндла в списке параметров. Всё.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360544
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociКстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :)

Примеры есть, но переписывать не стоит.
Не надо ломать совместимость с 2.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360746
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНе надо ломать совместимость с 2.5
Я так, пошутил конечно. Сможешь тестировать под вин64 билд?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360748
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

смогу если билд выложишь. Я не разбирался как его компилировать
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360787
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот: https://mega.nz/#!EFwCDAjT!kVrAzT7YGPi9Aco6IEdZfR_SISenXL3swTQAYBiS2_M
После распаковке, клади рядом фиребирдскую либу от тройки или чтоб движок находил ее.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360901
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

что-то я не пойму. Я думал ты расширение скомпилировал, а тут весь движок PHP. Ладно попробую запустить
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360908
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

вроде всё нормально. Проверил различные виды запросов. INSERT, INSERT ... RETURNING, SELECT, EXECUTE PROCEDURE везде результаты правильные и ничего не падает
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360926
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociНужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?Нужно указать - куда данные помещать
Dorin MarcociТоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2.Нет, FB клиентской памятью не управляет.
В данном случае, скорее всего, память под вых пар-ры\результат выделяется перед первым фетчем.
Это я к тому, куда можно посмотреть в имеющемся коде.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39360927
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociУра! Работает!Поздравляю :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39361002
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

надо бы ещё посмотреть нет ли утечек памяти
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39361069
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, вроди проверял, все должно быть OK.
В старой реализации шансы были больше на утечек, так как sqldata инициализировалась при firebird_stmt_describe, что было неправильно. Например fetchColumn могли бы не работать, но специально не проверял.
Используется только один выходной буффер sqldata для всех записей и при firebird_stmt_dtor все освобождается.
Дебаг билд кричит в конце если есть утечки, все чисто пока. Там еще до принятия в мэйнстрим проверяют каким-то валгриндом на утечек.
Вот изменения: https://github.com/php/php-src/pull/2230/commits/c92ddeabdc7e40e8e0c2878bd12b96e3dff1a986
Ждем одобрения.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362389
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет execute block и обработка параметров, вот что есть щас: https://gist.github.com/madorin/83300eaf3d9044bc6e56a710b3700368
new_sql - полученный результат, в хэш списке - именные параметры.
Логика там простая и быстрая, но есть проколы, например не учитывает и комменты (--, /* */).
Супер навороченный парсер/лексер врядли там понадобится но хочется красивое решение.
Нужно в начале определить если "execute block (" и обработать до ")" с существующем алгортиме и все что после передать как есть.
Надо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF.
Все гики и параноики по оптимизации приветствуется :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362404
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociНадо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF.

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

Код: sql
1.
SELECT 'Параметр :NAME равен ' AS TXT, 'Вася' AS VAL FROM RDB$DATABASE
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362408
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там есть in_quote, это обрабатывается правильно
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362442
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверь ещё вариант, когда :параметры и 'квотированные строки' находится внутри комментария.
стандартный парсер IBX криво это обрабатывал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362470
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

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

Dorin Marcoci,

Про строки я проглядел. Там всё нормально. Хотя для комментариев такое простое решение не подойдёт.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362479
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обработка комментариев ничуть не сложнее строк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362487
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociНасчет execute block и обработка параметровВозможно, будет полезным посмотреть на аналогичный код из поддержки EXECUTE STATEMENT:

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

см. Statement::preprocess() и getToken() строки с 1001 по 1240
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362516
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Влад, кстати планов поддержки именнованных парамов нету? :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362569
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociВлад, кстати планов поддержки именнованных парамов нету? :)Никто этого не просил, насколько я помню :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362636
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

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

http://www.sql.ru/forum/682148/rasshirenie-parsera-fb-obsuzhdenie
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362644
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 8 декабря 2016 г. 15:18:10:

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39362698
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийDS, как обычно, шапками кидался надувая щеки.
а остальным было пофиг.
Ну, тогда я наивно полагал, что если оградить ядерных разработчиков от излишних
фичереквестов, они сделают сервер лучше, надёжнее, быстрее. Сейчас моё мнение изменилось,
но, как ни странно, основные аргументы остались прежними: у ядерных разработчиков нет на
это времени, а остальным, кто теоретически мог бы это сделать, включая меня, оно нафиг не
сдалось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367304
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь пробовал собирать это расширение на linux из исходников? Я правильно понимаю, что нужно будет собирать всё php и одним расширением мне не обойтись?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367305
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зря вопрос задал. Оказывается все предельно просто. Если кому вдруг понадобится, то процесс следующий:
git clone репозитория php

идем в каталог расширения pdo_firebird

phpize

./configure

make

sudo make install
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367313
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал тестировать 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
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367371
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал минимальный пример

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?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-фреймворк, то это не устраняет проблем конечного приложения.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367398
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинКомментирование строки "$S->closeCursor();" убирает Exception, но так как pdo_firebird используется в проекте через Yii-фреймворк, то это не устраняет проблем конечного приложения.Каких проблем?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367402
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, поведение правильное. В 3.0 "returning" не открывает курсор, так как возвращается ровно одна запись.
Получается уже нечего закрывать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367423
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Если поведение правильное, то значит нужно править в приложении или Yii.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367469
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, спасибо и вам, это наводило ны мысль и поимки бага что два последовательных стэйтментов с "returning" не работали правильно. Уже тестировал и фиксил локально.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367546
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

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

Вот код закрытия и он проверяет что S->cursror_open:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 выставляет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 даже если они возвращают столбец.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367561
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсор может быть только для
isc_info_sql_stmt_select и isc_info_sql_stmt_select_for_upd
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367569
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladКурсор может быть только для
isc_info_sql_stmt_select и isc_info_sql_stmt_select_for_upd

И то не всегда. Поэтому тщатильнее надо с установкой этого флага.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367576
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

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

Вот вся правка:
Код: plaintext
1.
2.
3.
4.
5.
                /* 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);
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367579
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, код закрытия правильный. Там неправильно инициализировался S->cursor_open в firebird_stmt_execute().
Раньше пологалось что если есть столбцы (out_sqlda.sqln) то это прямо cursor_open.
А при синглетонов получается что столбцы есть, а курсора нету :)

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

Влад, спасибо, учтем.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367590
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел, в твой фикс уже exhausted не будет правильный.
Думаю наличие столбцов и исключение синглетонов быстро и достаточно чтобы определить наличие курсора.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367615
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociПавел, в твой фикс уже exhausted не будет правильный.
Думаю наличие столбцов и исключение синглетонов быстро и достаточно чтобы определить наличие курсора.

Код: plaintext
1.
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.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367620
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

запросы с returning возвращают isc_info_sql_stmt_exec_procedure
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367626
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас проверим, знаю только что при insert returning тип тоже был isc_info_sql_stmt_exec_procedure.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367638
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПавел Ишенин,

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

Спасибо, не знал об этом. Тогда видимо проблем с патчем Dorin Marcoci быть не должно.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367639
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает правильно:

Код: php
1.
2.
3.
$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']);


Курсор не открывается.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367670
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, вчерашняя статья на хабре учетная, поздравляю!
Кстати, нужно добавить доддержку файра и для Doctrine.
Очень многие фрэймворки используют ее, и следовательно будет и продвижение.
Вот в phpbb3,4 выкинули поддержку :(
Получается DBMS хорошая, а продвижение и маркетинг - почти ноль.
А то, будет медленно умирать как десктопная дб для делфи...
Или может нанять маркетолога. Еще и сайт файра на бутстрапе чтоб респонсив был.
Заодно и где-то и список сайтов, built with Firebird :) У нас есть кучка.
Вот такой вот маленький оффтоп.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39367693
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

Спасибо. Как только исправление по returning попадёт в драйвер PDO, выпилю кусок гавнокода из моего драйвера Laravel, а то там для тройки прыжки в ширину приходилось делать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39378944
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хэллоу! Все проснулись? С праздником!
Я пилил в своем брэнче фичу чтоб целые типы (SMALLINT, INTEGER, BIGINT) возвращались как целые в PHP а не как щас - строки.
Если кому-то интересно протестировать, буду очень рад, так как не хочется сломать что-то другое, особенно на x86.
Исходники: https://github.com/madorin/php-src/tree/fb_native
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39379252
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociХэллоу! Все проснулись? С праздником!
Привет. Я и не ложился. С праздником тебя!!!
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39387844
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, сегодня вышел 7.0.15 и 7.1.1 с
* Fixed bug #72931 (PDO_FIREBIRD with Firebird 3.0 not work on returning statement).
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39387857
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

отлично. Спасибо. Подкручу свой модуль для Laravel
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39452596
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил поддержку булеан полей: https://github.com/php/php-src/pull/2522
Testers are welcome :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
PDO Firebird bugs
    #39650673
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил утечку памяти при работе с blob-полями (тестировалось на Yii). Сделаю на днях тест на чистом pdo_firebird.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650721
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

с этим не сюда, а в Yii. Если бы утечка была в ФБ, об этом давно было бы известно и исправлено. А так - хрен знает что компонентописатели пишут. Может и с утечкой. Но исправлять-то тогда Yii надо.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650734
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

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

Вот код на чистом php:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?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);



Вот итоги использования памяти:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650817
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить, что тестировалось на php 7.1.18 windows. В таблице 2 блоб поля для которых используется следующий домен:
Код: plsql
1.
CREATE DOMAIN T_MEMO AS BLOB SUB_TYPE 1 CHARACTER SET UTF8
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650828
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При анализе кода pdo_firebird вот первое за что цепляется глаз:
Код: plaintext
1.
*ptr = S->fetch_buf[colno] = erealloc(*ptr, *len+1);



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

Под все остальные типы используется следующая конструкция:
Код: plaintext
1.
*ptr = FETCH_BUF(S->fetch_buf[colno], char, *len, NULL);
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650849
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисkdv,

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

самым правильным вариантом будет найти утечку, исправить и сделать пул реквест
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650850
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как минимум зарепортить, если такого тикета еще нет
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650854
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

Для начала хотелось бы подтверждения от других участников, что
- либо утечка действительно подтверждается
- либо я что-то делаю не так.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650859
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

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

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

я не слишком разбираюсь во внутренностях PHP, но для BLOB заранее память может быть выделена разве что для ISC_QUAD и Null флага. А вот с самим содержимым BLOB намного сложнее, там как раз память должна выделяться если блоб не пустой. А вот когда оно должно освобождаться хз, по идее по правилам PHP
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650865
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

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


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

зы
проверьте тот же сценарий с расширением interbase (ibx_)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650931
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

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

Если вдаваться в логику, то statement при смерти должен удалять буферы, и как следствие память не должна расти при запросе очередной порции строк. Более того, я проверил этот скрипт на postgres и там действительно нет роста памяти.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650942
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

а что с ibase_?
извиняюсь, в пред сообщении написал ibx
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650952
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийа что с ibase_?
извиняюсь, в пред сообщении написал ibx

Может ли это помочь проблеме? И если да, то как?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650955
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

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

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

Я так понимаю эти два случая надо рассматривать отдельно. Скорее всего 1-ый случай работает без косяков, так как управление хендлами отдаётся на откуп пользователю (см. ibase_blob_close).
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39650995
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинЕсли вдаваться в логику, то statement при смерти должен удалять буферы

Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть
привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651032
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

поскольку PDO не умеет читать идентификаторы BLOB, а всегда читает сразу его содержимое (хотя по уму могли бы и поток для этого организовать), то в самом драйвере они должны освобождать внутренние структуры блоба сразу после фетча.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651036
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не вру, есть возможность читать BLOB как поток, но через опу
http://php.net/manual/ru/pdo.lobs.php
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651093
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинДегтярев Евгенийа что с ibase_?
извиняюсь, в пред сообщении написал ibx
Может ли это помочь проблеме ? И если да, то как?
как вариант, да, там может не быть этой проблемы
когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы

за ответом как, сюда - http://php.net/manual/ru/book.ibase.php
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651104
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинПри анализе кода pdo_firebird вот первое за что цепляется глаз:
Код: plaintext
1.
*ptr = S->fetch_buf[colno] = erealloc(*ptr, *len+1);



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

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



дело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651204
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПавел ИшенинЕсли вдаваться в логику, то statement при смерти должен удалять буферы
Не должен. Блобы могут читаться отдельно без всякого статемента. Их кэш может быть
привязан к транзакции или коннекту. В твоём коде не освобождается ни то ни другое.


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

Код: plaintext
1.
2.
3.
4.
5.
6.
	/* 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]);
		}
	}
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651205
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийкак вариант, да, там может не быть этой проблемы
когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы

Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651215
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдело в том что у остальных типов длина фиксирована, поэтому достаточно выделить память один раз. А для BLOB который сразу преобразуется в текст приходится переаллокировать буфер при каждом фетче.

Спасибо, мне что-то в голову это не пришло. Тогда всё вроде верно написано. Ну может вместо realloc было бы выгодней сделать free + malloc если realloc ведет к фрагментации памяти. Тем не менее, это не должно порождать утечку.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39651217
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинДегтярев Евгенийкак вариант, да, там может не быть этой проблемы
когда сталкивался со связкой php+fb использовал функции ibase_xxx, pdo_firebird обходил стороной, т.к. с ним периодически всплывали какие то траблы

Если прочитать моё начальное сообщение, то видно что я пишу про работу с Firebird в библиотеке Yii. Там используется PDO. Какой смысл проверять не PDO, если мне надо разобраться с проблемой именно в нём?
в том чтобы проверить, локализовать и зарепортить все возможные проблемы
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39655533
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете протестить тот же код на таблицы/полей без блобов и проверить память или скажем на Postgres блобах?
Глянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел.
К выходу идет ptr и len который потом освобождается в базовой PDO классе.
Обычно пхп девы тестят все изминения Valgrind-ом и другими тулами, чтобы минимизировать утечки.
Если все же уверен что утечка есть, то создай баг репорт с юнит тест кэйсом наподобие: https://github.com/php/php-src/tree/8582e53430f12ce36f621d034a40d10ea01061fc/ext/pdo_firebird/tests
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39655577
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
<?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 на строку утечек нет. Интересно что при повторном запуске скрипта память постепенно стабилизируется. Наверное менеджер памяти там такой хитрый.

И ещё вот здесь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 сервера. Надо бы ошибку бросать
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39655581
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociГлянул еще раз на firebird_fetch_blob( вроди ничего криминального не нашел.
К выходу идет ptr и len который потом освобождается в базовой PDO классе.А сам блоб - закрывается ?

Симонов Денисоно легко воспроизводитсяТут автокоммит вкл ?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39655585
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

я пробовал его отключать (по умолчанию включен). Разницы никакой.
Кстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39655604
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисКстати разве после закрытия блоб всё ещё будет потреблять ресурсы на клиенте, даже если транзакция не завершена?После закрытия - конечно не будет.
Вопрос в том - закрыты ли они.
Однако, коммит (роллбек) должен освобождать клиентские ресурсы, связанные с блобами.
Отсюда был вопрос об автокоммите.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39657762
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА сам блоб - закрывается ?

Да, после чтения блоб закрывается .
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39657774
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

Если есть возможность поотлаживать код pdo-firebird, то в какой момент вызывается firebird_stmt_dtor? И что если добавить вывод потребления памяти до и после erealloc? Я не знаю как работает этот erealloc, но традиционно перевыделение вызывает фрагментацию и медленнее освобождения с повторным выделением поскольку менеджер должен, помимо прочего, скопировать содержимое старого блока памяти в новый (чего, как я понимаю, в данном случае не требуется).
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39657886
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

там КМК это можно оптимизировать. Например выделять для начала 32K памяти, если блоб больше увеличивать, т.е. перевыделять память только если для БЛОБа её требуется больше.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39661573
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

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

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




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

Код: plaintext
1.
*ptr = S->fetch_buf[colno] = erealloc(S->fetch_buf[colno], *len+1);



тест
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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);
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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


теперь надо бы патч оформить. Буду разбираться как им написать
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39661696
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в трекер написал https://bugs.php.net/bug.php?id=76488 патч приложил ждём реакции
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39665222
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, спасибо за фикс!
Нужно сделать тест-кэйс и пулл реквест на гитхабе, о то будешь ждать бесконечно долго.
Попробую, может сделаю я, но дико не хватает время. Последние месяцы занят повседневными проэктами.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39669595
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, там тест кэйс должен падать при нынешнем коде, и пройти успешно с твоим кодом.
Например, типа утечка ноль, а с текущим кодом > 0. Но думаю смерджят.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39669599
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

оно падает только при segfault, а если утечка идёт, то оно скорее всего просто упрётся в ограничения на потребляемую память процессом php, который зависит от настроек. То же надеюсь что смержат. Мне комменты присылаются на почту.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39669630
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не то что прямо падал процес :) мой рускиш не родной..
имел ввиду чтоб не прошел тест, тоесть другой результат, не тот что в еxpected
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39669635
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39670857
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
патч приняли :-)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39671076
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поздравляю! :)

Анатолий (weltling) там человек добрый, русский, работает в MS, Германии.
Наверное отвечает за php под windows, во многом помогал при правке багов.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
PDO Firebird bugs
    #39859977
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то в ветку PHP 7.4 приняли мой патч для нативной поддержки типа BOOLEAN во входных параметрах

PDO firebird support type Boolean in input parameters
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39859990
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНаконец-то в ветку PHP 7.4 приняли мой патч для нативной поддержки типа BOOLEAN во входных параметрах

PDO firebird support type Boolean in input parameters
Поздравляю
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39882551
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PHP 7.4 PDO будет поддерживать базы данных в 1 диалекте. Мой патчи применили

Add support for Interbase 1 dialect
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39882636
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень хорошо!
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890196
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci
Насчет execute block и обработка параметров, вот что есть щас: https://gist.github.com/madorin/83300eaf3d9044bc6e56a710b3700368
new_sql - полученный результат, в хэш списке - именные параметры.
Логика там простая и быстрая, но есть проколы, например не учитывает и комменты (--, /* */).
Супер навороченный парсер/лексер врядли там понадобится но хочется красивое решение.
Нужно в начале определить если "execute block (" и обработать до ")" с существующем алгортиме и все что после передать как есть.
Надо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF.
Все гики и параноики по оптимизации приветствуется :)


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

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

см. Statement::preprocess() и getToken() строки с 1001 по 1240

сделал https://github.com/php/php-src/pull/4920
вроде работает. Осталось дождаться ревьювера и оформить по их правилам, и написать тесты. Владу спасибо за подсказку
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890630
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
;) Денис, это невероятно круто, спасибо за труд!

Есть еще какие-то косяки помню с транзакциями (параметры и несколько паралельных) и вообще получится конфетка.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890639
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

ну пока это не приняли, я ничего нового делать не буду.
Там это рихтовать скорее всего ещё придётся.

Если вспомнишь в чём именно косяки посмотрю потом.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890644
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

если ты про несколько транзакций внутри соединения, то на это проще забить. PDO архитектурно этого не поддерживает, ибо интерфейс у него обобщённый на разные СУБД. А такое поддерживает только 2 (IB и FB). Впрочем в пыхе оно и не сильно надо
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890670
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
если ты про несколько транзакций внутри соединения, то на это проще забить. PDO архитектурно этого не поддерживает, ибо интерфейс у него обобщённый на разные СУБД. А такое поддерживает только 2 (IB и FB). Впрочем в пыхе оно и не сильно надо

Это я знаю ) но думал теоретически может как в файрдаке добавить какой-то PDOTransaction обьект

Еще параметры транзакций были вшиты как read-commited или точно помню что там было что-то, проверю )
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890717
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociЭто я знаю ) но думал теоретически может как в файрдаке добавить какой-то PDOTransaction обьект

теоретически можно, но боюсь коммунити такое изменение зарежет на корню. Ибо этот PDOTransaction надо передавать в PDOStatement::execute. А не так как сделали в ibase_ (они к prepare привязали)

Лучше уж тогда написать нормальный нативный драйвер.

Dorin MarcociЕще параметры транзакций были вшиты как read-commited или точно помню что там было что-то, проверю )

там SNAPSHOT. Если нужны другие уровни изолированности, то можно стартовать транзакцию через

Код: php
1.
$dbh->exec('SET TRANSACTION ...')



по идее. Надо проверить кстати работает ли.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890769
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы удобно передать изолированность транзакции в конструкторе PDO обьекта. Другие драйверы делают что-то подобное.

public PDO::__construct ( string $dsn [, string $username [, string $passwd [, array $options ]]] ) << здесь

Кто-то даже начал очень давно такое:
https://github.com/php/php-src/blob/e208d236b3f8af855e219ea3abc796b8dd9d0d5d/ext/pdo_firebird/firebird_driver.c#L276
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890815
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
теоретически можно, но боюсь коммунити такое изменение зарежет на корню. Ибо этот PDOTransaction надо передавать в PDOStatement::execute. А не так как сделали в ibase_ (они к prepare привязали)

Можно же менее хардкорно, например
Код: php
1.
2.
PDO->transaction(params)  // creates a new PDOTransaction
PDOTransaction->prepare // creates a new PDOStatement


И весь существующий код будет работать и не мешать другим :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890831
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

а толку то? Ещё повторю подготовленные запросы не привязаны к транзакции и далее могут выполняться сколько угодно раз в разных транзакциях
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #39890990
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
подготовленные запросы не привязаны к транзакции

ок, а так? тоже не ломает совместимость.
Код: php
1.
2.
3.
$transaction = PDO->transaction(params);
$statement->setTransaction($transaction);
$statement->execute();
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40002412
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну наконец-то применили мой патч

Fix #64937: Firebird PDO preprocessing sql

Теперь в PHP 8.0

- параметры внутри однострочных и многострочных комментариев игнорируются
- можно выполнять операторы {CREATE [OR ALTER] |ALTER|RECREATE} {PROCEDURE|FUNCTION}. Двоеточие внутри тела процедуры, функции, триггера, анонимного блока или пакета не рассматривается как маркер параметра. Для заголовков EXECUTE BLOCK происходит отдельная обработка (параметры обрабатываются только между EXECUTE BLOCK и AS). Теперь этот оператор можно смело использовать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40002443
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
ну наконец-то применили мой патч
Это радует :)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40002447
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

молодец
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40002643
inoremap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Для заголовков EXECUTE BLOCK происходит отдельная обработка (параметры обрабатываются только между EXECUTE BLOCK и AS)
Спасибо, уберу, наконец, смайлики /*'*/ после begin
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072482
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Осваиваю работу с FB через PDO. Пока не понял как правильно работать с транзакциями. Можно ли по дефлоту всегда использовать режим read commited, nowait?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072488
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_
Можно ли по дефлоту всегда использовать режим read commited, nowait?
машина может быть любого цвета, если она чОрная! (С)

ответ: нет.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072491
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

можно, а зачем?

Чем не устраивает стандартный SNAPSHOT?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072492
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут писал как задавать уровень изолированности транзакции

https://habr.com/ru/post/317458/
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072559
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

собственно, Денис уже ответил, а вся другая дока по ФБ на русском (включая его статью) есть тут
http://www.ibase.ru/develop/
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072585
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> есть тут http://ibase.ru/develop/

Ты бы когда дизайн менял лучше
бы контент (структуру) причесал:

- почему раздел (адрес) документация
называется "develop", а не doc[umentaion]?
сделай редирект, это ведь несложно;
- почему он вообще идёт подразделом
раздела "Статьи", а не отдельным пунктом?
- почему библиотеки, драйверы (не статьи о
них, а ссылки) и пр. идут в разделе "Статьи"?

Ну и т.д.

Понятно, что так колхоз исторически
сложился, но таки 2021 год на дворе...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072598
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

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

И вообще. Любой редирект - один хрен старая ссылка навечно. Потому что если ее поменять, как делают некоторые, ВСЕ ссылки на эту страницу извне протухают.
Колхоз-шмалхоз, лично мне до лампы, как эти ссылки называются. Статьи потому что в Документации тоже статьи.

По опыту - никто нихрена явно ссылок не помнит (кроме меня), сколько ни показывай или повторяй. Работает только явное указание на разделы от корня - "зайдите сюда, ткните сюда, и вот тут оно будет". И я сам, кстати, именно так и делаю.

Конечно, я могу сделать www.ibase.ru/doc/ . Только это doc чего? ibase.ru? Firebird? Embarcadero? ibase.com.tw?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072680
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> Потому что если ее поменять, как делают некоторые,
kdv> ВСЕ ссылки на эту страницу извне протухают.

ЯННП. Что протухает, если старая ссылка
(адрес) редиректится на новую страницу?

> Конечно, я могу сделать www.ibase.ru/doc/ .
> Только это doc чего? ibase.ru? Firebird?

ibase.ru конечно. Щас он чего develop Документация ?


P.S. В общем, если не надо - и хрен с ним.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072683
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

ок, тогда сделаем шаг назад.
Документация находится по ссылке /develop/, а надо чтобы /doc/ или /documentation/. Это чтобы что? Чтобы было красиво, или ...?
У меня механизм хождения по сайтам такой - я открываю либо центральный сайт, либо сохраненную ссылку внутрь сайта.
И мне до лампочки как там называются ссылки, если я тыкаю в страницы.
Поэтому я вот этой мысли про "красивый редирект" не очень понимаю.

Просто вот пример. Была статическая страница ibase.ru/gbak.html (или htm, уже не помню). При переводе на динамику ее сделали
ibase.ru/gbak/. Однако, понятно, на куче сайтов есть старые ссылки на gbak.html. Делаем редирект, с gbak.html на /gbak/, чтобы не выдавало 404
(в конкретном примере данный редирект куда-то пропал, х.з. по чему, надо перепроверять все редиректы).

Так. Теперь, делаем редирект с несуществующего /doc/ на существующий /develop/ (или как?). Теперь у нас ДВЕ ссылки, которые - одна уже массово расползлась (старая), и новая, которая будет расползаться. Допустим, меняем физически - /doc/ существует а /develop/ стал редиректом. Но /develop/ все равно будет существовать на туче внешних сайтов, еще хрен знает сколько лет.
То есть, красота не спасает мир. И зачем тогда это всё?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072692
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@kdv, а чего боятся редиректов? Главное чтобы были обоснованные.
Можно просто в нгинксе сделать отдельный от сайта резолвер с большим списком если не находит изначально линк.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072696
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На статьи ibase часто ссылаются, лучше не трогать. А то будет как с microsoft.com: сколько не находишь на форумах ссылок на материалы, чуть более старые всегда ведут в "пустоту".
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072708
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
avp_,
Чем не устраивает стандартный SNAPSHOT?


Т.е. если у меня на странице 10 читающих запросов, то при её построении будет запущено и закоммичено 10 снапшотных пишущих транзакций? Флаг read_only однако полезно было бы по дефлоту использовать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072710
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25.05.2021 12:54, avp_ пишет:
> Флаг read_only однако полезно было бы по дефлоту использовать.

кто мешает использовать его НЕ по дефолту?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072717
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_Т.е. если у меня на странице 10 читающих запросов, то при её построении будет запущено и
закоммичено 10 снапшотных пишущих транзакций?

Нет, только если ты сделаешь идиотскую схему "каждому запросу отдельную транзакцию".

avp_Флаг read_only однако полезно было бы по дефлоту использовать.

Любая транзакция по дефолту read_only пока ничего не записала.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072718
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При попытке явного управления из статьи выдаёт странную ошибку:
Код: php
1.
2.
3.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true]);
$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED NO WAIT");


Код: plaintext
1.
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 61 WAIT
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072720
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не управляй транзакциями через SQL, для этого есть методы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072721
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Нет, только если ты сделаешь идиотскую схему "каждому запросу отдельную транзакцию".

Почему? Autocommit же по умолчанию включен?

Dimitry Sibiryakov

Любая транзакция по дефолту read_only пока ничего не записала.

Это больше из соображений гигиены. Зачем куче читающих запросов давать потенциально пишущую транзакцию?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072722
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

ещё раз спрашиваю. Чем это плохо?
В Firebird 3.0 счётчик транзакций довольно большой, так что лишний старт транзакции ничем не грозит.
Если вам надо стартовать одну транзакцию на несколько запросов, то это можно сделать только явно.

Опять же не вижу причин использовать другие уровни изолированности и READ ONLY. Дело в том что в PHP транзакции долго не живут. В том смысле, что они не живут вечно. Транзакция в любом случае будет завершена после смерти php скрипта.

Это тебе не Дельфи где открыл грид, он отфетчил 500 записей из миллиона и держит транзакцию активной, пока любо приложение не завершили, либо грид не закрыли.

Даже если вам всё-таки потребовалось использовать транзакции с параметрами отличными от умолчательных, я показал как это можно сделать. Сам по себе голый PDO не удобно использовать, поэтому вы можете написать свою обёртку вокруг него и использовать такие транзакции какие захотите.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072723
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_Autocommit же по умолчанию включен?

С этим - к PHP. У Firebird он по молчанию выключен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072725
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_
При попытке явного управления из статьи выдаёт странную ошибку:
Код: php
1.
2.
3.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true]);
$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED NO WAIT");


Код: plaintext
1.
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 61 WAIT


а вот это я могу глянуть, как время появится
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072728
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

в принципе можно допилить драйвер так чтобы можно было в атрибутах соединения задавать параметры транзакции по умолчанию.

Вот только делать это долго и муторно. Опять лезть и разбираться в ужасном сишном коде, брррр. Последний раз туда год назад заглядывал.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072733
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВ Firebird 3.0 счётчик транзакций довольно большой, так что лишний старт транзакции ничем не грозит.
В 3.0 - да, но ... высокая частота старта транзакций = нагрузка на header page, а значит появление тормозов на блокировке к единственной странице.
Собственно, еще на ИБ 5.6 "чинил" одну базу - там веб-приложение, и разраб сделал формирование веб-страницы в одной транзакции (вытаскивание элементов из базы). Потом или другой пришел, или этому что стукнуло, и типа автокоммита включил или неявных транзакций.
И ... за неделю кончился счетчик транзакций. Не 2млрд, как должно быть, а из-за бага 5.6 с размером страницы там было где-то в 8 раз меньше. Но тем не менее.

Еще видел однопользовательское приложение, которое каким-то образом фигачило по 500 тыщ транзакций в день.
Проработало три года, доехало до 500млн транзакций, TIP стал размером 130 мегабайт (вся база была где-то 600мб). Зачем такое надо?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072739
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvTIP стал размером 130 мегабайт (вся база была где-то 600мб).

Лет 10-15 назад я предлагал освобождать старые TIP, но всем лень.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072743
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv
Симонов ДенисВ Firebird 3.0 счётчик транзакций довольно большой, так что лишний старт транзакции ничем не грозит.

В 3.0 - да, но ... высокая частота старта транзакций = нагрузка на header page, а значит появление тормозов на блокировке к единственной странице.
Очень интересно! Сейчас как раз воюю со случайными затормаживаниями старта транзакций (на 2-4 сек!) при частоте ~ 80 тр/сек. Не с этим ли связано?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072748
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тормоза на 2-4 секунды могут дать только триггера с обращениями к таблицам мониторинга.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072754
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Тормоза на 2-4 секунды могут дать только триггера с обращениями к таблицам мониторинга.

Триггер на транзакцию есть, но там просто проверка параметров. 2-3 Rdb$Get_Context и сравнений.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072756
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> Так. Теперь, делаем редирект с несуществующего /doc/
kdv> на существующий /develop/ (или как?)

Ниаборот! (с)


kdv> Но /develop/ все равно будет существовать на туче
kdv> внешних сайтов, еще хрен знает сколько лет.
kdv> То есть, красота не спасает мир. И зачем тогда это всё?

Да, нехай будет как есть.
И так сгодится. (с)
Так и живём.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072818
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я просто сделаю так
Код: php
1.
$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);


то как работать в таком режиме?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072821
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_как работать в таком режиме?

"В соответствии с документацией" не предлагать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072850
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

"В соответствии с документацией" не предлагать?..


При снятии режима autocommit первый же запрос даёт ошибку:

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -901 Dynamic SQL Error SQL error code = -901 invalid transaction handle (expecting explicit transaction start)
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072857
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы документация подействовала - её надо читать. Понюхать, полизать и на хвост нанизать
недостаточно, как мы все знаем из классики.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072924
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

а нельзя всё-таки начать читать
http://www.ibase.ru/files/articles/firebird_examples/how_to_create_application_firebird_php.pdf
с самого начала, и внимательно особенно с 12й страницы?
Раз автокоммит убран, значит транзакции надо самому стартовать и завершать.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40072943
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_
При попытке явного управления из статьи выдаёт странную ошибку:
Код: php
1.
2.
3.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true]);
$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED NO WAIT");


Код: plaintext
1.
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 61 WAIT


а какую версию PHP и firebird вы используете? У меня всё работает

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
try {
  $sql = <<<'SQL'
SELECT
    T.MON$TRANSACTION_ID AS TRANSACTION_ID,
    T.MON$TIMESTAMP AS START_DATE,
    TRIM(CASE
      WHEN T.MON$ISOLATION_MODE = 0 THEN 'CONSISTENCY'
      WHEN T.MON$ISOLATION_MODE = 1 THEN 'CONCURRENCY'
      WHEN T.MON$ISOLATION_MODE = 2 THEN 'READ COMMITTED RECORD VERSION'
      WHEN T.MON$ISOLATION_MODE = 3 THEN 'READ COMMITTED NO RECORD VERSION'
      WHEN T.MON$ISOLATION_MODE = 4 THEN 'READ COMMITTED READ CONSISTENCY'
    END) AS ISOLATION_MODE,
    TRIM(CASE
      WHEN T.MON$LOCK_TIMEOUT = -1 THEN 'Infinite wait'
      WHEN T.MON$LOCK_TIMEOUT = 0 THEN 'No wait'
      WHEN T.MON$LOCK_TIMEOUT > 0 THEN 'Timeout ' || MON$LOCK_TIMEOUT
    END) AS LOCK_TIMEOUT,
    TRIM(CASE
      WHEN T.MON$READ_ONLY = 1 THEN 'READ'
      ELSE 'READ WRITE'
    END) AS READ_ONLY,
    (T.MON$AUTO_COMMIT = 1) AS AUTO_COMMIT,
    (T.MON$AUTO_UNDO = 1) AS AUTO_UNDO
FROM MON$TRANSACTIONS T  
WHERE T.MON$TRANSACTION_ID = CURRENT_TRANSACTION
SQL;  
	
  $db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
  $db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
  $db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED RECORD_VERSION NO WAIT");
  $query = $db->prepare($sql);
  $query->execute();
  $row = $query->fetchObject();
  $query->closeCursor();
  $db->exec("COMMIT");
  echo '<pre>';
  var_dump($row);
  echo '</pre>';
}
catch(Throwable $e) {
	echo $e->getMessage();
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
object(stdClass)#3 (7) {
  ["TRANSACTION_ID"]=>
  int(34418)
  ["START_DATE"]=>
  string(19) "2021-05-25 23:06:51"
  ["ISOLATION_MODE"]=>
  string(29) "READ COMMITTED RECORD VERSION"
  ["LOCK_TIMEOUT"]=>
  string(7) "No wait"
  ["READ_ONLY"]=>
  string(4) "READ"
  ["AUTO_COMMIT"]=>
  bool(false)
  ["AUTO_UNDO"]=>
  bool(true)
}

Нормально PDO с Firebird можно использовать начиная с PHP 7.4, в предыдущих версиях было полно багов. Я сам штуки 4 пофиксил.
А в 8.0 ещё одну.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40073225
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

а какую версию PHP и firebird вы используете? У меня всё работает

самый свежи php 8.0.6
FB2.0.7 диалект 1
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40073226
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
avp_,
а нельзя всё-таки начать читать
http://www.ibase.ru/files/articles/firebird_examples/how_to_create_application_firebird_php.pdf
с самого начала, и внимательно особенно с 12й страницы?
Раз автокоммит убран, значит транзакции надо самому стартовать и завершать.

Всё это прочитано, но толком не понято. Просто по своему названию "AUTOCOMMIT" следует думать что он влияет только на алгоритм коммита.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40077360
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
я тут писал как задавать уровень изолированности транзакции

https://habr.com/ru/post/317458/



Как - писал, а зачем - нет.

Всё это было не раз и к сожаленью
Всё повторится, всё повторится,
Я только время поменяю и лица...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40078621
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появились ещё вопросы:
1. Почему тип дата-время возвращается строкой, а не объектом DateTime ?

2. Верно ли я понимаю что блобы попавшие в выборку автоматически целиком загружаются при каждом фетче?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40078632
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

1. потому что в PHP DateTime кастрированный. Посмотри его диапазон значений и сравни с диапазоном в Firebird.
2. верно, хотя кое что можно было бы докрутить
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40108999
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, но такой запрос вызвает падение процесса php:
Код: php
1.
$db->exec("select RDB\$SET_CONTEXT('USER_SESSION', 'TEST', 1) from rdb\$database");


В то время как через prepare - выполняется.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111094
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно биндить параметры имеющие тип дата-время?
При попытке передать строкой выдаёт ошибку "General error: -804 Dynamic SQL Error SQL error code = -804 Incorrect values within SQLDA structure"
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111103
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

пример кода дашь, что ты делаешь, тогда может и подскажу
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111121
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, косяк бы в другом - при пропущенном параметре странное сообщение об ошибке.
Но небольшой вопрос остаётся - почему нельзя в параметр записать тип php DateTime а надо преобразовывать в строку понимаемую сервером.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111167
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

Отвечал уже. Посмотри какой диапазон дат поддерживает пыховский тип и какой фб
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111169
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще странно что все пытаются напрямую голый пдо юзать. Ну напишите вы обертку вокруг него которая будет нужные вам преобразования делать
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40111520
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Вообще странно что все пытаются напрямую голый пдо юзать. Ну напишите вы обертку вокруг него которая будет нужные вам преобразования делать

А что такого в голом pdo? Всё вроде пока устраивает кроме работы с датами. Обёртку писать только ради них как то лениво.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133563
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выявил некоторые странности при работе с транзациями через PDO.

1. Если установлен PDO::ATTR_AUTOCOMMIT=> true, то автокоммит делается не после каждого запроса, а только после каждого МОДИФИЦИРУЮЩЕГО запроса. Как он определяет что запроса модифицируюций - х.з. Наступил на грабли когда в цикле опрашивал таблицу селектами, а транзация по дефлоту снапшот и не коммитилась.

2. Если установлен PDO::ATTR_AUTOCOMMIT=> true, то в блоке между PDO::beginTransaction и PDO::commit автокоммит всё равно работает для модифицирующих операторов. Вот это весьма странно. Т.е. в этом случае beginTransaction нельзя использовать.

3. Если установлен PDO::ATTR_AUTOCOMMIT=> false, то без без beginTransaction ни один оператор не сработает, даже селект. Также если не было нигде commit, то при окончании скрипта транзакция откатывается. Вроде бы логично. Но непонятно тогда что в случае если в скрипте были только чтения - тоже роллбэк будет?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133564
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автокоммит - ЗЛО
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133599
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
автокоммит - ЗЛО


Это да. Но как то неохота в конце каждого скрипта вставлять $db->commit(); Хотя может оно будет и правильно...
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133631
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
автокоммит - ЗЛО

ой, люто плюсую...

зы
лет пять назад понадобилось из golang в fb ходить, решение которое было на тот момент (по моему до сих пор другого не появилось) использовало параметры транзакции как в fb/ib по умолчанию повелось, стартует транзакция по умолчанию (не php, висеть долго будет), отдельно можно стартануть транзакцию, но параметры ей задать нельзя (на тот момент)...
пришлось выкручиваться - прикрутили параметры транзации в параметры соединения, так и жевет это по сей день с двумя пулами коннетов - на чтение и на запись ))
костыль? еще какой!
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40133778
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема то в том что по умолчанию автокоммит включен.
Итого пока остановился на такой схеме работы:
1. PDO::ATTR_AUTOCOMMIT=> false
2. создаём базу $db = new PDO(....)
3. сразу затем вызываем $db->beginTransaction();
4. С помощью register_shutdown_function регистрируем функцию которая делает $db->commit();
Итого все скрипты работают в одной транзакции которая автокоммитится при завершении. Для особых случае планируется сделать доп. флаг: aвтокоммит/автороллбэк.
5. Ещё желательно сделать какой то флаг чтобы скрипт явно декларировал потребность в rw транзакции и чтобы по дефлоту транзакция была read_only.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135203
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то никак у меня не запускаются транзакции вручную:
Код: php
1.
2.
$db = new PDO($dbname, $dbuser, $dbpass,  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  PDO::ATTR_PERSISTENT => true, PDO::ATTR_AUTOCOMMIT=> false]);
$db->exec("SET TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED RECORD_VERSION NO WAIT");  



Выдаёт ошибку:
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: PDO->exec('SET TRANSACTION...')

Пробовал FB2.0-2.5, диалекты 1,3 - нигде не получается.
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135222
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp_,

версия php какая?
...
Рейтинг: 0 / 0
PDO Firebird bugs
    #40135298
avp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8.0.6
...
Рейтинг: 0 / 0
222 сообщений из 222, показаны все 9 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PDO Firebird bugs
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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