QTDS Plugin + MinGW |
Здравствуйте, гость ( Вход | Регистрация )
QTDS Plugin + MinGW |
SABROG |
9.7.2009, 11:36
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
История такая. Компилю FreeTDS в MSYS. Чтобы компилилось исправляю файлик tds_sysdep_public.h include папке на такой:
Собираю так:
Затем собираю тестовый пример:
Таким образом:
В 2008 году он работал. Теперь не работает пока не исправлю так:
Судя по коду в FreeTDS эта инициализация и так должна происходить сама: dbinit() -> dblib_get_tds_ctx(void) -> tds_alloc_context(&g_dblib_ctx) -> winsock_initialized() ->:
Ну да ладно. Дальше я делаю следующее. Исправляю файл tds.pro так:
Это позволит собрать FreeTDS на gcc и не использовать мелкософтовскую либу NTWDBLIB. В файле %QTDIR%\src\sql\drivers\tds\qsql_tds.cpp объявить переменную Q_USE_SYBASE, что позволит собирать плагин используя FreeTDS, а не MS:
Далее комментируем в файле %QTDIR%\src\sql\drivers\tds\qsql_tds.cpp это:
Опять же, чтобы не MS либу юзать. Потом иду в папку %QTDIR%\src\plugins\sqldrivers\tds и выполняю команду
Потом я накатал пример (в аттаче), чтобы законнектится. Программа либо крашится, либо выводит сообщение:
Эту же ошибку я получал в первом тестовом примере, когда не вызывал WSAStartup. Прописывал этот метод и в main.cpp своей программы и в плагине. Попеременно пересобирая. Один раз удалось нормально подключиться к базе данных и увидеть записи. В очередные разы уже не повезло. Не знаю почему. Есть мысли у кого по этому поводу? Сообщение отредактировал SABROG - 9.7.2009, 21:00
Прикрепленные файлы
|
|
|
ViGOur |
9.7.2009, 12:39
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Честно говоря добавление WSA в код попахивает шаманством, но раз ты так делаешь, то почему 1 версия протокола, а не 2?
Но по моему лучше обрабатываnь dbinit на ошибки: еще лучше получить код ошибки c описанием... И от этого уже смотреть стоит плясать с бубном или все же что-то не так и что-то нужно добавить или исправить.
Сообщение отредактировал ViGOur - 9.7.2009, 12:39 |
|
|
SABROG |
9.7.2009, 13:13
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Шаманство полюбому, просто увидел в своем блоге комментарий и решил поробовать. Но сейчас решил почитать это: http://www.freetds.org/userguide/samplecod...PLECODE.CONNECT
Убрал WSAStartup и написал реализацию методов:
Простой пример заработал. Расстраивает то, что насколько я помню по коду должен существовать default handler, но похоже он не работает как надо. Теперь думаю как исправить плагин qsql_tds.cpp, чтобы всё работало, расстраивает тот факт, что я четко вижу, что хэндлеры ставятся:
В чем же тогда отличае... --- Еще вот такое получаю прежде чем он выведет данные из таблицы:
Причем создал файлик freetds.conf с таким содержимым:
А ошибка таже. --- Хмм, прописал переменную окружения:
Ошибка пропала. Причем файлик лежит в той же папке, что и exe. Вот мне интересно как такое для плагина провернуть. Должны быть какие-то методы отключения этой хрени. --- Решил для эксперимента прописать переменную окружения FREETDSCONF перед запуском программы на Qt в консоли и кинул freetds.conf файлик к программе. В итоге сначала получил ошибку типа connection failed (не тот пароль указал), потом ничего не получил (задал несуществующую базу данных), а затем получил в таблице просто список столбцов таблицы бд без единой записи. При каждой ошибке (даже не критичной), программа завершается. Т.е остается косяк с тем как плагин ставит свои хэндлеры, почему программа завершается не ясно. И вторая проблема с тем почему нет ни одной записи, только имена столбцов. --- Почитав документацию пришел к выводу, что установка хэндлеров должна происходить после dbinit(), однако в qsql_tds.cpp драйвере это происходит чуть ли не в конструкторе. Перенес хэндлеры в bool QTDSDriver::open(). Ошибки начались ловится как надо. Однако вылезло такое:
Манипуляции с freetds.conf ник чему не приводят. Это не ошибка и список колонок я вижу, но данных все еще нет. --- Причем косяк с отображением данных явно не в примере, т.к. с драйвером ODBC всё работает. Сообщение отредактировал SABROG - 9.7.2009, 15:06 |
|
|
Текстовая версия | Сейчас: 28.3.2024, 11:52 |