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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

Dorin Marcoci,

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

    Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

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


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


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

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

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

    запросы с returning возвращают isc_info_sql_stmt_exec_procedure
    15 дек 16, 13:16    [20006762]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7   вперед  Ctrl      все
    Все форумы / Firebird, InterBase Ответить