diff options
Diffstat (limited to 'Plugins/DbSqlite2')
| -rw-r--r-- | Plugins/DbSqlite2/DbSqlite2.pro | 6 | ||||
| -rw-r--r-- | Plugins/DbSqlite2/dbsqlite2.cpp | 15 | ||||
| -rw-r--r-- | Plugins/DbSqlite2/dbsqlite2.h | 7 | ||||
| -rw-r--r-- | Plugins/DbSqlite2/package.xml | 10 | ||||
| -rw-r--r-- | Plugins/DbSqlite2/queryexecutorsqlite2delete.cpp | 30 | ||||
| -rw-r--r-- | Plugins/DbSqlite2/queryexecutorsqlite2delete.h | 24 |
6 files changed, 90 insertions, 2 deletions
diff --git a/Plugins/DbSqlite2/DbSqlite2.pro b/Plugins/DbSqlite2/DbSqlite2.pro index ae58ad4..9873a39 100644 --- a/Plugins/DbSqlite2/DbSqlite2.pro +++ b/Plugins/DbSqlite2/DbSqlite2.pro @@ -14,11 +14,13 @@ TEMPLATE = lib DEFINES += DBSQLITE2_LIBRARY SOURCES += dbsqlite2.cpp \ - dbsqlite2instance.cpp + dbsqlite2instance.cpp \ + queryexecutorsqlite2delete.cpp HEADERS += dbsqlite2.h\ dbsqlite2_global.h \ - dbsqlite2instance.h + dbsqlite2instance.h \ + queryexecutorsqlite2delete.h LIBS += -lsqlite diff --git a/Plugins/DbSqlite2/dbsqlite2.cpp b/Plugins/DbSqlite2/dbsqlite2.cpp index 93871ae..f5ae6a4 100644 --- a/Plugins/DbSqlite2/dbsqlite2.cpp +++ b/Plugins/DbSqlite2/dbsqlite2.cpp @@ -1,6 +1,8 @@ #include "dbsqlite2.h" #include "dbsqlite2instance.h" #include "common/unused.h" +#include "db/queryexecutor.h" +#include "queryexecutorsqlite2delete.h" #include <QFileInfo> DbSqlite2::DbSqlite2() @@ -12,6 +14,19 @@ QList<DbPluginOption> DbSqlite2::getOptionsList() const return QList<DbPluginOption>(); } +bool DbSqlite2::init() +{ + sqlite2DeleteStep = new QueryExecutorSqlite2Delete(); + QueryExecutor::registerStep(QueryExecutor::LAST, sqlite2DeleteStep); + return true; +} + +void DbSqlite2::deinit() +{ + QueryExecutor::deregisterStep(QueryExecutor::LAST, sqlite2DeleteStep); + safe_delete(sqlite2DeleteStep); +} + Db *DbSqlite2::newInstance(const QString &name, const QString &path, const QHash<QString, QVariant> &options) { return new DbSqlite2Instance(name, path, options); diff --git a/Plugins/DbSqlite2/dbsqlite2.h b/Plugins/DbSqlite2/dbsqlite2.h index a52fc26..cdc6da7 100644 --- a/Plugins/DbSqlite2/dbsqlite2.h +++ b/Plugins/DbSqlite2/dbsqlite2.h @@ -5,6 +5,8 @@ #include "plugins/dbpluginstdfilebase.h" #include "plugins/genericplugin.h" +class QueryExecutorSqlite2Delete; + class DBSQLITE2SHARED_EXPORT DbSqlite2 : public GenericPlugin, public DbPluginStdFileBase { Q_OBJECT @@ -16,9 +18,14 @@ class DBSQLITE2SHARED_EXPORT DbSqlite2 : public GenericPlugin, public DbPluginSt QString getLabel() const; bool checkIfDbServedByPlugin(Db* db) const; QList<DbPluginOption> getOptionsList() const; + bool init(); + void deinit(); protected: Db *newInstance(const QString &name, const QString &path, const QHash<QString, QVariant> &options); + + private: + QueryExecutorSqlite2Delete* sqlite2DeleteStep = nullptr; }; #endif // DBSQLITE2_H diff --git a/Plugins/DbSqlite2/package.xml b/Plugins/DbSqlite2/package.xml new file mode 100644 index 0000000..1b9d726 --- /dev/null +++ b/Plugins/DbSqlite2/package.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?>
+<Package>
+ <DisplayName>SQLite 2 plugin</DisplayName>
+ <Description>Plugin for SQLite 2 databases</Description>
+ <Version>%VERSION%</Version>
+ <ReleaseDate>%DATE%</ReleaseDate>
+ <Name>pl.com.salsoft.sqlitestudio.plugins.dbsqlite2</Name>
+ <Dependencies>pl.com.salsoft.sqlitestudio.plugins</Dependencies>
+ <Default>true</Default>
+</Package>
\ No newline at end of file diff --git a/Plugins/DbSqlite2/queryexecutorsqlite2delete.cpp b/Plugins/DbSqlite2/queryexecutorsqlite2delete.cpp new file mode 100644 index 0000000..95ae98e --- /dev/null +++ b/Plugins/DbSqlite2/queryexecutorsqlite2delete.cpp @@ -0,0 +1,30 @@ +#include "queryexecutorsqlite2delete.h" +#include "db/sqlquery.h" +#include "parser/ast/sqlitedelete.h" + +bool QueryExecutorSqlite2Delete::exec() +{ + if (db->getVersion() != 2) + return true; + + SqliteQueryPtr lastQuery = context->parsedQueries.last(); + + if (!lastQuery) + return true; + + SqliteDeletePtr deleteQuery = lastQuery.dynamicCast<SqliteDelete>(); + if (!deleteQuery) + return true; + + if (!deleteQuery->where) + { + deleteQuery->where = new SqliteExpr(); + deleteQuery->where->setParent(deleteQuery.data()); + deleteQuery->where->mode = SqliteExpr::Mode::LITERAL_VALUE; + deleteQuery->where->literalValue = 1; + } + + deleteQuery->rebuildTokens(); + updateQueries(); + return true; +} diff --git a/Plugins/DbSqlite2/queryexecutorsqlite2delete.h b/Plugins/DbSqlite2/queryexecutorsqlite2delete.h new file mode 100644 index 0000000..5d3f478 --- /dev/null +++ b/Plugins/DbSqlite2/queryexecutorsqlite2delete.h @@ -0,0 +1,24 @@ +#ifndef QUERYEXECUTORSQLITE2DELETE_H +#define QUERYEXECUTORSQLITE2DELETE_H + +#include "db/queryexecutorsteps/queryexecutorstep.h" + +/** + * @brief The QueryExecutorSqlite2Delete class + * + * From SQLite2 documentation: + * + * Because of this optimization, the change count for "DELETE FROM table" will be zero + * regardless of the number of elements that were originally in the table. + * To get an accurate count of the number of rows deleted, use "DELETE FROM table WHERE 1" instead. + * + * This extra step will add "WHERE 1" if there is no WHERE for DELETE query. + * + */ +class QueryExecutorSqlite2Delete : public QueryExecutorStep +{ + public: + bool exec(); +}; + +#endif // QUERYEXECUTORSQLITE2DELETE_H |
