я использую sqlitecipher (https://github.com/devbean/QtCipherSqlitePlugin) как плагин Qt для шифрования / дешифрования моей базы данных sqlite. ОС есть Убунту 14.04, компилятор GCC 4.9, Qt версия 5.5.1.
#include <QDebug>
#include <functional>
#include <QtSql>
struct A
{
template<typename R>
R fun(std::function<R(double&)> const& f);
double db;
};
template<typename R>
R A::fun(std::function<R(double&)> const& f)
{
return f(db);
}
template<>
void A::fun<void>(std::function<void(double&)> const& f)
{
f(db);
}
double fun(std::function<double(double)> f)
{
return f(1.1);
}
int main(int argc, char *argv[])
{
A a;
a.fun<double>([](double&)->double{return 0;});
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLCIPHER", "db");
db.setDatabaseName(db_path); // encrypted database
db.open();
QSqlQuery q(db);
q.exec("pragma key='testkey'");
bool res = q.exec("SELECT * FROM TestTable LIMIT 10"); // res == false
while (q.next()) {
qDebug() << q.value(0);
}
db.close();
return 0;
}
Я не могу расшифровать свою базу данных, если я использую std::function
в шаблонные функции (res == false
).
Если использовать db.setPassword("testkey")
вместо q.exec("pragma key='testkey'");
, я имею ошибка сегментации.
Когда я удаляю специализацию шаблонов и шаблон или заменяю std::function
с указателем на функцию расшифровка работает.
Что особенного в этой ситуации?
Наличие шаблона и его специализация убивает дешифрование после компиляции. Даже без явного использования.
Задача ещё не решена.
Других решений пока нет …