Russian Qt Forum
Сентябрь 30, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Расширение функциональности драйвера QSQLiteDriver  (Прочитано 9617 раз)
kandrey
Гость
« : Январь 25, 2014, 10:48 »

Есть необходимость использовать некоторые функции sqlite клиента из sqlite3.h
Можно ли унаследовать QSQLiteDriver или надо полностью реализовывать интерфейсы QSqlDriver и QSqlResult ?
Подскажите, плз, у кого есть опыт.
« Последнее редактирование: Январь 25, 2014, 13:11 от kandrey » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 25, 2014, 10:57 »

Есть необходимость использовать некоторые функции sqlite клиента из sqlite3.h
Можно ли унаследовать QSQLiteDriver или надо полностью реализовывать интерфейсы QSqlDriver и QSqlResult ?
Подскажите, плз, у кого есть опыт.
Может хватит возможности получить хендл базы и дергать нужные функции sqlite?
Посмотрите на
QVariant QSqlDriver::handle () const [virtual]

В описании есть пример получения.
Записан
kandrey
Гость
« Ответ #2 : Январь 25, 2014, 11:03 »

может быть,..
дескриптор sqlite3* удалось получить, а как через него вызвать функцию sqlite ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Январь 25, 2014, 11:04 »

может быть,..
дескриптор sqlite3* удалось получить, а как через него вызвать функцию sqlite ?
Подключаете нужные хедеры (точней там один хедер) и вызываете.
Записан
kandrey
Гость
« Ответ #4 : Январь 25, 2014, 11:08 »

sqlite3.h я подключил
а можно пример, вот мне нужен вызов
const char *sqlite3_column_table_name(sqlite3_stmt*,int)
и как получить указатель на sqlite3_stmt ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 25, 2014, 11:18 »

sqlite3.h я подключил
а можно пример, вот мне нужен вызов
const char *sqlite3_column_table_name(sqlite3_stmt*,int)
и как получить указатель на sqlite3_stmt ?
int sqlite3_prepare(      sqlite3* db, const char* sql, int sql_len,
                              sqlite3_stmt** stmt_ref, const char** tail );
int sqlite3_prepare16(    sqlite3* db, const void* sql, int sql_len,
                              sqlite3_stmt** stmt_ref, const char** tail );
int sqlite3_prepare_v2(   sqlite3* db, const char* sql, int sql_len,
                              sqlite3_stmt** stmt_ref, const char** tail );
int sqlite3_prepare16_v2( sqlite3* db, const void* sql, int sql_len,
                              sqlite3_stmt** stmt_ref, const char** tail );
Записан
kandrey
Гость
« Ответ #6 : Январь 25, 2014, 11:29 »

undefined reference to `sqlite3_prepare'

у меня бинарная сборка qt 5.2.0, sqlite подключается видимо как плагин
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Январь 25, 2014, 11:40 »

undefined reference to `sqlite3_prepare'

у меня бинарная сборка qt 5.2.0, sqlite подключается видимо как плагин
Можно руками подключить sqlite в свой проект.
Записан
kandrey
Гость
« Ответ #8 : Январь 25, 2014, 11:51 »

я вот так добавил

SOURCES += main.cpp\
        widget.cpp \
        C:/Qt/Qt5.2.0/5.2.0/Src/qtbase/src/3rdparty/sqlite/sqlite3.c

HEADERS  += widget.h \
        C:/Qt/Qt5.2.0/5.2.0/Src/qtbase/src/3rdparty/sqlite/sqlite3.h

это правильно?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Январь 25, 2014, 11:58 »

это правильно?
Да.
Записан
kandrey
Гость
« Ответ #10 : Январь 25, 2014, 11:59 »

Большое спасибо.
Записан
kandrey
Гость
« Ответ #11 : Январь 25, 2014, 12:37 »

Что то не ладится. Делаю так

            sqlite3_stmt *stmt;
            const char *tail;
            sqlite3_prepare_v2(handle, "select 1", -1, &stmt, &tail);

и sqlite3_prepare_v2 валится на вызове sqlite3_mutex_enter

Записан
Serr500
Гость
« Ответ #12 : Январь 25, 2014, 14:37 »

я вот так добавил

SOURCES += main.cpp\
        widget.cpp \
        C:/Qt/Qt5.2.0/5.2.0/Src/qtbase/src/3rdparty/sqlite/sqlite3.c

HEADERS  += widget.h \
        C:/Qt/Qt5.2.0/5.2.0/Src/qtbase/src/3rdparty/sqlite/sqlite3.h

это правильно?
Нет.

Что то не ладится. Делаю так

            sqlite3_stmt *stmt;
            const char *tail;
            sqlite3_prepare_v2(handle, "select 1", -1, &stmt, &tail);

и sqlite3_prepare_v2 валится на вызове sqlite3_mutex_enter
Так и должно быть. Именно потому, что предыдущее неправильно. Почему это не работает - сложно сказать. Какие-то побочные эффекты от дублирования кода в проекте и плагине. Возможно, разные распределители памяти, возможно, разные значения внутренних переменных.

Один хороший программист (мой знакомый) использует следующее решение. Перекомпилировал плагин sqlite так, чтобы он работал с библиотекой sqlite3.dll. Затем ресолвит из этой dll нужные ему функции и использует где необходимо. Всё работает.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Январь 25, 2014, 14:53 »

Нет.
Хотелось бы узнать причину неправильности?
Записан
Serr500
Гость
« Ответ #14 : Январь 25, 2014, 14:57 »

Компиляция sqlite3.dll из amalgamation (GCC/MinGW):
Код:
gcc -O2 -s -fno-keep-inline-dllexport -static-libgcc -mthreads -fexceptions -shared -Wl,--out-implib,libsqlite3.a -o sqlite3.dll sqlite3.c

Компиляция плагина с динамической библиотекой sqlite3.dll (Windows, MinGW):
Код:
cd %QTDIR%\src\plugins\sqldrivers\sqlite
qmake "INCLUDEPATH=%SQLITE_DIR%" "LIBS+=-L%SQLITE_DIR% -lsqlite3"
mingw32-make
Затем кидаем плагины в папку %QTDIR%\plugins\sqldrivers, а sqlite3.dll - в %QTDIR%\bin.

Ресолвим имена:
Код:
typedef int (*pf_sqlite3_open16)(const char*, sqlite3**);
pf_sqlite3_open16 f_sqlite3_open16 = NULL;

QLibrary sqlite3_dll("sqlite3");
if (sqlite3_dll.load()) {
    f_sqlite3_open16 = reinterpret_cast<pf_sqlite3_open16>(sqlite3_dll.resolve("sqlite3_open16"));
}
Далее используем как обычную функцию.

Хотелось бы узнать причину неправильности?
Почему это не работает - сложно сказать. Какие-то побочные эффекты от дублирования кода в проекте и плагине. Возможно, разные распределители памяти, возможно, разные значения внутренних переменных.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.