Модифицировал 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 и его не требовалось пересобирать. А наращивать функционал можно было в самой этой библиотеке