* More remote operations.

* Added new operation hasSubstitutes(), which is more efficient than
  querySubstitutes().size() > 0.
This commit is contained in:
Eelco Dolstra 2006-11-30 22:43:55 +00:00
parent aac547a8b3
commit 0565b5f2b3
12 changed files with 138 additions and 46 deletions

View file

@ -8,6 +8,23 @@
using namespace nix;
Path readStorePath(Source & from)
{
Path path = readString(from);
assertStorePath(path);
return path;
}
PathSet readStorePaths(Source & from)
{
PathSet paths = readStringSet(from);
for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i)
assertStorePath(*i);
return paths;
}
void processConnection(Source & from, Sink & to)
{
store = boost::shared_ptr<StoreAPI>(new LocalStore(true));
@ -35,12 +52,29 @@ void processConnection(Source & from, Sink & to)
break;
case wopIsValidPath: {
Path path = readString(from);
assertStorePath(path);
Path path = readStorePath(from);
writeInt(store->isValidPath(path), to);
break;
}
case wopHasSubstitutes: {
Path path = readStorePath(from);
writeInt(store->hasSubstitutes(path), to);
break;
}
case wopQueryReferences:
case wopQueryReferrers: {
Path path = readStorePath(from);
PathSet paths;
if (op == wopQueryReferences)
store->queryReferences(path, paths);
else
store->queryReferrers(path, paths);
writeStringSet(paths, to);
break;
}
case wopAddToStore: {
/* !!! uberquick hack */
string baseName = readString(from);
@ -55,17 +89,25 @@ void processConnection(Source & from, Sink & to)
case wopAddTextToStore: {
string suffix = readString(from);
string s = readString(from);
unsigned int refCount = readInt(from);
PathSet refs;
while (refCount--) {
Path ref = readString(from);
assertStorePath(ref);
refs.insert(ref);
}
PathSet refs = readStorePaths(from);
writeString(store->addTextToStore(suffix, s, refs), to);
break;
}
case wopBuildDerivations: {
PathSet drvs = readStorePaths(from);
store->buildDerivations(drvs);
writeInt(1, to);
break;
}
case wopEnsurePath: {
Path path = readStorePath(from);
store->ensurePath(path);
writeInt(1, to);
break;
}
default:
throw Error(format("invalid operation %1%") % op);
}