summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/btree/qt/qbtreetxn.cpp
blob: 2d53fa8ceee5d4e769e8af120d40e67bc5f27f4d (plain)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <QDebug>
#include <errno.h>
#include "btree.h"
#include "qbtree.h"
#include "qbtreetxn.h"

QBtreeTxn::QBtreeTxn(QBtree *btree, btree_txn *txn)
    : mBtree(btree), mTxn(txn)
{
    Q_ASSERT(mBtree && mTxn);
}

QBtreeTxn::~QBtreeTxn()
{
    Q_ASSERT(mTxn && mBtree);
}

bool QBtreeTxn::commit(quint32 tag)
{
    if (isReadOnly()) {
        qWarning() << "QBtreeTxn::commit:" << "commiting read only txn doesn't make sense. Aborting instead";
        mBtree->abort(this);
        return true;
    }
    return mBtree->commit(this, tag);
}

void QBtreeTxn::abort()
{
    mBtree->abort(this);
}

quint32 QBtreeTxn::tag() const
{
    return btree_txn_get_tag(mTxn);
}

bool QBtreeTxn::get(const QByteArray &baKey, QByteArray *baValue) const
{
    Q_ASSERT(baValue);
    QBtreeData value;
    bool ret = get(baKey.constData(), baKey.size(), &value);
    *baValue = value.toByteArray();
    return ret;
}

bool QBtreeTxn::get(const QBtreeData &key, QBtreeData *value) const
{
    return get(key.constData(), key.size(), value);
}

bool QBtreeTxn::get(const char *key, int keySize, QBtreeData *value) const
{
    Q_ASSERT(value);
    struct btval btkey;
    btkey.data = (void *)key;
    btkey.size = keySize;
    btkey.free_data = 0;
    btkey.mp = 0;

    struct btval btvalue;
    int ok = btree_txn_get(mBtree->handle(), mTxn, &btkey, &btvalue);
    if (ok != BT_SUCCESS)
        return false;
    *value = QBtreeData(&btvalue);
    return true;
}

bool QBtreeTxn::put(const QByteArray &baKey, const QByteArray &baValue)
{
    return put(baKey.constData(), baKey.size(), baValue.constData(), baValue.size());
}

bool QBtreeTxn::put(const QBtreeData &key, const QBtreeData &value)
{
    return put(key.constData(), key.size(), value.constData(), value.size());
}

bool QBtreeTxn::put(const char *key, int keySize, const char *value, int valueSize)
{
    struct btval btkey;
    btkey.data = (void *)key;
    btkey.size = keySize;
    btkey.free_data = 0;
    btkey.mp = 0;
    struct btval btvalue;
    btvalue.data = (void *)value;
    btvalue.size = valueSize;
    btvalue.free_data = 0;
    btvalue.mp = 0;

    int ok = btree_txn_put(mBtree->handle(), mTxn, &btkey, &btvalue, 0);
    if (btree_txn_is_error(mTxn))
        qDebug() << "btree_txn_put" << ok << errno << endl << mBtree->fileName();
    return ok == BT_SUCCESS;
}

bool QBtreeTxn::remove(const QByteArray &baKey)
{
    return remove(baKey.constData(), baKey.size());
}

bool QBtreeTxn::remove(const QBtreeData &key)
{
    return remove(key.constData(), key.size());
}

bool QBtreeTxn::remove(const char *key, int keySize)
{
    struct btval btkey;
    btkey.data = (void *)key;
    btkey.size = keySize;
    btkey.free_data = 0;
    btkey.mp = 0;

    int ok = btree_txn_del(mBtree->handle(), mTxn, &btkey, 0);
    if (btree_txn_is_error(mTxn))
        qDebug() << "btree_txn_del" << ok << errno << endl << mBtree->fileName();
    return ok == BT_SUCCESS;
}

bool QBtreeTxn::isReadOnly() const
{
    Q_ASSERT(mTxn);
    return btree_txn_is_read(mTxn) == 1;
}

bool QBtreeTxn::isReadWrite() const
{
    Q_ASSERT(mTxn);
    return btree_txn_is_read(mTxn) == 0;
}