aboutsummaryrefslogtreecommitdiff
path: root/zenserver/projectstore.cpp
diff options
context:
space:
mode:
authorMartin Ridgers <[email protected]>2021-09-15 09:22:32 +0200
committerMartin Ridgers <[email protected]>2021-09-15 09:23:33 +0200
commit8f5e773529858223beeecf5d1b69c23991df644e (patch)
tree2c360c67e028f5ecd7368212b0adf8b23578ff9d /zenserver/projectstore.cpp
parentUse zen::Sleep() in timer.cpp's tests (diff)
parentUpdated function service to new package management API (diff)
downloadzen-8f5e773529858223beeecf5d1b69c23991df644e.tar.xz
zen-8f5e773529858223beeecf5d1b69c23991df644e.zip
Merge main
Diffstat (limited to 'zenserver/projectstore.cpp')
-rw-r--r--zenserver/projectstore.cpp123
1 files changed, 74 insertions, 49 deletions
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp
index 006796b28..2bbc1dce3 100644
--- a/zenserver/projectstore.cpp
+++ b/zenserver/projectstore.cpp
@@ -542,8 +542,30 @@ ProjectStore::Oplog::AppendNewOplogEntry(CbPackage OpPackage)
for (const auto& Attach : Attachments)
{
- IoBuffer AttachmentData = Attach.AsBinary().AsIoBuffer();
- CasStore::InsertResult Result = m_CasStore.InsertChunk(AttachmentData, Attach.GetHash());
+ IoBuffer AttachmentData;
+
+ if (Attach.IsBinary())
+ {
+ AttachmentData = Attach.AsBinary().AsIoBuffer();
+ }
+ else if (Attach.IsCompressedBinary())
+ {
+ ZEN_NOT_IMPLEMENTED("Compressed binary attachments are currently not supported for oplogs");
+
+ AttachmentData = Attach.AsCompressedBinary().GetCompressed().Flatten().AsIoBuffer();
+ }
+ else if (Attach.IsObject())
+ {
+ AttachmentData = Attach.AsObject().GetBuffer().AsIoBuffer();
+ }
+ else
+ {
+ ZEN_NOT_IMPLEMENTED("Unknown attachment type");
+ }
+
+ ZEN_ASSERT(AttachmentData);
+
+ CasStore::InsertResult Result = m_CasStore.InsertChunk(AttachmentData, Attach.GetHash());
const uint64_t AttachmentSize = AttachmentData.Size();
@@ -909,7 +931,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
// Parse Request
@@ -940,7 +962,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (Payload.Size() <= sizeof(RequestHeader))
{
- HttpReq.WriteResponse(HttpResponse::BadRequest);
+ HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
RequestHeader RequestHdr;
@@ -948,7 +970,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (RequestHdr.Magic != RequestHeader::kMagic)
{
- HttpReq.WriteResponse(HttpResponse::BadRequest);
+ HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
std::vector<RequestChunkEntry> RequestedChunks;
@@ -1004,9 +1026,9 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
ResponsePtr += sizeof(ResponseHdr);
for (uint32_t ChunkIndex = 0; ChunkIndex < RequestHdr.ChunkCount; ++ChunkIndex)
{
- //const RequestChunkEntry& RequestedChunk = RequestedChunks[ChunkIndex];
- const IoBuffer& FoundChunk(OutBlobs[ChunkIndex + 1]);
- ResponseChunkEntry ResponseChunk;
+ // const RequestChunkEntry& RequestedChunk = RequestedChunks[ChunkIndex];
+ const IoBuffer& FoundChunk(OutBlobs[ChunkIndex + 1]);
+ ResponseChunkEntry ResponseChunk;
ResponseChunk.CorrelationId = ChunkIndex;
if (FoundChunk)
{
@@ -1020,7 +1042,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
ResponsePtr += sizeof(ResponseChunk);
}
- return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, OutBlobs);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, OutBlobs);
},
HttpVerb::kPost);
@@ -1038,7 +1060,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
ProjectStore::Oplog& Log = *FoundLog;
@@ -1063,7 +1085,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
Response.EndArray();
- return HttpReq.WriteResponse(HttpResponse::OK, Response.Save());
+ return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save());
},
HttpVerb::kGet);
@@ -1080,7 +1102,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
ProjectStore::Oplog& Log = *FoundLog;
@@ -1093,10 +1115,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
{
CbObjectWriter Response;
Response << "size" << Value.Size();
- return HttpReq.WriteResponse(HttpResponse::OK, Response.Save());
+ return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save());
}
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
},
HttpVerb::kGet);
@@ -1124,7 +1146,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
else
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest);
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
}
@@ -1137,7 +1159,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
else
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest);
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
}
@@ -1147,7 +1169,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
ProjectStore::Oplog& Log = *FoundLog;
@@ -1162,7 +1184,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
case HttpVerb::kGet:
if (!Value)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
if (Verb == HttpVerb::kHead)
@@ -1185,10 +1207,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
// Send only a subset of data
IoBuffer InnerValue(Value, Offset, Size);
- return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, InnerValue);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, InnerValue);
}
- return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, Value);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Value);
}
},
HttpVerb::kGet | HttpVerb::kHead);
@@ -1217,7 +1239,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
else
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest);
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
}
@@ -1230,7 +1252,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
else
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest);
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
}
@@ -1240,7 +1262,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
IoBuffer Value = m_CasStore.FindChunk(Hash);
if (!Value)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
if (IsOffset)
@@ -1258,10 +1280,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
// Send only a subset of data
IoBuffer InnerValue(Value, Offset, Size);
- return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, InnerValue);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, InnerValue);
}
- return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, Value);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Value);
},
HttpVerb::kGet);
@@ -1277,7 +1299,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
// This operation takes a list of referenced hashes and decides which
@@ -1312,7 +1334,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
Cbo.EndArray();
CbObject Response = Cbo.Save();
- return HttpReq.WriteResponse(HttpResponse::OK, Response);
+ return HttpReq.WriteResponse(HttpResponseCode::OK, Response);
},
HttpVerb::kPost);
@@ -1340,7 +1362,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
ProjectStore::Oplog& Log = *FoundLog;
@@ -1387,23 +1409,26 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
};
CbPackage Package;
- if (!Package.TryLoad(Payload, &UniqueBuffer::Alloc, &Resolver))
+
+ if (!legacy::TryLoadCbPackage(Package, Payload, &UniqueBuffer::Alloc, &Resolver))
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest, HttpContentType::kText, "Invalid package");
+ m_Log.error("Received malformed package!");
+
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid package");
}
if (!IsValid)
{
// TODO: emit diagnostics identifying missing chunks
- return HttpReq.WriteResponse(HttpResponse::NotFound, HttpContentType::kText, "Missing chunk reference");
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "Missing chunk reference");
}
CbObject Core = Package.GetObject();
if (!Core["key"sv])
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest, HttpContentType::kText, "No oplog entry key specified");
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "No oplog entry key specified");
}
// Write core to oplog
@@ -1412,12 +1437,12 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (OpLsn == ProjectStore::Oplog::kInvalidOp)
{
- return HttpReq.WriteResponse(HttpResponse::BadRequest);
+ return HttpReq.WriteResponse(HttpResponseCode::BadRequest);
}
m_Log.info("new op #{:4} - {}/{} ({:>6}) {}", OpLsn, ProjectId, OplogId, NiceBytes(Payload.Size()), Core["key"sv].AsString());
- HttpReq.WriteResponse(HttpResponse::Created);
+ HttpReq.WriteResponse(HttpResponseCode::Created);
},
HttpVerb::kPost);
@@ -1428,7 +1453,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
// TODO: look up op and respond with the payload!
- HttpReq.WriteResponse(HttpResponse::Accepted, HttpContentType::kText, u8"yeee"sv);
+ HttpReq.WriteResponse(HttpResponseCode::Accepted, HttpContentType::kText, u8"yeee"sv);
},
HttpVerb::kGet);
@@ -1444,7 +1469,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (!ProjectIt)
{
- return Req.ServerRequest().WriteResponse(HttpResponse::NotFound,
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound,
HttpContentType::kText,
"project {} not found"_format(ProjectId));
}
@@ -1459,7 +1484,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (!OplogIt)
{
- return Req.ServerRequest().WriteResponse(HttpResponse::NotFound,
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound,
HttpContentType::kText,
"oplog {} not found in project {}"_format(OplogId, ProjectId));
}
@@ -1469,7 +1494,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
CbObjectWriter Cb;
Cb << "id"sv << Log.OplogId() << "project"sv << Prj.Identifier << "tempdir"sv << Log.TempDir();
- Req.ServerRequest().WriteResponse(HttpResponse::OK, Cb.Save());
+ Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Cb.Save());
}
break;
@@ -1482,18 +1507,18 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (!Prj.NewOplog(OplogId))
{
// TODO: indicate why the operation failed!
- return Req.ServerRequest().WriteResponse(HttpResponse::InternalServerError);
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::InternalServerError);
}
m_Log.info("established oplog {} / {}", ProjectId, OplogId);
- return Req.ServerRequest().WriteResponse(HttpResponse::Created);
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::Created);
}
// I guess this should ultimately be used to execute RPCs but for now, it
// does absolutely nothing
- return Req.ServerRequest().WriteResponse(HttpResponse::BadRequest);
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest);
}
break;
@@ -1503,7 +1528,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
ProjectIt->DeleteOplog(OplogId);
- return Req.ServerRequest().WriteResponse(HttpResponse::OK);
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::OK);
}
break;
}
@@ -1522,7 +1547,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (FoundLog == nullptr)
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
CbObjectWriter Response;
@@ -1542,7 +1567,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
else
{
- return HttpReq.WriteResponse(HttpResponse::NotFound);
+ return HttpReq.WriteResponse(HttpResponseCode::NotFound);
}
}
else
@@ -1555,7 +1580,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
}
}
- return HttpReq.WriteResponse(HttpResponse::OK, Response.Save());
+ return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save());
},
HttpVerb::kGet);
@@ -1585,7 +1610,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
EngineRoot,
ProjectRoot);
- Req.ServerRequest().WriteResponse(HttpResponse::Created);
+ Req.ServerRequest().WriteResponse(HttpResponseCode::Created);
}
break;
@@ -1595,7 +1620,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (!ProjectIt)
{
- return Req.ServerRequest().WriteResponse(HttpResponse::NotFound,
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound,
HttpContentType::kText,
"project {} not found"_format(ProjectId));
}
@@ -1609,7 +1634,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
Prj.IterateOplogs([&](const ProjectStore::Oplog& I) { Response << "id"sv << I.OplogId(); });
Response.EndArray(); // oplogs
- Req.ServerRequest().WriteResponse(HttpResponse::OK, Response.Save());
+ Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response.Save());
}
break;
@@ -1619,7 +1644,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects)
if (!ProjectIt)
{
- return Req.ServerRequest().WriteResponse(HttpResponse::NotFound,
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound,
HttpContentType::kText,
"project {} not found"_format(ProjectId));
}