From e36b17a4857da3494e05879c747373235d5b60df Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Fri, 3 May 2013 15:26:34 +0200 Subject: [PATCH] Add support for SQLite extension loading Enable the extension support in SQLite. Add code to allow loading of extension. Add menu entry for easy extension loading. --- src/MainWindow.cpp | 15 +++++++++++++++ src/MainWindow.h | 1 + src/MainWindow.ui | 32 +++++++++++++++++++++++++++++++- src/icons/icons.qrc | 1 + src/icons/plugin_add.png | Bin 0 -> 691 bytes src/sqlitedb.cpp | 24 ++++++++++++++++++++++++ src/sqlitedb.h | 3 +++ 7 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/icons/plugin_add.png diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 376844fe..6e397865 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -988,6 +988,7 @@ void MainWindow::activateFields(bool enable) ui->buttonDeleteRecord->setEnabled(enable); ui->buttonNewRecord->setEnabled(enable); ui->actionExecuteSql->setEnabled(enable); + ui->actionLoadExtension->setEnabled(enable); } void MainWindow::browseTableHeaderClicked(int logicalindex) @@ -1161,3 +1162,17 @@ void MainWindow::saveSqlFile() QFileInfo fileinfo(file); ui->tabSqlAreas->setTabText(ui->tabSqlAreas->currentIndex(), fileinfo.fileName()); } + +void MainWindow::loadExtension() +{ + QString file = QFileDialog::getOpenFileName( + this, + tr("Select extension file"), + PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(), + tr("Extensions(*.so *.dll);;All files(*)")); + + if(db.loadExtension(file)) + QMessageBox::information(this, QApplication::applicationName(), tr("Extension successfully loaded.")); + else + QMessageBox::warning(this, QApplication::applicationName(), tr("Error loading extension: %1").arg(db.lastErrorMessage)); +} diff --git a/src/MainWindow.h b/src/MainWindow.h index 660a5dd1..f81b2ce7 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -140,6 +140,7 @@ private slots: virtual void closeSqlTab(int index, bool force = false); virtual void openSqlFile(); virtual void saveSqlFile(); + virtual void loadExtension(); }; #endif diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 2db2299f..d734103d 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -292,7 +292,7 @@ 0 0 - 278 + 763 444 @@ -802,6 +802,7 @@ + @@ -1292,6 +1293,18 @@ Save SQL file + + + false + + + + :/icons/load_extension:/icons/load_extension + + + Load extension + + @@ -2024,6 +2037,22 @@ + + actionLoadExtension + activated() + MainWindow + loadExtension() + + + -1 + -1 + + + 399 + 299 + + + fileOpen() @@ -2069,5 +2098,6 @@ openSqlTab() openSqlFile() saveSqlFile() + loadExtension() diff --git a/src/icons/icons.qrc b/src/icons/icons.qrc index 16609383..b06c6158 100644 --- a/src/icons/icons.qrc +++ b/src/icons/icons.qrc @@ -28,6 +28,7 @@ resultset_next.png page_save.png page_white_database.png + plugin_add.png oldimages/128.png diff --git a/src/icons/plugin_add.png b/src/icons/plugin_add.png new file mode 100644 index 0000000000000000000000000000000000000000..ae43690ecefe7952ef9b0a410614d014299bd3c0 GIT binary patch literal 691 zcmV;k0!;mhP)!C{kgV#7nZ!}+IFwq-SXfjo|dBU;$2A*R+N`fo=|&GUYL?n@~UJ} zRwmI}jPAB8^01Y3C+^Ijd+pCXe>~g?4Jqg4)T#41=X}pOfxGiRR{6W&>CB0&nI=@t zRrSu<^!c5C0)&<(_cUQ7TI*VgHN*l@P5-TfC4f_@-VY11P%L?g;zAJ-8T%U`aCgp( zo^&%s)zGr{_QtkAOc?cV zQv@Ya7h%t}T`nSsD7Oy`1i{aDaBT3P$D8A1r!%M-=8CwXt~6AISyR6jGsiIoM;>tZ z&|vV(9f&CEifGyEVzQcIGxNN8`GVQmBE|UvZp9xX9KCnIMU)jaD^N2^UMg#1ikMNI zccRNH*tm5QYno!*e}0qU>_gJsE$2etD<@XAvnsrb$ z6AdYytGA&+iFC(ifFqRvB@qNA^X?fNqMb~-l0^}rXPZ}>v4 Z=Nr{rY9&UI$M^sM002ovPDHLkV1hoZLv;WE literal 0 HcmV?d00001 diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index a553d5af..b0f2d8b0 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -81,6 +81,9 @@ bool DBBrowserDB::open ( const QString & db) } curDBFilename = db; } + + // Enable extension loading + sqlite3_enable_load_extension(_db, 1); } return ok; @@ -1009,3 +1012,24 @@ bool DBBrowserDB::setPragma(const QString& pragma, int value, int& originalvalue } return false; } + +bool DBBrowserDB::loadExtension(const QString& filename) +{ + // Check if file exists + if(!QFile::exists(filename)) + { + lastErrorMessage = QObject::tr("File not found."); + return false; + } + + // Try to load extension + char* error; + if(sqlite3_load_extension(_db, filename.toUtf8(), 0, &error) == SQLITE_OK) + { + return true; + } else { + lastErrorMessage = QString::fromUtf8(error); + sqlite3_free(error); + return false; + } +} diff --git a/src/sqlitedb.h b/src/sqlitedb.h index 6b0f6e30..c7b0ae9a 100644 --- a/src/sqlitedb.h +++ b/src/sqlitedb.h @@ -108,6 +108,9 @@ public: bool setPragma(const QString& pragma, const QString& value); bool setPragma(const QString& pragma, const QString& value, QString& originalvalue); bool setPragma(const QString& pragma, int value, int& originalvalue); + + bool loadExtension(const QString& filename); + sqlite3 * _db;