automerge/automerge-c
Jason Kankiewicz f52b9a13f7 Added Doxygen documentation generation.
Renamed `AMDatatype` to `AmDataType`.
Reorganized the `AmDataType` tags.
Renamed `AMfree()` to `AMdestroy()`.
Renamed `AMclone()` to `AMdup()`.
2022-02-24 14:39:38 -05:00
..
cmake Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
img Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
src Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
.gitignore break the ground 2022-02-03 19:43:36 -05:00
automerge.c Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
build.rs rework to return a queriable result 2022-02-22 10:21:45 -05:00
Cargo.toml rework to return a queriable result 2022-02-22 10:21:45 -05:00
cbindgen.toml Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
CMakeLists.txt Added Doxygen documentation generation. 2022-02-24 14:39:38 -05:00
Makefile am_pop and am_pop_value 2022-02-06 18:59:19 -05:00
README.md rework to return a queriable result 2022-02-22 10:21:45 -05:00

Methods we need to support

Basic management

  1. AMcreate()
  2. AMclone(doc)
  3. AMfree(doc)
  4. AMconfig(doc, key, val) // set actor
  5. actor = get_actor(doc)

Transactions

  1. AMpendingOps(doc)
  2. AMcommit(doc, message, time)
  3. AMrollback(doc)

Write

  1. AMset{Map|List}(doc, obj, prop, value)
  2. AMinsert(doc, obj, index, value)
  3. AMpush(doc, obj, value)
  4. AMdel{Map|List}(doc, obj, prop)
  5. AMinc{Map|List}(doc, obj, prop, value)
  6. AMspliceText(doc, obj, start, num_del, text)

Read

  1. AMkeys(doc, obj, heads)
  2. AMlength(doc, obj, heads)
  3. AMvalues(doc, obj, heads)
  4. AMtext(doc, obj, heads)

Sync

  1. AMgenerateSyncMessage(doc, state)
  2. AMreceiveSyncMessage(doc, state, message)
  3. AMinitSyncState()

Save / Load

  1. AMload(data)
  2. AMloadIncremental(doc, data)
  3. AMsave(doc)
  4. AMsaveIncremental(doc)

Low Level Access

  1. AMapplyChanges(doc, changes)
  2. AMgetChanges(doc, deps)
  3. AMgetChangesAdded(doc1, doc2)
  4. AMgetHeads(doc)
  5. AMgetLastLocalChange(doc)
  6. AMgetMissingDeps(doc, heads)

Encode/Decode

  1. AMencodeChange(change)
  2. AMdecodeChange(change)
  3. AMencodeSyncMessage(change)
  4. AMdecodeSyncMessage(change)
  5. AMencodeSyncState(change)
  6. AMdecodeSyncState(change)

Open Question - Memory management

Most of these calls return one or more items of arbitrary length. Doing memory management in C is tricky. This is my proposed solution...

  // returns 1 or zero opids
  n = automerge_set(doc, "_root", "hello", datatype, value);
  if (n) {
    automerge_pop(doc, &obj, len);
  }

  // returns n values
  n = automerge_values(doc, "_root", "hello");
  for (i = 0; i<n ;i ++) {
    automerge_pop_value(doc, &value, &datatype, len);
  }

There would be one pop method per object type. Users allocs and frees the buffers. Multiple return values would result in multiple pops. Too small buffers would error and allow retry.

Formats

Actors - We could do (bytes,len) or a hex encoded string?.
ObjIds - We could do flat bytes of the ExId struct but lets do human readable strings for now - the struct would be faster but opque Heads - Might as well make it a flat buffer (n, hash, hash, ...) Changes - Put them all in a flat concatenated buffer Encode/Decode - to json strings?