You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.6 KiB
88 lines
2.6 KiB
#ifndef DB_MANAGER_H |
|
#define DB_MANAGER_H |
|
|
|
#include <sqlite3.h> |
|
#include <QString> |
|
#include <QList> |
|
#include <QObject> |
|
#include <cstdint> |
|
|
|
struct ChannelRow { |
|
QString channelId; |
|
QString name; |
|
bool isDm = false; |
|
QString lastMessage; |
|
qint64 lastMsgAt = 0; |
|
}; |
|
|
|
struct MessageRow { |
|
qint64 id = 0; |
|
QString channelId; |
|
quint64 authorNodeId = 0; |
|
QString content; |
|
QString contentType; |
|
qint64 timestamp = 0; |
|
QByteArray signature; |
|
bool isOutgoing = false; |
|
bool isRead = false; |
|
}; |
|
|
|
struct AccountRow { |
|
quint64 nodeId = 0; |
|
QString displayName; |
|
QString avatarColor; |
|
QString avatarLetter; |
|
bool isContact = true; |
|
}; |
|
|
|
struct NodeAddr { |
|
quint64 nodeId = 0; |
|
int family = 0; // 4=IPv4, 6=IPv6 |
|
QByteArray address; |
|
quint16 port = 0; |
|
}; |
|
|
|
class DbManager : public QObject { |
|
Q_OBJECT |
|
public: |
|
explicit DbManager(const QString& path, QObject* parent = nullptr); |
|
~DbManager() override; |
|
|
|
bool isOpen() const { return m_db != nullptr; } |
|
quint64 myNodeId() const { return m_myNodeId; } |
|
|
|
QList<ChannelRow> getChannels() const; |
|
QList<MessageRow> getMessages(const QString& channelId, int limit = 50) const; |
|
QList<AccountRow> getAccounts(bool contactsOnly = false) const; |
|
AccountRow getAccount(quint64 nodeId) const; |
|
QByteArray getNodeEdPub(quint64 nodeId) const; |
|
|
|
struct BucketMeta { qint64 day; int hour; int count; QByteArray hash; }; |
|
QList<BucketMeta> getBucketMeta(const QString& channelId) const; |
|
void setBucketMeta(const QString& channelId, qint64 day, int hour, |
|
int count, const QByteArray& hash); |
|
QList<QByteArray> getMessageSigs(const QString& channelId, qint64 day, int hour) const; |
|
QList<MessageRow> getMessagesBySigs(const QList<QByteArray>& sigs) const; |
|
QList<quint64> getOnlinePeers() const; |
|
QByteArray getLocalPubkey() const; |
|
QList<NodeAddr> getOnlinePeerAddresses(quint64 excludeNodeId) const; |
|
|
|
void seedStubData(); |
|
|
|
bool insertMessage(const QString& channelId, quint64 authorNodeId, |
|
const QString& content, qint64 timestamp, int isOutgoing); |
|
|
|
QString getUiState(const QString& key) const; |
|
void setUiState(const QString& key, const QString& value); |
|
|
|
private: |
|
void initTables(); |
|
sqlite3_stmt* prepareOrNull(const char* sql) const; |
|
static QString colText(sqlite3_stmt* stmt, int col); |
|
static QByteArray colBlob(sqlite3_stmt* stmt, int col); |
|
|
|
sqlite3* m_db = nullptr; |
|
quint64 m_myNodeId = 0; |
|
}; |
|
|
|
#endif
|
|
|