int PNode_moveToPath_createIfAbsent_(PNode *self, Datum *p, int createIfAbsent, int fromRoot) { int r; Datum *cp = Datum_poolNew(); Datum *np = Datum_poolNew(); Datum_copy_(cp, p); if (fromRoot) PNode_setToRoot(self); do { r = Datum_sepOnChars_with_(cp, "/", np); if (!Datum_isEmpty(cp)) { if (createIfAbsent) { PNode_createMoveToKey_(self, cp); } else { if (PNode_moveToKey_(self, cp)) { return -1; } } } Datum_copy_(cp, np); } while(r != -1); return 0; }
int VertexServer_api_transaction(VertexServer *self) { Datum *uri = Datum_new(); Datum *post = Datum_new(); int error = 0; int r, result; PDB_commit(self->pdb); Datum_copy_(post, HttpRequest_postData(self->httpRequest)); do { Datum_copy_(uri, post); r = Datum_sepOnChars_with_(uri, "\n", post); if (Datum_size(uri) == 0) { VertexServer_setErrorCString_(self, "empty line in transaction"); error = 1; break; } HttpRequest_parseUri_(self->httpRequest, Datum_data(uri)); error = VertexServer_process(self); Pool_globalPoolFreeRefs(); } while ((r != -1) && (!error)); if (error) { PDB_abort(self->pdb); result = -1; } else { PDB_commit(self->pdb); result = 0; } Datum_free(uri); return result; }