<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>addons/AVCodec/samples/video2.io2</filename>
    </added>
    <added>
      <filename>addons/CGI/tests/CGITest.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/build.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/depends</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/io/DOConnection.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/io/DOServer.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/samples/DOTest.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/tests/DOTest.io</filename>
    </added>
    <added>
      <filename>addons/DistributedObjects/tests/run.io</filename>
    </added>
    <added>
      <filename>addons/Image/samples/images/lotus_t.jpg</filename>
    </added>
    <added>
      <filename>addons/Image/samples/images/lotus_t.png</filename>
    </added>
    <added>
      <filename>addons/NullAddon/build.io</filename>
    </added>
    <added>
      <filename>addons/NullAddon/depends</filename>
    </added>
    <added>
      <filename>addons/NullAddon/source/IoNullAddon.c</filename>
    </added>
    <added>
      <filename>addons/NullAddon/source/IoNullAddon.h</filename>
    </added>
    <added>
      <filename>addons/Obsidian/build.io</filename>
    </added>
    <added>
      <filename>addons/Obsidian/depends</filename>
    </added>
    <added>
      <filename>addons/Obsidian/io/QStore.io</filename>
    </added>
    <added>
      <filename>addons/Obsidian/protos</filename>
    </added>
    <added>
      <filename>addons/QDBM/tests/testPath.io</filename>
    </added>
    <added>
      <filename>addons/SGML/source/libsgml/Makefile</filename>
    </added>
    <added>
      <filename>addons/SGML/source/libsgml/examples/Makefile</filename>
    </added>
    <added>
      <filename>addons/SGML/source/libsgml/src/Makefile</filename>
    </added>
    <added>
      <filename>addons/Socket/samples/MiniEmailServer.io</filename>
    </added>
    <added>
      <filename>addons/TokyoCabinet/source/IoTokyoCabinetPrefixCursor.c</filename>
    </added>
    <added>
      <filename>addons/TokyoCabinet/source/IoTokyoCabinetPrefixCursor.h</filename>
    </added>
    <added>
      <filename>addons/TokyoCabinet/test.db</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,6 @@
-/*
-//metadoc copyright Steve Dekorte 2002
-*/
-*/
+
+//metadoc Thread copyright Steve Dekorte 2002
+
 
 #ifndef IOTHREAD_DEFINED
 #define IOTHREAD_DEFINED 1</diff>
      <filename>addons/Thread/source/IoThread.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,23 +1,30 @@
 
 TokyoCabinet do(
-	newSlot(&quot;path&quot;, &quot;default.tc&quot;)
-
+	//doc TokyoCabinet path Returns the path of the database file.
+	//doc TokyoCabinet setPath(aPath) Sets the path of the database file. Returns self.
+	path ::= &quot;default.tc&quot;
+	
+	//doc TokyoCabinet _open Private.
 	_open := getSlot(&quot;open&quot;)
 	open := method(p, opt,
 		if(p, setPath(p))
 		if(opt, _open(path, opt), _open(path))
 	)
 
+	//doc TokyoCabinet transactionalAtPut(key, value) Transactionally insert the given key and value. Returns self.
 	transactionalAtPut := method(k, v,
 		self begin
 		self atPut(k, v)
 		self commit
+		self
 	)
 
+	//doc TokyoCabinet transactionalRemoveAt(key) Transactionally remove the given key. Returns self.
 	transactionalRemoveAt := method(k,
 		self begin
 		self removeAt(k)
 		self commit
+		self
 	)
 )
 </diff>
      <filename>addons/TokyoCabinet/io/TokyoCabinet.io</filename>
    </modified>
    <modified>
      <diff>@@ -177,6 +177,7 @@ IoTokyoCabinet *IoTokyoCabinet_proto(void *state)
 	{&quot;close&quot;,     IoTokyoCabinet_close},
 
 	{&quot;atPut&quot;,     IoTokyoCabinet_atPut},
+	{&quot;atAppend&quot;,  IoTokyoCabinet_atAppend},
 	{&quot;at&quot;,        IoTokyoCabinet_at},
 	{&quot;sizeAt&quot;,    IoTokyoCabinet_sizeAt},
 	{&quot;removeAt&quot;,  IoTokyoCabinet_removeAt},
@@ -245,6 +246,8 @@ IoObject *IoTokyoCabinet_open(IoObject *self, IoObject *locals, IoMessage *m)
 	IoSeq *path = IoMessage_locals_seqArgAt_(m, locals, 0);
 	BDBCMP cf = pathCompareFunc;
 
+	IoTokyoCabinet_close(self, locals, m);
+	
 	if(IoMessage_argCount(m) &gt; 1)
 	{
 		IoSeq *compareType = IoMessage_locals_seqArgAt_(m, locals, 1);
@@ -262,7 +265,9 @@ IoObject *IoTokyoCabinet_open(IoObject *self, IoObject *locals, IoMessage *m)
 		}
 	}
 
-	tcbdbsetcmpfunc(TokyoCabinet(self), cf, NULL);
+	//tcbdbsetcmpfunc(TokyoCabinet(self), cf, NULL);
+	
+	IoObject_setDataPointer_(self, tcbdbnew());
 	
 	if(!tcbdbopen(TokyoCabinet(self), CSTRING(path), BDBOWRITER | BDBOCREAT | BDBOLCKNB))
 	{
@@ -393,6 +398,27 @@ IoObject *IoTokyoCabinet_atPut(IoObject *self, IoObject *locals, IoMessage *m)
 	return self;
 }
 
+IoObject *IoTokyoCabinet_atAppend(IoObject *self, IoObject *locals, IoMessage *m)
+{
+	/*doc TokyoCabinet atApple(keySymbol, valueSequence)
+	Appends valueSequence to the current value at keySymbol. Returns self.
+	*/
+
+	IoSeq *key = IoMessage_locals_seqArgAt_(m, locals, 0);
+	IoSeq *value = IoMessage_locals_seqArgAt_(m, locals, 1);
+	int result;
+
+	IOASSERT(TokyoCabinet(self), &quot;invalid TokyoCabinet&quot;);
+
+	result = tcbdbputcat(TokyoCabinet(self), 
+		(const void *)IoSeq_rawBytes(key),  (int)IoSeq_rawSizeInBytes(key), 
+		(const void *)IoSeq_rawBytes(value), (int)IoSeq_rawSizeInBytes(value));
+
+	IOASSERT(result, tcbdberrmsg(tcbdbecode(TokyoCabinet(self))));
+
+	return self;
+}
+
 IoObject *IoTokyoCabinet_at(IoObject *self, IoObject *locals, IoMessage *m)
 {
 	/*doc TokyoCabinet at(keySymbol)</diff>
      <filename>addons/TokyoCabinet/source/IoTokyoCabinet.c</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,7 @@ void IoTokyoCabinet_free(IoObject *self);
 IoObject *IoTokyoCabinet_open(IoObject *self, IoObject *locals, IoMessage *m);
 IoObject *IoTokyoCabinet_close(IoObject *self, IoObject *locals, IoMessage *m);
 IoObject *IoTokyoCabinet_atPut(IoObject *self, IoObject *locals, IoMessage *m);
+IoObject *IoTokyoCabinet_atAppend(IoObject *self, IoObject *locals, IoMessage *m);
 IoObject *IoTokyoCabinet_at(IoObject *self, IoObject *locals, IoMessage *m);
 IoObject *IoTokyoCabinet_sizeAt(IoObject *self, IoObject *locals, IoMessage *m);
 IoObject *IoTokyoCabinet_removeAt(IoObject *self, IoObject *locals, IoMessage *m);</diff>
      <filename>addons/TokyoCabinet/source/IoTokyoCabinet.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,6 @@
 TokyoCabinet
 
 TokyoCabinet := UnitTest clone do(
-	
 	cleanUp := method(
 		File with(&quot;test.db&quot;) remove
 	)</diff>
      <filename>addons/TokyoCabinet/tests/TokyoCabinetTest.io</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,6 @@ ZlibDecoderTest := UnitTest clone do(
         z beginProcessing
         z process
         z endProcessing
-        //z outputBuffer println
         s := &quot;TestSuite clone setPath(System launchPath) run&quot;
         assertTrue(z outputBuffer containsSeq(s))
 	)</diff>
      <filename>addons/Zlib/tests/ZlibTest.io</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>addons/Zlib/tests/test.gz</filename>
    </modified>
    <modified>
      <diff>@@ -431,6 +431,6 @@ AddonBuilder := Object clone do(
 	)
 
 	cleanDocs := method(
-		systemCall(&quot;rm -f io/zzz_docs.io&quot;)
+		systemCall(&quot;rm -f docs/docs.txt&quot;)
 	)
 )</diff>
      <filename>build/AddonBuilder.io</filename>
    </modified>
    <modified>
      <diff>@@ -131,7 +131,7 @@ clean:
 	-rm -rf _build
 
 test:
-	./_build/binaries/io_static$(BINARY_SUFFIX) ../libs/iovm/tests/run.io
+	./_build/binaries/io_static$(BINARY_SUFFIX) ../libs/iovm/tests/run.io || true
 
 docs:
 	./io_static$(BINARY_SUFFIX) _docgen/DocsExtractor.io .</diff>
      <filename>tools/Makefile</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>addons/SQLite/tests/DBMTest.io</filename>
    </removed>
    <removed>
      <filename>addons/SQLite/tests/ZSoupTest.io</filename>
    </removed>
    <removed>
      <filename>addons/Socket/io/DOConnection.io</filename>
    </removed>
    <removed>
      <filename>addons/Socket/io/DOServer.io</filename>
    </removed>
    <removed>
      <filename>addons/Socket/samples/DOTest.io</filename>
    </removed>
    <removed>
      <filename>addons/Socket/tests/DOTest.io</filename>
    </removed>
    <removed>
      <filename>addons/Socket/tests/run.io</filename>
    </removed>
    <removed>
      <filename>addons/TokyoCabinet/docs/docs.txt</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>eecbcf39c4db596ee026e8fd5f6685efe110d7a8</id>
    </parent>
  </parents>
  <author>
    <name>Steve Dekorte</name>
    <email>steve@StevesLaptop.local</email>
  </author>
  <url>http://github.com/stevedekorte/io/commit/8b0095e4b65c96d274a2f36b3d6ca180c4f1592b</url>
  <id>8b0095e4b65c96d274a2f36b3d6ca180c4f1592b</id>
  <committed-date>2008-03-02T14:31:57-08:00</committed-date>
  <authored-date>2008-03-02T14:31:57-08:00</authored-date>
  <message>Moved DistributedObjects to an addon, TokyoCabinet updates, unit test fixes</message>
  <tree>753006a923b568c5afae2a3054569c7bb1542376</tree>
  <committer>
    <name>Steve Dekorte</name>
    <email>steve@StevesLaptop.local</email>
  </committer>
</commit>
