syncbase: switch to /$/ hierarchy separator scheme

For detailed description, see http://v.io/c/15374

MultiPart: 5/5
Change-Id: Iff00e2da688276b5335f28119dab047cb827d4de
diff --git a/dart/lib/src/app.dart b/dart/lib/src/app.dart
index 74d5a58..8ec5313 100644
--- a/dart/lib/src/app.dart
+++ b/dart/lib/src/app.dart
@@ -4,12 +4,14 @@
 
 part of syncbase_client;
 
+// TODO(sadovsky): Add listDatabases method.
 class SyncbaseApp extends NamedResource {
-  SyncbaseApp._internal(_proxy, fullName)
-      : super._internal(_proxy, null, fullName);
+  // NOTE(sadovsky): For the Mojo Syncbase service, we only store names from app
+  // down - i.e. there is no service name.
+  SyncbaseApp._internal(_proxy, relativeName)
+      : super._internal(_proxy, null, relativeName);
 
-  // noSqlDatabase returns the noSqlDatabase with the given relativeName.
-  // relativeName must not contain slashes.
+  // noSqlDatabase returns a noSqlDatabase with the given relativeName.
   SyncbaseNoSqlDatabase noSqlDatabase(String relativeName) {
     return new SyncbaseNoSqlDatabase._internal(_proxy, fullName, relativeName);
   }
diff --git a/dart/lib/src/named_resource.dart b/dart/lib/src/named_resource.dart
index 1eb6f33..23058f9 100644
--- a/dart/lib/src/named_resource.dart
+++ b/dart/lib/src/named_resource.dart
@@ -14,10 +14,8 @@
       mojom.SyncbaseProxy _proxy, String _parentFullName, String relativeName)
       : this._proxy = _proxy,
         this.relativeName = relativeName,
-        this.fullName = (_parentFullName == null ? '' : _parentFullName + '/') +
-            relativeName {
-    if (relativeName.contains('/')) {
-      throw 'relativeName cannot contain "/": $relativeName';
-    }
-  }
+        this.fullName = (_parentFullName == null
+                ? ''
+                : (_parentFullName + '/\$/')) +
+            relativeName {}
 }
diff --git a/dart/lib/src/nosql/database.dart b/dart/lib/src/nosql/database.dart
index d9711dc..e3453d7 100644
--- a/dart/lib/src/nosql/database.dart
+++ b/dart/lib/src/nosql/database.dart
@@ -4,12 +4,12 @@
 
 part of syncbase_client;
 
+// TODO(sadovsky): Add listTables method.
 class SyncbaseNoSqlDatabase extends NamedResource {
   SyncbaseNoSqlDatabase._internal(_proxy, _parentFullName, relativeName)
       : super._internal(_proxy, _parentFullName, relativeName);
 
-  // table returns a table with the given relativeName.  relativeName must not
-  // contain slashes.
+  // table returns a table with the given relativeName.
   SyncbaseTable table(String relativeName) {
     return new SyncbaseTable._internal(_proxy, fullName, relativeName);
   }
diff --git a/dart/lib/src/nosql/row.dart b/dart/lib/src/nosql/row.dart
index 26f1ee3..3eeaecf 100644
--- a/dart/lib/src/nosql/row.dart
+++ b/dart/lib/src/nosql/row.dart
@@ -5,8 +5,11 @@
 part of syncbase_client;
 
 class SyncbaseRow extends NamedResource {
-  SyncbaseRow._internal(_proxy, _parentFullName, relativeName)
-      : super._internal(_proxy, _parentFullName, relativeName);
+  final String key;
+
+  SyncbaseRow._internal(_proxy, _parentFullName, key)
+      : super._internal(_proxy, _parentFullName, key),
+        this.key = key;
 
   Future<bool> exists() async {
     var v = await _proxy.ptr.rowExists(fullName);
diff --git a/dart/lib/src/nosql/table.dart b/dart/lib/src/nosql/table.dart
index f5e447b..619a634 100644
--- a/dart/lib/src/nosql/table.dart
+++ b/dart/lib/src/nosql/table.dart
@@ -8,6 +8,7 @@
   SyncbaseTable._internal(_proxy, _parentFullName, relativeName)
       : super._internal(_proxy, _parentFullName, relativeName);
 
+  // row returns a row with the given key.
   SyncbaseRow row(String key) {
     return new SyncbaseRow._internal(_proxy, fullName, key);
   }
diff --git a/dart/lib/syncbase_client.dart b/dart/lib/syncbase_client.dart
index 3bbb764..bba7982 100644
--- a/dart/lib/syncbase_client.dart
+++ b/dart/lib/syncbase_client.dart
@@ -32,6 +32,7 @@
   return err != null && err.id != '';
 }
 
+// TODO(sadovsky): Add listApps method.
 class SyncbaseClient {
   final mojom.SyncbaseProxy _proxy;
 
@@ -48,7 +49,7 @@
     return _proxy.close(immediate: immediate);
   }
 
-  // app returns the app with the given name, which should not contain slashes.
+  // app returns the app with the given name.
   SyncbaseApp app(String name) => new SyncbaseApp._internal(_proxy, name);
 
   Future<mojom.Perms> getPermissions() async {
diff --git a/mojom/syncbase.mojom b/mojom/syncbase.mojom
index d4004dd..8d4a739 100644
--- a/mojom/syncbase.mojom
+++ b/mojom/syncbase.mojom
@@ -62,6 +62,7 @@
 };
 
 // TODO(sadovsky): Add schema version to all RPCs. See v.io/c/13734.
+// TODO(sadovsky): Add ListApps, ListDatabases, and ListTables methods.
 // All 'name' params are service-relative object names.
 
 // Error handling modeled after: