aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2015-04-19 22:30:43 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2015-04-19 22:30:43 -0400
commit094918f048c81474b22f9ba2940c96dc4033d753 (patch)
tree2b89c77ad7dc9c55e9ba383f23f9f25b82df358e /SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
parent640fff60ceecde402131937dddb3458f7a003e9c (diff)
parenta308f430f694423064ebc86fd0506c8c6fdb3d93 (diff)
Merge tag 'upstream/3.0.5'
Upstream version 3.0.5 # gpg: Signature made Sun 19 Apr 2015 10:30:41 PM EDT using RSA key ID EBE9BD91 # gpg: Good signature from "Unit 193 <unit193@gmail.com>" # gpg: aka "Unit 193 <unit193@ninthfloor.org>" # gpg: aka "Unit 193 <unit193@ubuntu.com>" # gpg: aka "Unit 193 <unit193@ninthfloor.com>"
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp55
1 files changed, 9 insertions, 46 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp b/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
index 0eaca75..cdf8110 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
@@ -1,8 +1,10 @@
#include "readwritelocker.h"
#include "parser/lexer.h"
+#include "common/utils_sql.h"
#include <QReadWriteLock>
#include <QReadLocker>
#include <QWriteLocker>
+#include <QDebug>
ReadWriteLocker::ReadWriteLocker(QReadWriteLock* lock, Mode mode)
{
@@ -47,57 +49,18 @@ void ReadWriteLocker::init(QReadWriteLock* lock, ReadWriteLocker::Mode mode)
ReadWriteLocker::Mode ReadWriteLocker::getMode(const QString &query, Dialect dialect, bool noLock)
{
- static QStringList readOnlyCommands = {"ANALYZE", "EXPLAIN", "PRAGMA"};
-
if (noLock)
return ReadWriteLocker::NONE;
- TokenList tokens = Lexer::tokenize(query, dialect);
- int keywordIdx = tokens.indexOf(Token::KEYWORD);
-
- if (keywordIdx > -1 && readOnlyCommands.contains(tokens[keywordIdx]->value.toUpper()))
- return ReadWriteLocker::READ;
-
- if (keywordIdx > -1 && tokens[keywordIdx]->value.toUpper() == "WITH")
+ QueryAccessMode queryMode = getQueryAccessMode(query, dialect);
+ switch (queryMode)
{
- bool matched = false;
- bool isSelect = false;
- int depth = 0;
- for (TokenPtr token : tokens)
- {
- switch (token->type)
- {
- case Token::PAR_LEFT:
- depth++;
- break;
- case Token::PAR_RIGHT:
- depth--;
- break;
- case Token::KEYWORD:
- if (depth == 0)
- {
- QString val = token->value.toUpper();
- if (val == "SELECT")
- {
- matched = true;
- isSelect = true;
- }
- else if (val == "DELETE" || val == "UPDATE" || val == "INSERT")
- {
- matched = true;
- }
- }
- break;
- default:
- break;
- }
-
- if (matched)
- break;
- }
- if (isSelect)
+ case QueryAccessMode::READ:
return ReadWriteLocker::READ;
+ case QueryAccessMode::WRITE:
+ return ReadWriteLocker::WRITE;
}
- return ReadWriteLocker::WRITE;
+ qCritical() << "Unhandled query access mode:" << static_cast<int>(queryMode);
+ return ReadWriteLocker::NONE;
}