Название: Как подключить родную библиотеку в свою
Отправлено: 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 работают запросы вида: qsqlite4 успешно пересобирается и моя функция работает в запросах. Вопрос в том, как вынести это в отдельную библиотеку, чтобы уже она дёргала родной qsqlite4 и его не требовалось пересобирать. А наращивать функционал можно было в самой этой библиотеке
Название: Re: Как подключить родную библиотеку в свою
Отправлено: lit-uriy от Июль 22, 2013, 15:47
нужно сделать свой драйвер (http://www.doc.crossplatform.ru/qt/4.6.x/sql-driver.html#how-to-write-your-own-database-driver)
|