aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/common/readwritelocker.cpp
blob: cdf8110688f22e7662e3715474a2005ec079d00a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#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)
{
    init(lock, mode);
}

ReadWriteLocker::ReadWriteLocker(QReadWriteLock* lock, const QString& query, Dialect dialect, bool noLock)
{
    init(lock, getMode(query, dialect, noLock));
}

ReadWriteLocker::~ReadWriteLocker()
{
    if (readLocker)
    {
        delete readLocker;
        readLocker = nullptr;
    }

    if (writeLocker)
    {
        delete writeLocker;
        writeLocker = nullptr;
    }
}

void ReadWriteLocker::init(QReadWriteLock* lock, ReadWriteLocker::Mode mode)
{
    switch (mode)
    {
        case ReadWriteLocker::READ:
            readLocker = new QReadLocker(lock);
            break;
        case ReadWriteLocker::WRITE:
            writeLocker = new QWriteLocker(lock);
            break;
        case ReadWriteLocker::NONE:
            // Nothing to lock.
            break;
    }
}

ReadWriteLocker::Mode ReadWriteLocker::getMode(const QString &query, Dialect dialect, bool noLock)
{
    if (noLock)
        return ReadWriteLocker::NONE;

    QueryAccessMode queryMode = getQueryAccessMode(query, dialect);
    switch (queryMode)
    {
        case QueryAccessMode::READ:
            return ReadWriteLocker::READ;
        case QueryAccessMode::WRITE:
            return ReadWriteLocker::WRITE;
    }

    qCritical() << "Unhandled query access mode:" << static_cast<int>(queryMode);
    return ReadWriteLocker::NONE;
}