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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подключить родную библиотеку в свою  (Прочитано 1901 раз)
johnpion
Гость
« : Июль 21, 2013, 23:53 »

Модифицировал qsqlite4, чтобы в sql-запросах можно было использовать свои функции.

Вот пример кода:
qsql_sqlite.cpp
Код:
#include "foo.h"
...
bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts)
{
    if (isOpen())
        close();

    if (db.isEmpty())
        return false;
    bool sharedCache = false;
    int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000;
    QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';'));
    foreach(const QString &option, opts) {
        if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
            bool ok;
            int nt = option.mid(21).toInt(&ok);
            if (ok)
                timeOut = nt;
        }
        if (option == QLatin1String("QSQLITE_OPEN_READONLY"))
            openMode = SQLITE_OPEN_READONLY;
        if (option == QLatin1String("QSQLITE_ENABLE_SHARED_CACHE"))
            sharedCache = true;
    }

    sqlite3_enable_shared_cache(sharedCache);

    if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
        sqlite3_busy_timeout(d->access, timeOut);
        setOpen(true);
        setOpenError(false);

        //Подключаю свою функцию
        sqlite3_create_function(d->access, "foo", 1, SQLITE_UTF8, NULL, &fooFunction, NULL, NULL);[/color]

        return true;
    } else {
        setLastError(qMakeError(d->access, tr("Error opening database"),
                     QSqlError::ConnectionError));
        setOpenError(true);
        return false;
    }
}

foo.h
Код:
#include <QObject>
#include <QString>
#include "sqlite3.h"

void fooFunction(
        sqlite3_context *context,
        int argc,
        sqlite3_value **argv)
{
    QString resultStr;
    ...
    sqlite3_result_text(context, resultStr.toAscii().data(), resultStr.size(), SQLITE_TRANSIENT);
}

Итог: в sqliteman работают запросы вида:
Код:
SELECT foo(...)

qsqlite4 успешно пересобирается и моя функция работает в запросах. Вопрос в том, как вынести это в отдельную библиотеку, чтобы уже она дёргала родной qsqlite4 и его не требовалось пересобирать. А наращивать функционал можно было в самой этой библиотеке
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 22, 2013, 15:47 »

нужно сделать свой драйвер
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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