summaryrefslogtreecommitdiff
path: root/src/database/database.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-26 13:36:07 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-26 13:36:07 +1000
commit4d99d22e10a3cb2a421da1618c127128816613c9 (patch)
tree527490a466348e5cf40cf10a8f3768aa5be4e7c1 /src/database/database.cpp
parentf6d06421090f88094aba76b72b04d614f54efafa (diff)
downloadtangara-fw-4d99d22e10a3cb2a421da1618c127128816613c9.tar.gz
std::string -> std::pmr::string in psram
Diffstat (limited to 'src/database/database.cpp')
-rw-r--r--src/database/database.cpp74
1 files changed, 39 insertions, 35 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp
index d73ce771..fd0e50c1 100644
--- a/src/database/database.cpp
+++ b/src/database/database.cpp
@@ -31,6 +31,7 @@
#include "env_esp.hpp"
#include "event_queue.hpp"
#include "file_gatherer.hpp"
+#include "memory_resource.hpp"
#include "records.hpp"
#include "result.hpp"
#include "tag_parser.hpp"
@@ -195,7 +196,7 @@ auto Database::Update() -> std::future<void> {
events::Ui().Dispatch(event::UpdateProgress{
.stage = event::UpdateProgress::Stage::kScanningForNewTracks,
});
- file_gatherer_.FindFiles("", [&](const std::string& path) {
+ file_gatherer_.FindFiles("", [&](const std::pmr::string& path) {
TrackTags tags;
if (!tag_parser_.ReadAndParseTags(path, &tags) ||
tags.encoding() == Container::kUnsupported) {
@@ -252,9 +253,9 @@ auto Database::Update() -> std::future<void> {
}
auto Database::GetTrackPath(TrackId id)
- -> std::future<std::optional<std::string>> {
- return worker_task_->Dispatch<std::optional<std::string>>(
- [=, this]() -> std::optional<std::string> {
+ -> std::future<std::optional<std::pmr::string>> {
+ return worker_task_->Dispatch<std::optional<std::pmr::string>>(
+ [=, this]() -> std::optional<std::pmr::string> {
auto track_data = dbGetTrackData(id);
if (track_data) {
return track_data->filepath();
@@ -362,14 +363,14 @@ auto Database::GetTracks(std::size_t page_size) -> std::future<Result<Track>*> {
}
auto Database::GetDump(std::size_t page_size)
- -> std::future<Result<std::string>*> {
- return worker_task_->Dispatch<Result<std::string>*>(
- [=, this]() -> Result<std::string>* {
- Continuation<std::string> c{.prefix = "",
- .start_key = "",
- .forward = true,
- .was_prev_forward = true,
- .page_size = page_size};
+ -> std::future<Result<std::pmr::string>*> {
+ return worker_task_->Dispatch<Result<std::pmr::string>*>(
+ [=, this]() -> Result<std::pmr::string>* {
+ Continuation<std::pmr::string> c{.prefix = "",
+ .start_key = "",
+ .forward = true,
+ .was_prev_forward = true,
+ .page_size = page_size};
return dbGetPage(c);
});
}
@@ -385,8 +386,9 @@ template auto Database::GetPage<Track>(Continuation<Track>* c)
-> std::future<Result<Track>*>;
template auto Database::GetPage<IndexRecord>(Continuation<IndexRecord>* c)
-> std::future<Result<IndexRecord>*>;
-template auto Database::GetPage<std::string>(Continuation<std::string>* c)
- -> std::future<Result<std::string>*>;
+template auto Database::GetPage<std::pmr::string>(
+ Continuation<std::pmr::string>* c)
+ -> std::future<Result<std::pmr::string>*>;
auto Database::dbMintNewTrackId() -> TrackId {
TrackId next_id = 1;
@@ -466,7 +468,7 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
// Work out our starting point. Sometimes this will already done.
std::unique_ptr<leveldb::Iterator> it{
db_->NewIterator(leveldb::ReadOptions{})};
- it->Seek(c.start_key);
+ it->Seek({c.start_key.data(), c.start_key.size()});
// Fix off-by-one if we just changed direction.
if (c.forward != c.was_prev_forward) {
@@ -478,10 +480,10 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
}
// Grab results.
- std::optional<std::string> first_key;
+ std::optional<std::pmr::string> first_key;
std::vector<T> records;
while (records.size() < c.page_size && it->Valid()) {
- if (!it->key().starts_with(c.prefix)) {
+ if (!it->key().starts_with({c.prefix.data(), c.prefix.size()})) {
break;
}
if (!first_key) {
@@ -498,7 +500,8 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
}
}
- if (!it->Valid() || !it->key().starts_with(c.prefix)) {
+ if (!it->Valid() ||
+ !it->key().starts_with({c.prefix.data(), c.prefix.size()})) {
it.reset();
}
@@ -512,7 +515,8 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
if (c.forward) {
if (it != nullptr) {
// We were going forward, and now we want the next page.
- std::string key = it->key().ToString();
+ std::pmr::string key{it->key().data(), it->key().size(),
+ &memory::kSpiRamResource};
next_page = Continuation<T>{
.prefix = c.prefix,
.start_key = key,
@@ -549,7 +553,8 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
} else {
if (it != nullptr) {
// We were going backwards, and we still want to go backwards.
- std::string key = it->key().ToString();
+ std::pmr::string key{it->key().data(), it->key().size(),
+ &memory::kSpiRamResource};
prev_page = Continuation<T>{
.prefix = c.prefix,
.start_key = key,
@@ -566,8 +571,8 @@ auto Database::dbGetPage(const Continuation<T>& c) -> Result<T>* {
template auto Database::dbGetPage<Track>(const Continuation<Track>& c)
-> Result<Track>*;
-template auto Database::dbGetPage<std::string>(
- const Continuation<std::string>& c) -> Result<std::string>*;
+template auto Database::dbGetPage<std::pmr::string>(
+ const Continuation<std::pmr::string>& c) -> Result<std::pmr::string>*;
template <>
auto Database::ParseRecord<IndexRecord>(const leveldb::Slice& key,
@@ -578,7 +583,7 @@ auto Database::ParseRecord<IndexRecord>(const leveldb::Slice& key,
return {};
}
- std::optional<std::string> title;
+ std::optional<std::pmr::string> title;
if (!val.empty()) {
title = val.ToString();
}
@@ -602,43 +607,42 @@ auto Database::ParseRecord<Track>(const leveldb::Slice& key,
}
template <>
-auto Database::ParseRecord<std::string>(const leveldb::Slice& key,
- const leveldb::Slice& val)
- -> std::optional<std::string> {
+auto Database::ParseRecord<std::pmr::string>(const leveldb::Slice& key,
+ const leveldb::Slice& val)
+ -> std::optional<std::pmr::string> {
std::ostringstream stream;
stream << "key: ";
if (key.size() < 3 || key.data()[1] != '\0') {
stream << key.ToString().c_str();
} else {
- std::string str = key.ToString();
- for (size_t i = 0; i < str.size(); i++) {
+ for (size_t i = 0; i < key.size(); i++) {
if (i == 0) {
- stream << str[i];
+ stream << key.data()[i];
} else if (i == 1) {
stream << " / 0x";
} else {
stream << std::hex << std::setfill('0') << std::setw(2)
- << static_cast<int>(str[i]);
+ << static_cast<int>(key.data()[i]);
}
}
}
if (!val.empty()) {
stream << "\tval: 0x";
- std::string str = val.ToString();
for (int i = 0; i < val.size(); i++) {
stream << std::hex << std::setfill('0') << std::setw(2)
- << static_cast<int>(str[i]);
+ << static_cast<int>(val.data()[i]);
}
}
- return stream.str();
+ std::pmr::string res{stream.str(), &memory::kSpiRamResource};
+ return res;
}
IndexRecord::IndexRecord(const IndexKey& key,
- std::optional<shared_string> title,
+ std::optional<std::pmr::string> title,
std::optional<TrackId> track)
: key_(key), override_text_(title), track_(track) {}
-auto IndexRecord::text() const -> std::optional<shared_string> {
+auto IndexRecord::text() const -> std::optional<std::pmr::string> {
if (override_text_) {
return override_text_;
}