diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h index 11107c480a2f5d2e2d05d004d5d0a6c78cb9a274..0189f07872003d1987da563030b091edb10d374e 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h @@ -300,6 +300,7 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ _payload->set(_key, new_entry); return *this; } + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const PayloadEntryProxy& otherproxy); //IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const std::string& value); //IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const char* value); diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc index 3ffcebc35a8e1e46315af1637d34f1933a6a9b3a..f328cbcfee005bdbd45dd7d2cfba36746b3c4f3c 100644 --- a/ipaacalib/cpp/src/ipaaca-json.cc +++ b/ipaacalib/cpp/src/ipaaca-json.cc @@ -39,6 +39,42 @@ using namespace rapidjson; using namespace std; +int json_testbed_main(int argc, char** argv) +{ + std::string json_source("[\"old\",2,3,4]"); + ipaaca::PayloadDocumentEntry::ptr entry = ipaaca::PayloadDocumentEntry::from_json_string_representation(json_source); + + std::string newinner("{\"K\":\"V\"}"); + ipaaca::PayloadDocumentEntry::ptr entrynew = ipaaca::PayloadDocumentEntry::from_json_string_representation(newinner); + + ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create(); + iu->add_fake_payload_item("a", entry); + iu->add_fake_payload_item("b", entrynew); + + auto proxy = iu->payload()["a"][3]; + std::cout << proxy << std::endl; + + std::cout << "IU payload before: " << iu->payload() << std::endl; + std::cout << "Entry before: " << entry << std::endl; + std::cout << "EntryNew before: " << entrynew << std::endl; + + /* + proxy.json_value->CopyFrom(entrynew->document, proxy.document_entry->document.GetAllocator()); + proxy.document_entry->update_json_source(); + */ + proxy = iu->payload()["b"]; + + std::cout << "Newly written part: " << iu->payload()["a"][3] << std::endl; + iu->payload()["a"][3]["addkey"] = "addvalue"; + + std::cout << "IU payload after: " << iu->payload() << std::endl; + std::cout << "Entry after: " << entry << std::endl; + std::cout << "EntryNew after: " << entrynew << std::endl; + + return 0; +} + + int fakeiu_main(int argc, char** argv) { //if (argc<2) { @@ -254,7 +290,8 @@ int main(int argc, char** argv) ipaaca::CommandLineParser::ptr parser = ipaaca::CommandLineParser::create(); ipaaca::CommandLineOptions::ptr options = parser->parse(argc, argv); - return legacy_iu_main(argc, argv); + return json_testbed_main(argc, argv); + //return legacy_iu_main(argc, argv); //return fakeiu_main(argc, argv); //return iu_main(argc, argv); } diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc index fb4514112d550f6e63c21a97e6f3573392b9b673..bb9e5a1c60f29cd282444d724962d04d927845ae 100644 --- a/ipaacalib/cpp/src/ipaaca-payload.cc +++ b/ipaacalib/cpp/src/ipaaca-payload.cc @@ -454,6 +454,19 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](int addr_idx_) return operator[]((size_t) addr_idx_); } +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const PayloadEntryProxy& otherproxy) +{ + PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required + rapidjson::Value& newval = new_entry->get_or_create_nested_value_from_proxy_path(this); + auto valueptr = otherproxy.json_value; + if (valueptr) { // only set if value is valid, keep default null value otherwise + newval.CopyFrom(*valueptr, new_entry->document.GetAllocator()); + } + new_entry->update_json_source(); + _payload->set(_key, new_entry); + return *this; +} + /* IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value) {