Ошибка в truncateTable c неправильным вызовом resetSequence

Уже исправленные репорты или принятые предложения
Закрыто
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Ошибка в truncateTable c неправильным вызовом resetSequence

Сообщение mitallast »

Собственно, ничего особого на вид - просто баг.

yii/db/CDbCommand.php:

Код: Выделить всё

/**
     * Builds and executes a SQL statement for truncating a DB table.
     * @param string $table the table to be truncated. The name will be properly quoted by the method.
     * @return integer number of rows affected by the execution.
     * @since 1.1.6
     */
    public function truncateTable($table)
    {
        $schema=$this->getConnection()->getSchema();
        $n=$this->setText($schema->truncateTable($table))->execute();
        if(strncasecmp($this->getConnection()->getDriverName(),'sqlite',6)===0)
            $schema->resetSequence($table);
        return $n;
    } 
это означает, что $table является строкой, следовательно resetSequence вызывается именно со строкой первым параметром. Однако:
yii/db/schema/sqlite/CSqliteSchema.php

Код: Выделить всё

/**
     * Resets the sequence value of a table's primary key.
     * The sequence will be reset such that the primary key of the next new row inserted
     * will have the specified value or 1.
     * @param CDbTableSchema $table the table schema whose primary key sequence will be reset
     * @param mixed $value the value for the primary key of the next new row inserted. If this is not set,
     * the next new row's primary key will have a value 1.
     * @since 1.1
     */
    public function resetSequence($table,$value=null)
    {
        if($table->sequenceName!==null)
        {
            if($value===null)
                $value=$this->getDbConnection()->createCommand("SELECT MAX(`{$table->primaryKey}`) FROM {$table->rawName}")->queryScalar();
            else
                $value=(int)$value-1;
            $this->getDbConnection()->createCommand("UPDATE sqlite_sequence SET seq='$value' WHERE name='{$table->name}'")->execute();
        }
    } 
принимает вовсе не строку, а обьект типа CDbTableSchema ;)

Видимо, имелось в виду

Код: Выделить всё

--- /var/www/yii/db/CDbCommand.php    (revision 2937)
+++ /var/www/yii/db/CDbCommand.php    (working copy)
@@ -1204,7 +1204,7 @@
         $schema=$this->getConnection()->getSchema();
         $n=$this->setText($schema->truncateTable($table))->execute();
         if(strncasecmp($this->getConnection()->getDriverName(),'sqlite',6)===0)
-            $schema->resetSequence($table);
+            $schema->resetSequence($schema->getTable($table));
         return $n;
     }
 
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: Ошибка в truncateTable c неправильным вызовом resetSeque

Сообщение mitallast »

Спасибо!

PS. Зачем-то лишний отступ добавлен. Видимо PHPStrorm пользуетесь?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Ошибка в truncateTable c неправильным вызовом resetSeque

Сообщение samdark »

Да, им и пользуюсь, но отступ просто просмотрел :)
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: Ошибка в truncateTable c неправильным вызовом resetSeque

Сообщение mitallast »

В моей команде думаем применить svn или git hooks для исходников.
В принципе, можно просто тест сделать по простой логике - diff количества табов между двумя соседними строчками не должен быть больше 1. Надо будет попробовать.
Вот только это применимо только к конкретным соглашениям - не питон все же использую, где есть нормальный coding standart.
Закрыто