Files
MuditaOS/module-db/Interface/ThreadRecord.cpp
pholat 23df384c55 EGD-3087 SMS Search implemented (#374)
* EGD-3087 WIP adding SMS Querry

* EGD-3087 Added query virtual interface on Service top layer

Service shouldn't implement query logic and should be proxying that.

additionally:
- small fixes in includes
- shared service db name same way as apps and event manager

* EGD-3087 Query - want to work on interface not on db

* EGD-3087 Query gluecode works fine. Our query in SMS search calls getBySMSQuery

Changes cut off before any potential orm interface layer

* EGD-3087 WIP Interface in use

* EGD-3087 Query for SMS search works as designed

* EGD-3087 Query results should be on screen

* EGD-3087 BUG workaround - need to deep refresh display to show data

* EGD-3087 Searching for text from input works fine

* EGD-3087 Showing results / or empty results depending on query

* EGD-3087 Pre PR fixups

* EGD-3087 Empty search - getting back to prewious window ignore current

* EGD-3087 PR applied

* EGD-3087 PR - style fixed

* EGD-3087 Review - DB ListView handling moved to separate function

* EGD-3087 Workaround: crash on use after free fix

* EGD-3087 PR stylistic changes

* EGD-3087 PR cleanup applied

* EGD-3087 Added test for Query interface

* EGD-3087 renamed getByQuery to getQuery & finished tests

* EGD-3087 Post rebase fixup

* EGD-3087 PR - moved ListView request part to separate function

* EGD-3087 PR Fixups

* EGD-3087 Post rebase style fix

* EGD-3087 Added variable for DB service stack & const to getter function
2020-05-27 13:49:50 +02:00

145 lines
4.4 KiB
C++

/*
* @file ThreadRecord.cpp
* @author Mateusz Piesta (mateusz.piesta@mudita.com)
* @date 29.05.19
* @brief
* @copyright Copyright (C) 2019 mudita.com
* @details
*/
#include "ThreadRecord.hpp"
#include "SMSRecord.hpp"
#include "queries/sms/QuerySMSSearch.hpp"
#include <cassert>
#include <log/log.hpp>
ThreadRecordInterface::ThreadRecordInterface(SmsDB *smsDb, ContactsDB *contactsDb)
: smsDB(smsDb), contactsDB(contactsDb)
{}
ThreadRecordInterface::~ThreadRecordInterface()
{}
bool ThreadRecordInterface::Add(const ThreadRecord &rec)
{
auto ret = smsDB->threads.Add(ThreadsTableRow{.date = rec.date,
.msgCount = rec.msgCount,
.msgRead = rec.msgRead,
.contactID = rec.contactID,
.snippet = rec.snippet,
.type = rec.type
});
return ret;
}
bool ThreadRecordInterface::RemoveByID(uint32_t id)
{
auto ret = smsDB->threads.RemoveByID(id);
if (ret == false) {
return false;
}
SMSRecordInterface smsRecordInterface(smsDB, contactsDB);
return smsRecordInterface.RemoveByField(SMSRecordField::ThreadID, std::to_string(id).c_str());
}
bool ThreadRecordInterface::Update(const ThreadRecord &rec)
{
return smsDB->threads.Update(ThreadsTableRow{.ID = rec.dbID,
.date = rec.date,
.msgCount = rec.msgCount,
.msgRead = rec.msgRead,
.contactID = rec.contactID,
.snippet = rec.snippet,
.type = rec.type
});
}
uint32_t ThreadRecordInterface::GetCount()
{
return smsDB->threads.GetCount();
}
std::unique_ptr<std::vector<ThreadRecord>> ThreadRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit)
{
auto records = std::make_unique<std::vector<ThreadRecord>>();
auto ret = smsDB->threads.GetLimitOffset(offset, limit);
for (const auto &w : ret) {
records->push_back(w);
}
return records;
}
std::unique_ptr<std::vector<ThreadRecord>> ThreadRecordInterface::GetLimitOffsetByField(uint32_t offset,
uint32_t limit,
ThreadRecordField field,
const char *str)
{
auto records = std::make_unique<std::vector<ThreadRecord>>();
switch (field) {
case ThreadRecordField::ContactID: {
auto ret = smsDB->threads.GetLimitOffsetByField(offset, limit, ThreadsTableFields::ContactID, str);
for (const auto &w : ret) {
records->push_back(w);
}
} break;
}
return records;
}
ThreadRecord ThreadRecordInterface::GetByID(uint32_t id)
{
auto rec = smsDB->threads.GetByID(id);
if (rec.ID == 0) {
return ThreadRecord();
}
return ThreadRecord(rec);
}
ThreadRecord ThreadRecordInterface::GetByContact(uint32_t contact_id)
{
auto ret =
smsDB->threads.GetLimitOffsetByField(0, 1, ThreadsTableFields::ContactID, std::to_string(contact_id).c_str());
if (ret.size() == 0) {
ThreadRecord re;
re.contactID = contact_id;
if (!Add(re)) {
LOG_ERROR("There is no thread but we cant add it");
assert(0);
}
ret = smsDB->threads.GetLimitOffsetByField(
0, 1, ThreadsTableFields::ContactID, std::to_string(contact_id).c_str());
}
ThreadRecord a = ret[0];
return a;
}
std::unique_ptr<db::QueryResult> ThreadRecordInterface::runQuery(const db::Query *query)
{
if (const auto local_query = dynamic_cast<const db::query::SMSSearch *>(query)) {
return runQueryImpl(local_query);
}
return nullptr;
}
std::unique_ptr<db::query::SMSSearchResult> ThreadRecordInterface::runQueryImpl(const db::query::SMSSearch *query)
{
auto db_result = smsDB->threads.getBySMSQuery(query->text, query->starting_postion, query->depth);
return std::make_unique<db::query::SMSSearchResult>(db_result.first, db_result.second);
}