Автор Тема: perl+postgres, ошибка  (Прочитано 8550 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« : 03 Ноября 2009, 11:12:31 »
Всем привет, возникла проблемка...
Есть сервер Апач, на котором стоит mod_perl, есть база postgres.
На сайте есть скрипт,  который время от времени закидывает в базу данные. Так вот, если база пуста, то все проходит нормально.
Если база не пуста, т.е. данные перезаписываются, то вылазит ошибка DBD::Pg::db "array must be one-dimensional"

с чем это может быть связано?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
perl+postgres, ошибка
« Ответ #1 : 03 Ноября 2009, 13:48:03 »
с тем, что array не one-dimensional, естественно

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« Ответ #2 : 06 Ноября 2009, 11:22:18 »
английский я знаю))

в общем нашел я проблемную строчку:


$keeper->{SQL}->do("update $keeper->{documents_table} set mtime = now(), dtime = ?, sections = ?, status = ?, name = ? where id = ?", {}, $self->{dtime}, \'{\'.join(\',\', $self->sections() ).\'}\', $self->{status}, $self->{name}, $self->{id}) || do  { $keeper->error(); $keeper->{SQL}->rollback()    if ( ! $keeper->{handcommit}); return undef };


($keeper - глобальный объект, которая используется для связи с БД)

в чем тут может быть ошибка?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
perl+postgres, ошибка
« Ответ #3 : 06 Ноября 2009, 11:58:52 »
$self->sections() -- ?

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« Ответ #4 : 06 Ноября 2009, 12:21:15 »
sub sections
{
   my ($self, @sects) = @_;

   if (ref($self->{sections}) ne \'ARRAY\') { $self->{sections} = []; }
   if (@sects)  {  @{ $self->{sections} } = @sects }

   return @{ $self->{sections} };
}

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
perl+postgres, ошибка
« Ответ #5 : 06 Ноября 2009, 12:44:09 »
максимум -- return в do не используется.
а так -- ошибок не видно.

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« Ответ #6 : 06 Ноября 2009, 14:23:53 »
я вывел в логи то, что хранится в массиве. Как правило это просто число (номер секции). В какой-то момент там появляется число в фигурных скобках (например, {1511}, и выскакивает ошибка. Я так предполагаю, что тут дело в формате записи массива в postgres и perl.
откуда только эти фигурные скобки берутся, пока непонятно :(

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
perl+postgres, ошибка
« Ответ #7 : 06 Ноября 2009, 15:51:17 »
"число в фигурных скобках " -- \'{\'.join(\',\', $self->sections() ).\'}\' ?

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« Ответ #8 : 06 Ноября 2009, 15:56:22 »
как я понял, в некоторых случаях массив уже записан в фигурных скобках, т.е. фигурных скобок оказывается двое. Отсюда, вероятно, и ошибка "array must be one-dimensional"

сейчас пробую разобраться

Оффлайн Gekt0r

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
perl+postgres, ошибка
« Ответ #9 : 10 Ноября 2009, 10:51:59 »
Разобрался.
Глюк был в функции $self->sections(), соответственно, строчке

\'{\'.join(\',\', $self->sections() ).\'}\'

функция иногда возвращала данные в формате массива, с фигурными скобками, а иногда - просто как скаляр. Соответственно, когда возвращался массив, ему добавлялись еще одни фигурные скобки, откуда и возникала ошибка "array must be one-dimensional"
Исправил (:

 

Sitemap 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