Skip to content

Commit d5eef7c

Browse files
committed
midb: walk-around incomplete ext files
References: DESK-4124
1 parent c823bae commit d5eef7c

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

exch/midb/mail_engine.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,18 @@ static uint64_t me_get_digest(sqlite3 *psqlite, const char *mid_string,
237237
{
238238
auto dir = cu_get_maildir();
239239
std::string slurp_data;
240-
if (exmdb_client->imapfile_read(dir, "ext", mid_string, &slurp_data)) {
241-
if (!json_from_str(slurp_data.c_str(), digest))
242-
return 0;
243-
} else {
240+
bool have_ext = false;
241+
242+
/* ext files may be absent (only midb generates them) */
243+
if (exmdb_client->imapfile_read(dir, "ext", mid_string, &slurp_data))
244+
if (json_from_str(slurp_data.c_str(), digest) &&
245+
digest.isMember("structure") && digest.isMember("mimes"))
246+
have_ext = true;
247+
if (!have_ext) {
248+
/*
249+
* eml files are generally present, either because http wrote
250+
* it, or midb's me_insert_message wrote it.
251+
*/
244252
if (!exmdb_client->imapfile_read(dir, "eml", mid_string, &slurp_data))
245253
return 0;
246254
MAIL imail;
@@ -1334,7 +1342,15 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13341342
if (e.midstr.size() > 0 &&
13351343
!exmdb_client->imapfile_read(dir, "ext", e.midstr, &djson))
13361344
e.midstr.clear();
1337-
if (e.midstr.empty()) {
1345+
Json::Value digest;
1346+
if (djson.size() > 0) {
1347+
if (!json_from_str(djson.c_str(), digest) ||
1348+
!digest.isMember("structure") || !digest.isMember("mimes")) {
1349+
djson.clear();
1350+
digest = {};
1351+
}
1352+
}
1353+
if (digest.empty()) {
13381354
if (!cu_switch_allocator())
13391355
return;
13401356
if (!exmdb_client->read_message(dir, nullptr, CP_ACP,
@@ -1360,10 +1376,9 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13601376
return;
13611377
}
13621378
cu_switch_allocator();
1363-
Json::Value digest;
13641379
if (imail.make_digest(digest) <= 0)
13651380
return;
1366-
digest["file"] = "";
1381+
digest.removeMember("file");
13671382
djson = json_to_str(digest);
13681383
char guidtxt[GUIDSTR_SIZE]{};
13691384
GUID::random_new().to_str(guidtxt, std::size(guidtxt), 32);
@@ -1386,9 +1401,6 @@ static void me_insert_message(xstmt &stm_insert, uint32_t *puidnext,
13861401
(*puidnext) ++;
13871402
bool b_unsent = e.msg_flags & MSGFLAG_UNSENT;
13881403
bool b_read = e.msg_flags & MSGFLAG_READ;
1389-
Json::Value digest;
1390-
if (!json_from_str(djson.c_str(), digest))
1391-
return;
13921404
djson.clear();
13931405
size_t size = 0;
13941406
me_extract_digest_fields(digest, subject,

0 commit comments

Comments
 (0)