Персональный сайт Александра Литовченко

номер32
Поиграть в преферанс в онлайне
6 июля 2008 04:54

Qt4 + PostgreSql = WTF?

Посылаю разработчикам Trolltech луч острой диареи. Конкретнее разработчику PSQL драйвера для QtSql. За что? Да, как выяснилось есть за что. Ситуация следующая. PyQt4.4 + PostgreSql8.3. QSqlQueryModel работает. QSqlTableModel - НЕ работает. На совершенно валидную setTable() у него видите-ли Unable to find this table. Включаем подробный лог сервера и что же мы видим? Для определения атрибутов таблицы используется следующий запрос:

select 
    pg_attribute.attname, 
    int(pg_attribute.atttypid), 
    pg_attribute.attnotnull, pg_attribute.attlen, 
    pg_attribute.atttypmod, 
    int(pg_attribute.attrelid), 
    pg_attribute.attnum from pg_class, 
    pg_attribute where lower(pg_class.relname) = 'tablename' and 
        pg_attribute.attnum > 0 and 
        pg_attribute.attrelid = pg_class.oid;

Секундочку. Но ведь приведение типов вида int(x) из постгреса убрали в прошлом тысячелетии на рубеже шестерки и семерки, заменив синтаксис на x::int. Как же так? Это получается что драйвер вообще нерабочий и никто этого так и не заметил?

Лезем в исходники qsql_psql.cpp (в конце концов у нас Open Source или где?) и начинаем даже не плакать, а рыдать в голос. Эти деятели определили версию сервера и накатали switch в котором что-то вроде:

case QPSQLDriver::Version6: // генерация запроса c int(x)
break;
case QPSQLDriver::Version7: // генерация запроса c x::int
case QPSQLDriver::Version71: 
case QPSQLDriver::Version8: 
case QPSQLDriver::Version81: 
case QPSQLDriver::Version82: 
break;

Version83 в нем по понятным причинам нету. Тут выкатывается честное предупреждение о том что версию мол не знаю но работать как-то буду, и под звук фанфар подставляется вариант самого древнего скрипта, который на современных постгресах конечно же нерабочий. Причем под «современными» подразумеваются сервера младше 10 лет.

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

В результате у прикладных разработчиков, используюзих связку Qt44+PostgreSQL83 остается три варианта:

  • Откатиться на PostgreSQL 8.2
  • Отказаться от использования высокоуровневых классов получающих метаинформацию о таблицах
  • Самостоятельно пропатчить Qt
  • Ждать когда разработчика драйвера посетит муза и он исправит это недоразумение включив его в очередной апдейт Qt

 

Комментарии

1 25 сентября 2008 14:55, Олег

Кажется все :)
http://trolltech.com/developer/task-t...

2 27 сентября 2008 02:51, avl

Угу. Все. То нужно еще посмореть как именно они поправили (мне лень) и не ожидает ли подобная песня нас для PostgreSQL 8.4,5,6,... :)

Добавить комментарий

только текст. HTML теги вырезаются:

Пожалуйста будьте вежливы при общении