|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, если исправишь будет здорово. А то приходится для Fb3 обходные пути искать. Там есть ещё один недостаток, который проявляется во всех версиях. Предварительный парсер, который вычленяет именованные параметры, делает это везде даже там где не надо. Из-за чего EXECUTE BLOCK наворачивается медным тазом. Вот если бы этот парсер был более умным и искал именованные параметры для EB только во входных параметрах EXECUTE BLOCK [(<params>)] и остальное тело не трогал было бы здорово. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2016, 13:54 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Денис, Я так, не профи в C, VC14, но впервые, после танцем с бубном и много методом тыка, за день, получилось. Если здесь есть кто-то более продвинут в C, то могу помочь со сборкой, дебагингом и тестингом, и структурами данных в PHP коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2016, 14:08 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Посмотрел насчет баги 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 :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2016, 22:01 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, давай конкретные куски кода - поможем ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2016, 23:52 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Влад, порядок такой: 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? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 12:26 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociНужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2? Её нужно хоть как-то инициализировать. Ясно же пишется: "empty pointer to data", то есть sqldata == NULL. Полученные данные куда клиент должен складывать? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 13:18 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dimitry, да, спасибо, нашел косяк. Там точно &S->out_sqlda->sqlvar[0]->sqldata = NULL Тоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2. Мысль уловил, копаем дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 13:44 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Ура! Работает! Там если бы был просто C. А такой стиль в драйвере, логика кодирования и организация структур что пипец. Ну.. в общем буду еще тестировать, полировать, упаковывать, и потом открою пулл реквест в PHP мастер. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 14:18 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, Надо бы проверить что ничего старого не сломалось. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 14:24 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
rdb_dev, это я так, образно писал, дебагером смотрел, никакое присвоение Денис, тестировал несколько примеров, все ок, и простые селеты, и даже returning id, name. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 14:32 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Кстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :) Слышал что процедурный стиль щас обертка над обьектным... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 14:37 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcociа как там обьектый API в FB3? Взяли старые функции, без применения мозга и фантазии сгруппировали по классам на основе первого хэндла в списке параметров. Всё. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 14:43 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociКстати, а как там обьектый API в FB3? готовый к продакшине? есть примеры? Эээх как щас перепишу драйвер :) Примеры есть, но переписывать не стоит. Не надо ломать совместимость с 2.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 15:00 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Симонов ДенисНе надо ломать совместимость с 2.5 Я так, пошутил конечно. Сможешь тестировать под вин64 билд? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 17:49 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, смогу если билд выложишь. Я не разбирался как его компилировать ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 17:53 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Вот: https://mega.nz/#!EFwCDAjT!kVrAzT7YGPi9Aco6IEdZfR_SISenXL3swTQAYBiS2_M После распаковке, клади рядом фиребирдскую либу от тройки или чтоб движок находил ее. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 18:31 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, что-то я не пойму. Я думал ты расширение скомпилировал, а тут весь движок PHP. Ладно попробую запустить ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 22:03 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, вроде всё нормально. Проверил различные виды запросов. INSERT, INSERT ... RETURNING, SELECT, EXECUTE PROCEDURE везде результаты правильные и ничего не падает ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 22:33 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociНужно как-то out_sqlda инициализировать по другому в случае isc_dsql_execute2?Нужно указать - куда данные помещать Dorin MarcociТоесть нужно заранее приготовить буфер. Я думал что это FB делает при describe или execute2.Нет, FB клиентской памятью не управляет. В данном случае, скорее всего, память под вых пар-ры\результат выделяется перед первым фетчем. Это я к тому, куда можно посмотреть в имеющемся коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 23:30 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociУра! Работает!Поздравляю :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 23:36 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin Marcoci, надо бы ещё посмотреть нет ли утечек памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 09:35 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Денис, вроди проверял, все должно быть OK. В старой реализации шансы были больше на утечек, так как sqldata инициализировалась при firebird_stmt_describe, что было неправильно. Например fetchColumn могли бы не работать, но специально не проверял. Используется только один выходной буффер sqldata для всех записей и при firebird_stmt_dtor все освобождается. Дебаг билд кричит в конце если есть утечки, все чисто пока. Там еще до принятия в мэйнстрим проверяют каким-то валгриндом на утечек. Вот изменения: https://github.com/php/php-src/pull/2230/commits/c92ddeabdc7e40e8e0c2878bd12b96e3dff1a986 Ждем одобрения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2016, 11:01 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Насчет execute block и обработка параметров, вот что есть щас: https://gist.github.com/madorin/83300eaf3d9044bc6e56a710b3700368 new_sql - полученный результат, в хэш списке - именные параметры. Логика там простая и быстрая, но есть проколы, например не учитывает и комменты (--, /* */). Супер навороченный парсер/лексер врядли там понадобится но хочется красивое решение. Нужно в начале определить если "execute block (" и обработать до ")" с существующем алгортиме и все что после передать как есть. Надо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF. Все гики и параноики по оптимизации приветствуется :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 11:32 |
|
PDO Firebird bugs
|
|||
---|---|---|---|
#18+
Dorin MarcociНадо еще учитывать комменты, пробелы, табы и ретурны LF/CRLF. Есть ещё строковые литералы. Я не проверял, но почему-то мне кажется текущий алгоритм будет работать не правильно на вот таких запросах Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 11:43 |
|
|
Start [/forum/topic.php?fid=40&offset=1&startmsg=39356803&tid=1559821]: |
0ms |
get settings: |
4ms |
get forum list: |
7ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
34ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
0ms |
others: | 109ms |
total: | 231ms |
0 / 0 |