Move cleanup logic to DataStore

This commit is contained in:
Wessel Nieboer 2026-02-06 09:39:26 +01:00 committed by Wessel Nieboer
parent f4c568b615
commit c1a0e3779c
No known key found for this signature in database
GPG key ID: 27BB1C3D63DEEFFF
3 changed files with 37 additions and 29 deletions

View file

@ -569,6 +569,7 @@ bool DataStore::putBlobByKey(const uint8_t key[], int key_len, const uint8_t src
bool DataStore::deleteBlobByKey(const uint8_t key[], int key_len) {
return true; // this is just a stub on NRF52/STM32 platforms
}
void DataStore::cleanOrphanBlobs(DataStoreHost* host) {}
#else
inline void makeBlobPath(const uint8_t key[], int key_len, char* path, size_t path_size) {
char fname[18];
@ -612,7 +613,39 @@ bool DataStore::deleteBlobByKey(const uint8_t key[], int key_len) {
makeBlobPath(key, key_len, path, sizeof(path));
_fs->remove(path);
return true; // return true even if file did not exist
}
void DataStore::cleanOrphanBlobs(DataStoreHost* host) {
if (_fs->exists("/bl/.cleaned")) return;
MESH_DEBUG_PRINTLN("Cleaning orphan blobs...");
File root = openRead("/bl");
if (root) {
for (File f = root.openNextFile(); f; f = root.openNextFile()) {
const char* name = f.name();
f.close();
if (name[0] == '.' || strlen(name) != 16) continue;
uint8_t file_key[8];
if (!mesh::Utils::fromHex(file_key, 8, name)) continue;
bool found = false;
ContactInfo c;
for (uint32_t i = 0; host->getContactForSave(i, c) && !found; i++) {
found = (memcmp(file_key, c.id.pub_key, 8) == 0);
}
if (!found) {
char path[24];
sprintf(path, "/bl/%s", name);
_fs->remove(path);
}
}
root.close();
}
#if defined(ESP32)
File m = _fs->open("/bl/.cleaned", "w", true);
#else
File m = _fs->open("/bl/.cleaned", "w");
#endif
if (m) m.close();
}
#endif

View file

@ -43,6 +43,7 @@ public:
uint8_t getBlobByKey(const uint8_t key[], int key_len, uint8_t dest_buf[]);
bool putBlobByKey(const uint8_t key[], int key_len, const uint8_t src_buf[], uint8_t len);
bool deleteBlobByKey(const uint8_t key[], int key_len);
void cleanOrphanBlobs(DataStoreHost* host);
File openRead(const char* filename);
File openRead(FILESYSTEM* fs, const char* filename);
bool removeFile(const char* filename);

View file

@ -930,34 +930,8 @@ void MyMesh::begin(bool has_display) {
_store->loadContacts(this);
bootstrapRTCfromContacts();
#if defined(ESP32) || defined(RP2040_PLATFORM)
// One-time cleanup of orphan blobs from pre-v1.13 firmware
FILESYSTEM* fs = _store->getPrimaryFS();
if (!fs->exists("/bl/.cleaned")) {
MESH_DEBUG_PRINTLN("Cleaning orphan blobs...");
File root = _store->openRead("/bl");
if (root) {
for (File f = root.openNextFile(); f; f = root.openNextFile()) {
const char* name = f.name();
f.close();
uint8_t key[8];
if (name[0] != '.' && strlen(name) == 16 && mesh::Utils::fromHex(key, 8, name)) {
bool found = false;
for (int i = 0; i < num_contacts && !found; i++)
found = (memcmp(contacts[i].id.pub_key, key, 8) == 0);
if (!found) _store->deleteBlobByKey(key, 8);
}
}
root.close();
}
#if defined(ESP32)
File m = fs->open("/bl/.cleaned", "w", true);
#else
File m = fs->open("/bl/.cleaned", "w");
#endif
if (m) m.close();
}
#endif
_store->cleanOrphanBlobs(this);
addChannel("Public", PUBLIC_GROUP_PSK); // pre-configure Andy's public channel
_store->loadChannels(this);